On Wed, May 16, 2012 at 1:03 PM, Sterling Augustine <saugust...@google.com> wrote: > This patch adds new flags and defines such that the C++ decl pretty printer > prints both canonical dwarf names for decls without perturbing normal error > message output. > > It addresses the issues with the earlier patches submitted as: > > http://gcc.gnu.org/ml/gcc-patches/2012-05/msg00516.html > http://gcc.gnu.org/ml/gcc-patches/2012-05/msg00512.html > > Which are withdrawn. > > This patch requires no changes to the testsuite and does not produce > visible changes to gcc's output except to dwarf consumers, which will now > all agree on the names of functions. > > Tested with a full bootstrap. > > OK for mainline? > > Sterling > > > > 2012-05-16 Sterling Augustine <saugust...@google.com> > > * gcc/c-family/c-pretty-print.h (pp_c_flag_gnu_v3): New enumerator. > * gcc/c-family/c-pretty-print.c (pp_c_specifier_qualifier_list): Check > it at both the start and end of the function. > * gcc/cp/cp-tree.h (TFF_MATCH_GNU_V3_DEMANGLER): Define and comment. > * gcc/cp/error.c (dump_decl): Print appropriate string for anonymous > namespace based on pp_c_flag_gnu_v3. > (decl_as_string): Set cxx_pp->flags based on > TFF_MATCH_GNU_V3_DEMANGLER. > (lang_decl_name): Handle unnamed namespace decls. > * gcc/cp/cp-lang.c (cxx_dwarf_name): Call decl_as_string for namespace > decls. > > Index: gcc/c-family/c-pretty-print.c > =================================================================== > --- gcc/c-family/c-pretty-print.c (revision 187603) > +++ gcc/c-family/c-pretty-print.c (working copy) > @@ -446,8 +446,9 @@ pp_c_specifier_qualifier_list (c_pretty_printer *p > { > const enum tree_code code = TREE_CODE (t); > > - if (TREE_CODE (t) != POINTER_TYPE) > + if (!(pp->flags & pp_c_flag_gnu_v3) && TREE_CODE (t) != POINTER_TYPE) > pp_c_type_qualifier_list (pp, t); > + > switch (code) > { > case REFERENCE_TYPE: > @@ -494,6 +495,8 @@ pp_c_specifier_qualifier_list (c_pretty_printer *p > pp_simple_type_specifier (pp, t); > break; > } > + if ((pp->flags & pp_c_flag_gnu_v3) && TREE_CODE (t) != POINTER_TYPE) > + pp_c_type_qualifier_list (pp, t); > } > > /* parameter-type-list: > Index: gcc/c-family/c-pretty-print.h > =================================================================== > --- gcc/c-family/c-pretty-print.h (revision 187603) > +++ gcc/c-family/c-pretty-print.h (working copy) > @@ -30,7 +30,8 @@ along with GCC; see the file COPYING3. If not see > typedef enum > { > pp_c_flag_abstract = 1 << 1, > - pp_c_flag_last_bit = 2 > + pp_c_flag_last_bit = 2, > + pp_c_flag_gnu_v3 = 4 > } pp_c_pretty_print_flags; > > > Index: gcc/cp/error.c > =================================================================== > --- gcc/cp/error.c (revision 187603) > +++ gcc/cp/error.c (working copy) > @@ -1028,7 +1028,12 @@ dump_decl (tree t, int flags) > dump_scope (CP_DECL_CONTEXT (t), flags); > flags &= ~TFF_UNQUALIFIED_NAME; > if (DECL_NAME (t) == NULL_TREE) > - pp_cxx_ws_string (cxx_pp, M_("{anonymous}")); > + { > + if (!(pp_c_base (cxx_pp)->flags & pp_c_flag_gnu_v3)) > + pp_cxx_ws_string (cxx_pp, M_("{anonymous}")); > + else > + pp_cxx_ws_string (cxx_pp, M_("(anonymous namespace)")); > + } > else > pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t)); > } > @@ -2561,6 +2566,8 @@ decl_as_string (tree decl, int flags) > { > reinit_cxx_pp (); > pp_translate_identifiers (cxx_pp) = false; > + if (flags & TFF_MATCH_GNU_V3_DEMANGLER) > + pp_c_base (cxx_pp)->flags |= pp_c_flag_gnu_v3; > dump_decl (decl, flags); > return pp_formatted_text (cxx_pp); > } > @@ -2596,6 +2603,9 @@ lang_decl_name (tree decl, int v, bool translate) > > if (TREE_CODE (decl) == FUNCTION_DECL) > 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); > else > dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER); > > Index: gcc/cp/cp-lang.c > =================================================================== > --- gcc/cp/cp-lang.c (revision 187603) > +++ gcc/cp/cp-lang.c (working copy) > @@ -120,8 +120,14 @@ cxx_dwarf_name (tree t, int verbosity) > if (verbosity >= 2) > return decl_as_string (t, > TFF_DECL_SPECIFIERS | TFF_UNQUALIFIED_NAME > - | TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS); > + | TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS > + | TFF_MATCH_GNU_V3_DEMANGLER); > > + /* decl_as_string handles namespaces--especially anonymous ones--more > + appropriately for debugging than cxx_printable_name. But > + cxx_printable_name handles templates and global ctors and dtors better. > */ > + if (TREE_CODE (t) == NAMESPACE_DECL) > + return decl_as_string (t, TFF_MATCH_GNU_V3_DEMANGLER); > return cxx_printable_name (t, verbosity); > } > > Index: gcc/cp/cp-tree.h > =================================================================== > --- gcc/cp/cp-tree.h (revision 187603) > +++ gcc/cp/cp-tree.h (working copy) > @@ -4567,7 +4567,9 @@ enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, T > TFF_UNQUALIFIED_NAME: do not print the qualifying scope of the > top-level entity. > TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS: do not omit template arguments > - identical to their defaults. */ > + identical to their defaults. > + TFF_MATCH_GNU_V3_DEMANGLER: match the GNU v3 demangler's names for > anonymous > + namespaces and order of type-qualifiers vs type-specifiers. */ > > #define TFF_PLAIN_IDENTIFIER (0) > #define TFF_SCOPE (1) > @@ -4583,6 +4585,7 @@ enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, T > #define TFF_NO_FUNCTION_ARGUMENTS (1 << 10) > #define TFF_UNQUALIFIED_NAME (1 << 11) > #define TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS (1 << 12) > +#define TFF_MATCH_GNU_V3_DEMANGLER (1 << 13) > > /* Returns the TEMPLATE_DECL associated to a TEMPLATE_TEMPLATE_PARM > node. */ > > -- > This patch is available for review at http://codereview.appspot.com/6215052
Ping?