|
|
Created:
12 years, 7 months ago by saugustine Modified:
9 years, 5 months ago Reviewers:
gdr, howarth, mikestump CC:
gcc-patches_gcc.gnu.org Base URL:
svn+ssh://gcc.gnu.org/svn/gcc/trunk/gcc/ Visibility:
Public. |
Patch Set 1 #
MessagesTotal messages: 8
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? Sterling gcc/cp/ChangeLog 2012-06-28 Sterling Augustine <saugustine@google.com> * error.c (lang_decl_name): Use TFF_UNQUALIFIED_NAME flag. gcc/testsuite/ChangeLog 2012-06-28 Sterling Augustine <saugustine@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
Sign in to reply to this message.
On Thu, Jun 28, 2012 at 12:50 PM, Sterling Augustine <saugustine@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 <saugustine@google.com> > > * error.c (lang_decl_name): Use TFF_UNQUALIFIED_NAME flag. > > gcc/testsuite/ChangeLog > > 2012-06-28 Sterling Augustine <saugustine@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
Sign in to reply to this message.
Committed as posted. Thanks. On Sun, Jul 1, 2012 at 7:33 AM, Gabriel Dos Reis <gdr@integrable-solutions.net> wrote: > On Thu, Jun 28, 2012 at 12:50 PM, Sterling Augustine > <saugustine@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 <saugustine@google.com> >> >> * error.c (lang_decl_name): Use TFF_UNQUALIFIED_NAME flag. >> >> gcc/testsuite/ChangeLog >> >> 2012-06-28 Sterling Augustine <saugustine@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
Sign in to reply to this message.
On Sun, Jul 01, 2012 at 09:33:06AM -0500, Gabriel Dos Reis wrote: > On Thu, Jun 28, 2012 at 12:50 PM, Sterling Augustine > <saugustine@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. This patch introduces the regressions... FAIL: g++.dg/debug/dwarf2/pubnames-2.C scan-assembler .section\t.debug_pubnames FAIL: g++.dg/debug/dwarf2/pubnames-2.C scan-assembler "_GLOBAL__sub_I__ZN3one3c1vE\\\\0"+[ \t]+[#;]+[ \t]+external name FAIL: g++.dg/debug/dwarf2/pubnames-2.C scan-assembler .section\t.debug_pubtypes at -m32/-m64 on x86_64-apple-darwin12... http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54230 I have attached the -m32 assembly generated for the g++.dg/debug/dwarf2/pubnames-2.C to PR54230 but haven't been able to add Sterling to the PR as none of his email addresses are recognized by bugzilla. Jack > > > > > Sterling > > > > > > gcc/cp/ChangeLog > > > > 2012-06-28 Sterling Augustine <saugustine@google.com> > > > > * error.c (lang_decl_name): Use TFF_UNQUALIFIED_NAME flag. > > > > gcc/testsuite/ChangeLog > > > > 2012-06-28 Sterling Augustine <saugustine@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
Sign in to reply to this message.
On Sun, Aug 12, 2012 at 12:46 PM, Jack Howarth <howarth@bromo.med.uc.edu> wrote: > This patch introduces the regressions... > > FAIL: g++.dg/debug/dwarf2/pubnames-2.C scan-assembler .section\t.debug_pubnames > FAIL: g++.dg/debug/dwarf2/pubnames-2.C scan-assembler > "_GLOBAL__sub_I__ZN3one3c1vE\\\\0"+[ \t]+[#;]+[ \t]+external name > FAIL: g++.dg/debug/dwarf2/pubnames-2.C scan-assembler .section\t.debug_pubtypes > > at -m32/-m64 on x86_64-apple-darwin12... > > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54230 > > I have attached the -m32 assembly generated for the g++.dg/debug/dwarf2/pubnames-2.C > to PR54230 but haven't been able to add Sterling to the PR as none of his email > addresses are recognized by bugzilla. I will look at this and figure it out. The problem is quite likely that the test is erroneous, rather than the patch. Sterling
Sign in to reply to this message.
On Sun, Aug 12, 2012 at 12:46 PM, Jack Howarth <howarth@bromo.med.uc.edu> wrote: > On Sun, Jul 01, 2012 at 09:33:06AM -0500, Gabriel Dos Reis wrote: >> On Thu, Jun 28, 2012 at 12:50 PM, Sterling Augustine >> <saugustine@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. > > This patch introduces the regressions... > > FAIL: g++.dg/debug/dwarf2/pubnames-2.C scan-assembler .section\t.debug_pubnames > FAIL: g++.dg/debug/dwarf2/pubnames-2.C scan-assembler > "_GLOBAL__sub_I__ZN3one3c1vE\\\\0"+[ \t]+[#;]+[ \t]+external name > FAIL: g++.dg/debug/dwarf2/pubnames-2.C scan-assembler .section\t.debug_pubtypes > > at -m32/-m64 on x86_64-apple-darwin12... > > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54230 > > I have attached the -m32 assembly generated for the g++.dg/debug/dwarf2/pubnames-2.C > to PR54230 but haven't been able to add Sterling to the PR as none of his email > addresses are recognized by bugzilla. > Jack The enclosed patch adjusts the test so it will pass on darwin. The issue was that it looked for some elf-specific assembly directives, which it shouldn't. OK for mainline? Sterling 2012-08-13 Sterling Augustine <saugustine@google.com> * g++.dg/debug/dwarf2/pubnames-2.C: Adjust.
Sign in to reply to this message.
On Aug 13, 2012, at 4:56 PM, Sterling Augustine wrote: > The enclosed patch adjusts the test so it will pass on darwin. The > issue was that it looked for some elf-specific assembly directives, > which it shouldn't. > > OK for mainline? Ok.
Sign in to reply to this message.
On Mon, Aug 13, 2012 at 6:18 PM, Mike Stump <mikestump@comcast.net> wrote: > On Aug 13, 2012, at 4:56 PM, Sterling Augustine wrote: >> The enclosed patch adjusts the test so it will pass on darwin. The >> issue was that it looked for some elf-specific assembly directives, >> which it shouldn't. >> >> OK for mainline? > > Ok. Committed as posted. Sterling
Sign in to reply to this message.
|