[C++ Pubnames Patch] Anonymous namespaces enclosed in named namespaces. (issue6343052)
Sterling Augustine
saugustine@google.com
Mon Jul 9 21:45:00 GMT 2012
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
More information about the Gcc-patches
mailing list