[hpux] interesting but difficult to unwind code

Randolph Chung
2005-12-09T00:08:54Z

Here's a case that gdb cannot handle. This is from a piece of code that
is probably compiled by the HP compiler -- it is HP's wdb.
Interestingly, neither wdb or gdb can unwind through execute_command().
The code seems to include a few interesting features:

1) it has a branch right in the middle of the prologue at +16. This is a
call to strlen()

2) It contains a stack adjustment beyond what is marked in the unwind
info. This is probably due to alloca(). Note that there is nothing in
the unwind data that indicates this. The line of code in wdb that
generates this is probably:

save_line = (char *) alloca (strlen (p) + 1);

(gdb) disassemble 0xcb52f
Dump of assembler code for function execute_command:
0x000cb44c <execute_command+0>: stw rp,-14(sp)
0x000cb450 <execute_command+4>: stw,ma r3,80(sp)
0x000cb454 <execute_command+8>: ldo 0(sp),r3
0x000cb458 <execute_command+12>: stw r26,-a4(r3)
0x000cb45c <execute_command+16>: b,l 0xcb41c <execute_command+24>,rp
0x000cb460 <execute_command+20>: stw r25,-a8(r3)
0x000cb464 <execute_command+24>: stw r4,-7c(r3)
0x000cb468 <execute_command+28>: ldo 1(ret0),ret1
0x000cb46c <execute_command+32>: stw r5,-78(r3)
0x000cb470 <execute_command+36>: stw r6,-74(r3)
0x000cb474 <execute_command+40>: ldw -10(sp),r26
0x000cb478 <execute_command+44>: ldw -4(sp),r19
0x000cb47c <execute_command+48>: addi 3f,ret1,r1
0x000cb480 <execute_command+52>: depwi 0,31,6,r1
0x000cb484 <execute_command+56>: ldi 38,rp
0x000cb488 <execute_command+60>: sub sp,rp,ret1
0x000cb48c <execute_command+64>: add sp,r1,sp
0x000cb490 <execute_command+68>: stw r19,-4(sp)
0x000cb494 <execute_command+72>: stw r26,-10(sp)
0x000cb498 <execute_command+76>: ldw -a4(r3),r25
0x000cb49c <execute_command+80>: ldo 0(ret1),r26
0x000cb4a0 <execute_command+84>: b,l 0xcb424 <execute_command+32>,rp

(gdb) maintenance print unwind execute_command
unwind_table_entry (0x40286424):
region_start = 0xcb44c <execute_command>
region_end = 0xcb798 <execute_command+844>
flags = Args_stored Save_RP
Region_description = 0x0
Entry_FR = 0x0
Entry_GR = 0x4
Total_frame_size = 0x10

I'm not sure if this is really ABI compliant.....
Any suggestions on what we can do here?

randolph