[2/2] Extend recognized types of SDT probe's arguments
Commit Message
This commit is actually an update to make the parser in
gdb/stap-probe.c be aware of all the possible prefixes that a probe
argument can have. According to the section "Argument Format" in:
<https://sourceware.org/systemtap/wiki/UserSpaceProbeImplementation>
The bitness of the arguments can be 8, 16, 32 or 64 bits, signed or
unsigned. Currently GDB recognizes only 32 and 64-bit arguments.
This commit extends this. Since this is a straightforward extension,
I am not submitting a testcase; I can do that if anybody wants.
gdb/
2014-05-01 Sergio Durigan Junior <sergiodj@redhat.com>
stap-probe.c (enum stap_arg_bitness): New enums to represent 8
and 16-bit signed and unsigned arguments.
(stap_parse_probe_arguments): Extend code to handle such
arguments.
---
gdb/stap-probe.c | 62 +++++++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 48 insertions(+), 14 deletions(-)
Comments
On 05/01/2014 10:52 PM, Sergio Durigan Junior wrote:
> This commit is actually an update to make the parser in
> gdb/stap-probe.c be aware of all the possible prefixes that a probe
> argument can have. According to the section "Argument Format" in:
>
> <https://sourceware.org/systemtap/wiki/UserSpaceProbeImplementation>
>
> The bitness of the arguments can be 8, 16, 32 or 64 bits, signed or
> unsigned. Currently GDB recognizes only 32 and 64-bit arguments.
Looks good.
> This commit extends this. Since this is a straightforward extension,
> I am not submitting a testcase; I can do that if anybody wants.
I think it'd be good to have a test -- the code that triggered the other
bug was also supposedly straightforward. :-) Can we do this in C ?
Ideally we'd also test that we don't crash with an invalid bitness
(the complaint path).
>
> gdb/
> 2014-05-01 Sergio Durigan Junior <sergiodj@redhat.com>
>
> stap-probe.c (enum stap_arg_bitness): New enums to represent 8
Missing '*'-
> and 16-bit signed and unsigned arguments.
> (stap_parse_probe_arguments): Extend code to handle such
> arguments.
@@ -68,6 +68,10 @@ static unsigned int stap_expression_debug = 0;
enum stap_arg_bitness
{
STAP_ARG_BITNESS_UNDEFINED,
+ STAP_ARG_BITNESS_8BIT_UNSIGNED,
+ STAP_ARG_BITNESS_8BIT_SIGNED,
+ STAP_ARG_BITNESS_16BIT_UNSIGNED,
+ STAP_ARG_BITNESS_16BIT_SIGNED,
STAP_ARG_BITNESS_32BIT_UNSIGNED,
STAP_ARG_BITNESS_32BIT_SIGNED,
STAP_ARG_BITNESS_64BIT_UNSIGNED,
@@ -329,6 +333,18 @@ stap_get_expected_argument_type (struct gdbarch *gdbarch,
else
return builtin_type (gdbarch)->builtin_uint64;
+ case STAP_ARG_BITNESS_8BIT_UNSIGNED:
+ return builtin_type (gdbarch)->builtin_uint8;
+
+ case STAP_ARG_BITNESS_8BIT_SIGNED:
+ return builtin_type (gdbarch)->builtin_int8;
+
+ case STAP_ARG_BITNESS_16BIT_UNSIGNED:
+ return builtin_type (gdbarch)->builtin_uint16;
+
+ case STAP_ARG_BITNESS_16BIT_SIGNED:
+ return builtin_type (gdbarch)->builtin_int16;
+
case STAP_ARG_BITNESS_32BIT_SIGNED:
return builtin_type (gdbarch)->builtin_int32;
@@ -1095,7 +1111,7 @@ stap_parse_probe_arguments (struct stap_probe *probe, struct gdbarch *gdbarch)
N@OP
- Where `N' can be [+,-][4,8]. This is not mandatory, so
+ Where `N' can be [+,-][1,2,4,8]. This is not mandatory, so
we check it here. If we don't find it, go to the next
state. */
if ((cur[0] == '-' && isdigit (cur[1]) && cur[2] == '@')
@@ -1108,20 +1124,38 @@ stap_parse_probe_arguments (struct stap_probe *probe, struct gdbarch *gdbarch)
got_minus = 1;
}
- if (*cur == '4')
- b = (got_minus ? STAP_ARG_BITNESS_32BIT_SIGNED
- : STAP_ARG_BITNESS_32BIT_UNSIGNED);
- else if (*cur == '8')
- b = (got_minus ? STAP_ARG_BITNESS_64BIT_SIGNED
- : STAP_ARG_BITNESS_64BIT_UNSIGNED);
- else
+ /* Defining the bitness. */
+ switch (*cur)
{
- /* We have an error, because we don't expect anything
- except 4 and 8. */
- complaint (&symfile_complaints,
- _("unrecognized bitness `%c' for probe `%s'"),
- *cur, probe->p.name);
- return;
+ case '1':
+ b = (got_minus ? STAP_ARG_BITNESS_8BIT_SIGNED
+ : STAP_ARG_BITNESS_8BIT_UNSIGNED);
+ break;
+
+ case '2':
+ b = (got_minus ? STAP_ARG_BITNESS_16BIT_SIGNED
+ : STAP_ARG_BITNESS_16BIT_UNSIGNED);
+ break;
+
+ case '4':
+ b = (got_minus ? STAP_ARG_BITNESS_32BIT_SIGNED
+ : STAP_ARG_BITNESS_32BIT_UNSIGNED);
+ break;
+
+ case '8':
+ b = (got_minus ? STAP_ARG_BITNESS_64BIT_SIGNED
+ : STAP_ARG_BITNESS_64BIT_UNSIGNED);
+ break;
+
+ default:
+ {
+ /* We have an error, because we don't expect anything
+ except 4 and 8. */
+ complaint (&symfile_complaints,
+ _("unrecognized bitness `%c' for probe `%s'"),
+ *cur, probe->p.name);
+ return;
+ }
}
arg.bitness = b;