On Thu, Jun 28, 2012 at 12:50 PM, Sterling Augustine <saugust...@google.com> wrote: > The enclosed patch adds a fix for the pubnames anonymous namespaces contained > within named namespaces, and adds an extensive test for the various pubnames. > > The bug is that when printing at verbosity level 1, and lang_decl_name sees a > namespace decl in not in the global namespace, it prints the namespace's > enclosing scopes--so far so good. However, the code I added earlier this month > to handle anonymous namespaces also prints the enclosing scopes, so one would > get foo::foo::(anonymous namespace) instead of foo::(anonymous namespace). > > The solution is to stop the added code from printing the enclosing scope, > which > is correct for both verbosity levels 0 and 1. Level 2 is handled elsewhere and > so not relevant. > > I have formalized the tests I have been using to be sure pubnames are correct > and include that in this patch. It is based on ccoutant's gdb_index_test.cc > from > the gold test suite. > > OK for mainline?
OK. > > Sterling > > > gcc/cp/ChangeLog > > 2012-06-28 Sterling Augustine <saugust...@google.com> > > * error.c (lang_decl_name): Use TFF_UNQUALIFIED_NAME flag. > > gcc/testsuite/ChangeLog > > 2012-06-28 Sterling Augustine <saugust...@google.com> > > * g++.dg/debug/dwarf2/pubnames-2.C: New. > > Index: cp/error.c > =================================================================== > --- cp/error.c (revision 189025) > +++ cp/error.c (working copy) > @@ -2633,7 +2633,7 @@ > dump_function_name (decl, TFF_PLAIN_IDENTIFIER); > else if ((DECL_NAME (decl) == NULL_TREE) > && TREE_CODE (decl) == NAMESPACE_DECL) > - dump_decl (decl, TFF_PLAIN_IDENTIFIER); > + dump_decl (decl, TFF_PLAIN_IDENTIFIER | TFF_UNQUALIFIED_NAME); > else > dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER); > > Index: testsuite/g++.dg/debug/dwarf2/pubnames-2.C > =================================================================== > --- testsuite/g++.dg/debug/dwarf2/pubnames-2.C (revision 0) > +++ testsuite/g++.dg/debug/dwarf2/pubnames-2.C (revision 0) > @@ -0,0 +1,194 @@ > +// { dg-do compile } > +// { dg-options "-gpubnames -gdwarf-4 -std=c++0x -dA" } > +// { dg-final { scan-assembler ".section\t.debug_pubnames" } } > +// { dg-final { scan-assembler "\"\\(anonymous namespace\\)\\\\0\"+\[ > \t\]+\[#;]+\[ \t\]+external name" } } > +// { dg-final { scan-assembler "\"one\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external > name" } } > +// { dg-final { scan-assembler "\"one::G_A\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"one::G_B\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"one::G_C\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"one::\\(anonymous namespace\\)\\\\0\"+\[ > \t\]+\[#;]+\[ \t\]+external name" } } > +// { dg-final { scan-assembler "\"two\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external > name" } } > +// { dg-final { scan-assembler "\"F_A\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external > name" } } > +// { dg-final { scan-assembler "\"F_B\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external > name" } } > +// { dg-final { scan-assembler "\"F_C\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external > name" } } > +// { dg-final { scan-assembler "\"inline_func_1\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"one::c1::c1\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"one::c1::~c1\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"one::c1::val\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"check_enum\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"main\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external > name" } } > +// { dg-final { scan-assembler "\"two::c2<int>::c2\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"two::c2<double>::c2\\\\0\"+\[ > \t\]+\[#;]+\[ \t\]+external name" } } > +// { dg-final { scan-assembler "\"two::c2<int const\\\*>::c2\\\\0\"+\[ > \t\]+\[#;]+\[ \t\]+external name" } } > +// { dg-final { scan-assembler "\"check<one::c1>\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"check<two::c2<int> \\>\\\\0\"+\[ > \t\]+\[#;]+\[ \t\]+external name" } } > +// { dg-final { scan-assembler "\"check<two::c2<double> \\>\\\\0\"+\[ > \t\]+\[#;]+\[ \t\]+external name" } } > +// { dg-final { scan-assembler "\"check<two::c2<int const\\\*> \\>\\\\0\"+\[ > \t\]+\[#;]+\[ \t\]+external name" } } > +// { dg-final { scan-assembler "\"two::c2<int>::val\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"two::c2<double>::val\\\\0\"+\[ > \t\]+\[#;]+\[ \t\]+external name" } } > +// { dg-final { scan-assembler "\"two::c2<int const\\\*>::val\\\\0\"+\[ > \t\]+\[#;]+\[ \t\]+external name" } } > +// { dg-final { scan-assembler > "\"__static_initialization_and_destruction_0\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"two::c2<int>::~c2\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"two::c2<double>::~c2\\\\0\"+\[ > \t\]+\[#;]+\[ \t\]+external name" } } > +// { dg-final { scan-assembler "\"two::c2<int const\\\*>::~c2\\\\0\"+\[ > \t\]+\[#;]+\[ \t\]+external name" } } > +// { dg-final { scan-assembler "\"_GLOBAL__sub_I__ZN3one3c1vE\\\\0\"+\[ > \t\]+\[#;]+\[ \t\]+external name" } } > +// { dg-final { scan-assembler "\"anonymous_union_var\\\\0\"+\[ > \t\]+\[#;]+\[ \t\]+external name" } } > +// { dg-final { scan-assembler "\"two::ci\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"two::c2v1\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"two::c2v2\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"two::c2v3\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"one::c1v\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"one::\\(anonymous > namespace\\)::one_anonymous_var\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external name" } > } > +// { dg-final { scan-assembler "\"\\(anonymous > namespace\\)::c1_count\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external name" } } > +// { dg-final { scan-assembler "\"\\(anonymous > namespace\\)::c2_count\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external name" } } > +// { dg-final { scan-assembler "\"\\(anonymous namespace\\)::three\\\\0\"+\[ > \t\]+\[#;]+\[ \t\]+external name" } } > +// { dg-final { scan-assembler "\"\\(anonymous > namespace\\)::three::anonymous_three_var\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler ".section\t.debug_pubtypes" } } > +// { dg-final { scan-assembler "\"one::G\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"one::c1\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"int\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external > name" } } > +// { dg-final { scan-assembler "\"one::c1\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"two::c2<int>\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"two::c2<int>\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"two::c2<double>\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"double\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"two::c2<double>\\\\0\"+\[ \t\]+\[#;]+\[ > \t\]+external name" } } > +// { dg-final { scan-assembler "\"two::c2<int const\\\*>\\\\0\"+\[ > \t\]+\[#;]+\[ \t\]+external name" } } > +// { dg-final { scan-assembler "\"two::c2<int const\\\*>\\\\0\"+\[ > \t\]+\[#;]+\[ \t\]+external name" } } > +// { dg-final { scan-assembler "\"F\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external > name" } } > +// { dg-final { scan-assembler "\"anonymous_union_container\\\\0\"+\[ > \t\]+\[#;]+\[ \t\]+external name" } } > +// { dg-final { scan-assembler "\"bool\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external > name" } } > + > +namespace > +{ > +int c1_count; > +int c2_count; > + > +namespace three > +{ > +int anonymous_three_var; > +} > +}; > + > +namespace one > +{ > + > +enum G > +{ > + G_A, > + G_B, > + G_C > +}; > + > +namespace { > +int one_anonymous_var; > +} > + > +class c1 > +{ > + public: > + static int count; > + > + c1() > + { ++c1_count; } > + > + ~c1() > + { > + --c1_count; > + } > + > + enum E > + { > + E_A, > + E_B, > + E_C, > + }; > + > + int > + val() > + { return E_A; } > +}; > + > +c1 c1v; > +}; > + > +namespace two > +{ > +const int ci = 3; > + > +template <typename T> > +class c2 > +{ > + public: > + c2(T t) > + : t_(t) > + { > + ++c2_count; > + } > + > + ~c2() > + { --c2_count; } > + > + T > + val() > + { return this->t_; } > + > + T t_; > +}; > + > +c2<int> c2v1(1); > +c2<double> c2v2(2.0); > +c2<int const*> c2v3(&ci); > +}; > + > +enum F > +{ > + F_A, > + F_B, > + F_C > +}; > + > +template <class C> > +bool > +check(C* c) > +{ return c->val() == 0; } > + > +bool > +check_enum(int i) > +{ return i > 0; } > + > +struct anonymous_union_container { > + union { > + struct astruct { > + int a; > + }; > + int b; > + } u; > +}; > + > +anonymous_union_container anonymous_union_var; > + > +#ifdef __GNUC__ > +#define ALWAYS_INLINE __attribute__((always_inline)) > +#else > +#define ALWAYS_INLINE > +#endif > + > +static inline ALWAYS_INLINE int > +inline_func_1(int i) > +{ return i * 17; } > + > +int > +main() > +{ > + F f = F_A; > + one::G g = one::G_A; > + check_enum(f); > + check_enum(g); > + check(&one::c1v); > + check(&two::c2v1); > + check(&two::c2v2); > + check(&two::c2v3); > + anonymous_union_var.u.b = inline_func_1(3) - 51; > + return anonymous_union_var.u.b; > +} > > -- > This patch is available for review at http://codereview.appspot.com/6343052