possible loc2c problem, DW_OP_rot

Mark Wielaard mjw@redhat.com
Sat Jan 5 10:18:00 GMT 2013


On Fri, Jan 04, 2013 at 09:47:06PM -0500, Frank Ch. Eigler wrote:
> A particularly wildcardy stap script generates this little ditty:
> 
> static void function__dwarf_tvar_get_num_155657 (struct context* __restrict__ c) {
> [...]
>   {
>     uintptr_t addr;
>     { // DWARF expression: 0x70 0x38 0x14 0x14 0x24 0xa(65535) 0x1a 0x17 0x16 0xa(65535) 0x1a 0x16 0x1f 0x23(16) 0x25 0x21 0xa(65535) 0x1a 0x9f

Nice DWARF expression :)
I really should push my elfutils libdw dwarfstrings patch again,
the above is somewhat hard to translate by hand.

> Note the DW_OP_rot ditty, 0x17, where a nonexistent variable
> s4294967295 is used.  gcc (via stap -p4) barfs at that point.
> 
> Looking at loc2c.c:551,
> 
>     551         case DW_OP_rot:
>     552           if (stack_depth < 3)
>     553             goto underflow;
>     554           deepen ();            /* Use a temporary slot.  */
>     555           emit ("%*s"
>     556                 STACKFMT " = " STACKFMT ", "
>     557                 STACKFMT " = " STACKFMT ", "
>     558                 STACKFMT " = " STACKFMT ", "
>     559                 STACKFMT " = " STACKFMT ";\n",
>     560                 indent * 2, "",
>     561                 STACK (-1), STACK (0),
>     562                 STACK (0), STACK (1),
>     563                 STACK (1), STACK (2),
>     564                 STACK (3), STACK (-1));
>     565           break;
> 
> that pattern of STACK(...) numbers looks wrong.  Should that last line have
> STACK (2) instead of STACK (3)?

Certainly looks so. Do you happen to have the test binary/script.
Would be good to turn that into a testcase. Apparently we never
saw a DW_OP_rot before. I see the runtime unwinder doesn't even
support it. So if it can also happen in CFI then we should also
add support there.

Cheers,

Mark



More information about the Systemtap mailing list