[PATCH] Fix DW_AT_frame_base with -fdwarf2-cfi-asm

H.J. Lu hjl.tools@gmail.com
Tue Jun 2 21:16:00 GMT 2009


On Tue, Jun 2, 2009 at 10:59 AM, Paul Pluzhnikov <ppluzhnikov@google.com> wrote:
> On Tue, Jun 2, 2009 at 7:31 AM, Paul Pluzhnikov <ppluzhnikov@google.com> wrote:
>
>> Gcc built with that change (@148069) and tested with GDB CVS Head is
>> back to 523 unexpected failures. I'll try to figure out why that
>> number is still so high.
>
> I believe majority of the failures are explained by incorrect DW_AT_location
> for local pointer variables. Test case:
>
> --- cut ---
> struct foo { int x; int y; };
>
> int main()
> {
>  int *px;
>  int x;
>
>  struct foo *pfoo;
>  struct foo foo_struct;
>
>  px = &x;
>  *px = 42;
>
>  pfoo = &foo_struct;
>  pfoo->x = 24;
>  pfoo->y = 25;
>
>  return 0;
> }
> --- cut ---
>
> This compiles into (annotated):
>
> t.o:     file format elf64-x86-64
>
> Disassembly of section .text:
>
> 0000000000000000 <main>:
>   0:   55                      push   %rbp
>   1:   48 89 e5                mov    %rsp,%rbp
>   4:   48 8d 45 e4             lea    -0x1c(%rbp),%rax   # &x == %rbp-28
>   8:   48 89 45 f8             mov    %rax,-0x8(%rbp)    # &px == %rbp-8
>   c:   48 8b 45 f8             mov    -0x8(%rbp),%rax
>  10:   c7 00 2a 00 00 00       movl   $0x2a,(%rax)
>  16:   48 8d 45 d0             lea    -0x30(%rbp),%rax   #
> &foo_struct = %rbp-48
>  1a:   48 89 45 f0             mov    %rax,-0x10(%rbp)   # &pfoo == %rbp-16
>  1e:   48 8b 45 f0             mov    -0x10(%rbp),%rax
>  22:   c7 00 18 00 00 00       movl   $0x18,(%rax)
>  28:   48 8b 45 f0             mov    -0x10(%rbp),%rax
>  2c:   c7 40 04 19 00 00 00    movl   $0x19,0x4(%rax)
>  33:   b8 00 00 00 00          mov    $0x0,%eax
>  38:   c9                      leaveq
>  39:   c3                      retq
>
> But readelf says:
>
> Contents of the .debug_loc section:
>
>    Offset   Begin    End      Expression
>    00000000 00000000 00000001 (DW_OP_breg7: 8)
>    00000000 00000001 00000004 (DW_OP_breg7: 16)
>    00000000 00000004 00000039 (DW_OP_breg6: 16)
>    00000000 00000039 0000003a (DW_OP_breg7: 8)
>    00000000 <End of list>
>
> And
>
>  <2><7d>: Abbrev Number: 6 (DW_TAG_variable)
>    <7e>   DW_AT_name        : px
>    <81>   DW_AT_decl_file   : 1
>    <82>   DW_AT_decl_line   : 5
>    <83>   DW_AT_type        : <0xb3>
>    <87>   DW_AT_location    : 2 byte block: 91 58      (DW_OP_fbreg: -40)
>  <2><8a>: Abbrev Number: 6 (DW_TAG_variable)
>    <8b>   DW_AT_name        : x
>    <8d>   DW_AT_decl_file   : 1
>    <8e>   DW_AT_decl_line   : 6
>    <8f>   DW_AT_type        : <0x52>
>    <93>   DW_AT_location    : 2 byte block: 91 54      (DW_OP_fbreg: -44)
>  <2><96>: Abbrev Number: 7 (DW_TAG_variable)
>    <97>   DW_AT_name        : (indirect string, offset: 0x34): pfoo
>    <9b>   DW_AT_decl_file   : 1
>    <9c>   DW_AT_decl_line   : 8
>    <9d>   DW_AT_type        : <0xb9>
>    <a1>   DW_AT_location    : 2 byte block: 91 48      (DW_OP_fbreg: -56)
>  <2><a4>: Abbrev Number: 7 (DW_TAG_variable)
>    <a5>   DW_AT_name        : (indirect string, offset: 0x0): foo_struct
>    <a9>   DW_AT_decl_file   : 1
>    <aa>   DW_AT_decl_line   : 9
>    <ab>   DW_AT_type        : <0x2d>
>    <af>   DW_AT_location    : 2 byte block: 91 40      (DW_OP_fbreg: -64)
>
>
> So addresses of 'x' and 'foo_struct' are correct, but addresses of 'px'
> and 'pfoo' are way off.
>
> This is a regression from gcc-4.4.0; no clue when it was introduced.
>

Can you verify if it is the same as

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40012

-- 
H.J.



More information about the Gcc-patches mailing list