------- Comment #12 from dodji at gcc dot gnu dot org  2008-08-29 09:58 -------
This is an update of what we get with gcc-4_3-branch.

For the program (line numbers added for better legibility):

     1  #include <stdio.h>
     2  class A {
     3  public:
     4    A (int a, int b);
     5    int a_;
     6    int b_;
     7    int c_;
     8  };
     9  
    10  A::A (int a, int b) : a_ (a), b_ (b), c_ (0)
    11  {
    12    int iii;
    13    iii = 42;
    14    c_ = a_ * b_;
    15    c_ += iii;
    16    static const int foofoo[6][4] = { {0,1,2,3},
    17                                      {1,2,3,4},
    18                                      {2,3,4,5},
    19                                      {3,4,5,6},
    20                                      {4,5,6,7},
    21                                      {5,6,7,8} };
    22  
    23    printf("c_ = %d\n", c_);
    24    printf("foofoo = %d\n", foofoo);
    25  }
    26  
    27  int main (int, char* *)
    28  {
    29    int a = 34, b = 56;
    30    A x (a, b);
    31    return x.a_ + x.b_;
    32  }
    33  

I get the dwarf info below:

[...]

<1><c5>: Abbrev Number: 11 (DW_TAG_subprogram) <-- //This is the A::A
constructor at line 10.
    <c6>   DW_AT_specification: <0xa6>  
    <ca>   DW_AT_decl_line   : 10       
    <cb>   DW_AT_inline      : 0        (not inlined)
    <cc>   DW_AT_sibling     : <0x102>  
 <2><d0>: Abbrev Number: 12 (DW_TAG_formal_parameter)
    <d1>   DW_AT_name        : (indirect string, offset: 0x47): this    
    <d5>   DW_AT_type        : <0x102>  
    <d9>   DW_AT_artificial  : 1        
 <2><da>: Abbrev Number: 13 (DW_TAG_formal_parameter)
    <db>   DW_AT_name        : a        
    <dd>   DW_AT_decl_file   : 1        
    <de>   DW_AT_decl_line   : 10       
    <df>   DW_AT_type        : <0x57>   
 <2><e3>: Abbrev Number: 13 (DW_TAG_formal_parameter)
    <e4>   DW_AT_name        : b        
    <e6>   DW_AT_decl_file   : 1        
    <e7>   DW_AT_decl_line   : 10       
    <e8>   DW_AT_type        : <0x57>   
 <2><ec>: Abbrev Number: 14 (DW_TAG_variable) <--- this if the foofoo variable
    <ed>   DW_AT_name        : (indirect string, offset: 0x0): foofoo
    <f1>   DW_AT_decl_file   : 1        
    <f2>   DW_AT_decl_line   : 16 
    <f3>   DW_AT_type        : <0x214>  
    <f7>   DW_AT_location    : 9 byte block: 3 20 8 40 0 0 0 0 0       
(DW_OP_addr: 400820)

[...]

So we see here that the foofoo variable is generated with an DW_AT_location,
inside the A::A constructor we are interested in.

However, in GDB, at line 23:
(gdb) bt
#0  A (this=0x7fff6616bd80, a=34, b=56) at test-PR33044.cc:23
#1  0x0000000000400645 in main () at test-PR33044.cc:30

I get:
(gdb) p foofoo
No symbol "foofoo" in current context.

As Andrew pointed, gcc can generate several copies (two, or three) of a given
constructor. Those copies don't necessarily have the same signatures, of
course. So A::A(int, int) might yield to an additional copy of the constructor
being generated.
The debugging for A::A(int, int) info is only generated for the "initial"
constructor. Not for the additional copy.

So my question now is what happens when GDB actually breaks in the additional
copy ? Can it detect that it broke in a constructor that is "only" a copy of
the "real" one ? Or does it expect that all the copies be associated with
debugging info ?


-- 


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

Reply via email to