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

           Summary: Invalid DW_AT_location for a retval instance of a
                    class that has a virtual function
           Product: gcc
           Version: 4.5.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: debug
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: siddhesh.poyare...@gmail.com


Created attachment 22649
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=22649
Reproducer program to run under gdb

Problem Description:

When a local object is created from a class with a virtual function and that
object is also the retval for the function it is the local variable in, the
debuginfo generated for the object indicates that it is located in a register,
while in reality, its address is located in the register.

Steps to Reproduce:

$ cat > rep.cpp
class Sequence {
public:
  virtual void foo(void);
};

Sequence getSequence()
{
  Sequence data;
  return data;
}

$ g++ -g -c rep.cpp
$ objdump -W rep.o | less
...
 <3><c4>: Abbrev Number: 13 (DW_TAG_variable)
    <c5>   DW_AT_name        : (indirect string, offset: 0x43): data    
    <c9>   DW_AT_decl_file   : 1        
    <ca>   DW_AT_decl_line   : 8        
    <cb>   DW_AT_type        : <0x31>   
    <cf>   DW_AT_location    : 1 byte block: 53         (DW_OP_reg3)
...

Additional Information:

Attached reproducer fullrep.cpp can be used to demonstrate this problem as seen
in gdb.

1) Build fullrep.cpp: gcc -g fullrep.cpp
2) Run under gdb:

[siddh...@spoyarek gcc-foo]$ gdb -q ./a.out
Reading symbols from /home/siddhesh/gcc-foo/a.out...done.
(gdb) break getSequence
Breakpoint 1 at 0x4007e0: file fullrep.cpp, line 14.
(gdb) r
Starting program: /home/siddhesh/gcc-foo/a.out 

Breakpoint 1, getSequence () at fullrep.cpp:14
14      Sequence data;
(gdb) p data
$1 = {_vptr.Sequence = 0x7fffffffdfd0, i = 4}
(gdb) p &data
Address requested for identifier "data" which is in register $rbx
(gdb) p *((Sequence *)$rbx)
$2 = {_vptr.Sequence = 0x7fffffffe0c0, i = 0}
(gdb)

Reply via email to