I'm seeing differences between the DWARF data being generated by gcc 3.4.6 and 4.1.2.
Compiling the following (-g -mno-quickcall): int f(int a) { return a; } generates the following code (in both 3.4.6 and 4.1.2): 00000000 <_f>: 0: 6d f6 mov.w r6,@-r7 2: 0d 76 mov.w r7,r6 00000004 <.LM2>: 4: 6f 62 00 04 mov.w @(0x4:16,r6),r2 00000008 <.LM3>: 8: 0d 20 mov.w r2,r0 a: 6d 76 mov.w @r7+,r6 c: 54 70 rts But, looking at the DWARF data, this is what 3.4.6 produces: <1><38>: Abbrev Number: 2 (DW_TAG_subprogram) DW_AT_name : f DW_AT_frame_base : 1 byte block: 56 (DW_OP_reg6) <2><4d>: Abbrev Number: 3 (DW_TAG_formal_parameter) DW_AT_name : a DW_AT_location : 2 byte block: 91 4 (DW_OP_fbreg: 4) This means variable 'a' can be found at the address contained in r6 (frame pointer) + 4, right? Both gdb and our internal debugger recognizes this and extracts the correct value for 'a'. 4.1.2, however, generates this: <1><38>: Abbrev Number: 2 (DW_TAG_subprogram) DW_AT_name : f DW_AT_frame_base : 1 byte block: 57 (DW_OP_reg7) <2><4d>: Abbrev Number: 3 (DW_TAG_formal_parameter) DW_AT_name : a DW_AT_location : 2 byte block: 91 0 (DW_OP_fbreg: 0) which translates to the address contained in r7 (stack pointer) + 0. To me, this does not make sense, as the stack pointer will point to the old frame pointer (in this particular case). So loading the value from this address will load the old frame pointer instead of 'a'. Needless to say, both gdb and our own debugger has problems with this file; gdb doesn't even get a correct stack trace. -- Summary: [h8300] bad dwarf frame base data Product: gcc Version: 4.1.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: debug AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: ekloef at virtutech dot com GCC host triplet: i686-linux-gnu GCC target triplet: h8300-elf http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31934