[C++ Patch] Produce canonical names for debug info without changing normal pretty-printing (issue6215052)
Sterling Augustine
saugustine@google.com
Tue May 29 22:32:00 GMT 2012
On Wed, May 16, 2012 at 1:03 PM, Sterling Augustine
<saugustine@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 <saugustine@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?
More information about the Gcc-patches
mailing list