This is the mail archive of the gdb@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

gcc HEAD dwarf-2, synthetic methods no longer public, gdb confused


Here's my next problem with gcc HEAD -gdwarf-2.  I suspect this is a bug
in gdb rather than gcc.

I've got a test program with a class, Alpha, that has a
compiler-synthesized assignment operator.  That is, Alpha does not
declare or define an operator=, so the C++ compiler has to generate
one itself.

With the old gcc HEAD, the dwarf-2 info looks like this:

 <2><f6b>: Abbrev Number: 21 (DW_TAG_subprogram)
     DW_AT_sibling     : <f98>
     DW_AT_external    : 1
     DW_AT_name        : (indirect string, offset: 0x9a3): operator=
     DW_AT_MIPS_linkage_name: _ZN5AlphaaSERKS_
     DW_AT_type        : <fd1>
     DW_AT_artificial  : 1
     DW_AT_declaration : 1

With the new gcc HEAD, the dwarf-2 info looks like this:

 <2><f6b>: Abbrev Number: 21 (DW_TAG_subprogram)
     DW_AT_sibling     : <f86>
     DW_AT_name        : (indirect string, offset: 0x999): operator=
     DW_AT_type        : <fbd>
     DW_AT_artificial  : 1
     DW_AT_declaration : 1

The difference is that DW_AT_external and DW_AT_MIPS_linkage_name
have gone away.

I narrowed this down to this one large patch:

  2004-06-21  Mark Mitchell  <mark@codesourcery.com>

	...
        * method.c (use_thunk): Use start_preparsed_function.
        (synthesize_method): Likewise.
        (implicitly_declare_fn): Build FUNCTION_DECLs, not declarators.
	...

The difference is in implicitly_declare_fn.  The old gcc HEAD
built a tree node with TREE_PUBLIC set, and the new gcc HEAD
does not.  This might be an accidental change in the middle of
the big declarator change.

When gdb sees the new debug info with no DW_AT_external and no
DW_AT_MIPS_linkage_name, it gets a little strange with the type
information.

  # gdb HEAD 2004-06-29
  # gcc HEAD 2004-06-22 07:10:00 UTC
  (gdb) ptype Alpha
  type = class Alpha {
    private:
      int a_;
      Empty empty_;

    public:
      Alpha(void);
  }

  # gdb HEAD 2004-06-29
  # gcc HEAD 2004-06-22 07:20:00 UTC
  (gdb) ptype Alpha
  type = void (Alpha * const, const Alpha &)

Interestingly, this does not affect stabs+.  It does affect dwarf-2.
Also, 'ptype class Alpha' works; it's only 'ptype Alpha' that is broken.

I can't find anything in TC++PL about the scope of synthesized methods.
But it seems reasonable to me that they no longer have DW_AT_external
and a DW_AT_MIPS_linkage_name.

I haven't looked inside dwarf2read.c yet.  Somehow the change in debug
info is causing it to associate the name 'Alpha' with the synthesized
copy ctor rather than with the class.  operator= has the changed debug
info, but gdb thinks that 'Alpha' is associated with the synthesized
copy ctor.  Something strange is happening in the dwarf-2 reader.

This causes a FAIL in class2.exp on the "print (B *) abp" test, because
gdb thinks that "B" is not the name of s class.  It probably causes some
of the other FAIL's I have here as well.

So my questions are:

... is this good dwarf-2 info?
  ... if so, can we fix the dwarf-2 reader to handle it?
  ... if not, i will file a gcc pr

Michael C


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]