Patchwork [C++] Produce canonical names for debug info without changing normal pretty-printing (issue6215052)

login
register
mail settings
Submitter Sterling Augustine
Date June 1, 2012, 11:07 p.m.
Message ID <20120601230751.E0FEB160730@sterling.mtv.corp.google.com>
Download mbox | patch
Permalink /patch/162383/
State New
Headers show

Comments

Sterling Augustine - June 1, 2012, 11:07 p.m.
After finding yet another bug in the previous patch dealing with pretty-printing
decls for dwarf in canonical form, I have figured out a way to do it that is
less invasive and much cleaner.

This updated patch simply wraps the two entry points into the decl pretty-
printer called from cxx_dwarf_name with new functions that set the
appropriate flag on the pretty printer. This is much cleaner and avoids
the need for translating flags for C++ pretty-printing into standard C
pretty printing flags.

OK for mainline?

Sterling

2012-06-01   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/error.c (dump_decl): Check pp_c_flag_gnu_v3.
	(decl_as_dwarf_string, lang_decl_dwarf_name): New functions.
	(lang_decl_name): Handle namespace decls.
	* gcc/cp/cp-tree.h: Declare decl_as_dwarf_string, lang_decl_dwarf_name.
	* gcc/cp/cp-lang.c: Call them.


--
This patch is available for review at http://codereview.appspot.com/6215052
Gabriel Dos Reis - June 1, 2012, 11:38 p.m.
On Fri, Jun 1, 2012 at 6:07 PM, Sterling Augustine
<saugustine@google.com> wrote:
> After finding yet another bug in the previous patch dealing with pretty-printing
> decls for dwarf in canonical form, I have figured out a way to do it that is
> less invasive and much cleaner.
>
> This updated patch simply wraps the two entry points into the decl pretty-
> printer called from cxx_dwarf_name with new functions that set the
> appropriate flag on the pretty printer. This is much cleaner and avoids
> the need for translating flags for C++ pretty-printing into standard C
> pretty printing flags.
>
> OK for mainline?

OK.
Sterling Augustine - June 4, 2012, 5:53 p.m.
On Fri, Jun 1, 2012 at 4:38 PM, Gabriel Dos Reis
<gdr@integrable-solutions.net> wrote:
> On Fri, Jun 1, 2012 at 6:07 PM, Sterling Augustine
> <saugustine@google.com> wrote:
>> After finding yet another bug in the previous patch dealing with pretty-printing
>> decls for dwarf in canonical form, I have figured out a way to do it that is
>> less invasive and much cleaner.
>>
>> This updated patch simply wraps the two entry points into the decl pretty-
>> printer called from cxx_dwarf_name with new functions that set the
>> appropriate flag on the pretty printer. This is much cleaner and avoids
>> the need for translating flags for C++ pretty-printing into standard C
>> pretty printing flags.
>>
>> OK for mainline?
>
> OK.

Thanks! Committed as posted.

Sterling
Steven Bosscher - June 6, 2012, 10:49 p.m.
On Mon, Jun 4, 2012 at 7:53 PM, Sterling Augustine
<saugustine@google.com> wrote:
> On Fri, Jun 1, 2012 at 4:38 PM, Gabriel Dos Reis
> <gdr@integrable-solutions.net> wrote:
>> On Fri, Jun 1, 2012 at 6:07 PM, Sterling Augustine
>> <saugustine@google.com> wrote:
>>> After finding yet another bug in the previous patch dealing with pretty-printing
>>> decls for dwarf in canonical form, I have figured out a way to do it that is
>>> less invasive and much cleaner.
>>>
>>> This updated patch simply wraps the two entry points into the decl pretty-
>>> printer called from cxx_dwarf_name with new functions that set the
>>> appropriate flag on the pretty printer. This is much cleaner and avoids
>>> the need for translating flags for C++ pretty-printing into standard C
>>> pretty printing flags.
>>>
>>> OK for mainline?
>>
>> OK.
>
> Thanks! Committed as posted.

With a wrong ChangeLog:

        * 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/error.c (dump_decl): Check pp_c_flag_gnu_v3.
        (decl_as_dwarf_string, lang_decl_dwarf_name): New functions.
        (lang_decl_name): Handle namespace decls.
        * gcc/cp/cp-tree.h: Declare decl_as_dwarf_string, lang_decl_dwarf_name.
        * gcc/cp/cp-lang.c: Call them.

Changes for files in gcc/ go in gcc/ChangeLog.
Changes for files in gcc/cp go in gcc/cp/ChangeLog.
Changes for files in gcc/c-family go in gcc/c-family/ChangeLog.

The path is not pre-fixed. So:

c-family/
        * c-pretty-print.h (pp_c_flag_gnu_v3): New enumerator.
        * c-pretty-print.c (pp_c_specifier_qualifier_list): Check
        it at both the start and end of the function.

cp/
        * error.c (dump_decl): Check pp_c_flag_gnu_v3.
        (decl_as_dwarf_string, lang_decl_dwarf_name): New functions.
        (lang_decl_name): Handle namespace decls.
        * cp-tree.h: Declare decl_as_dwarf_string, lang_decl_dwarf_name.
        * cp-lang.c: Call them.

Can you please fix this?
You don't have to post such patches for review.

Ciao!
Steven
Sterling Augustine - June 6, 2012, 11:07 p.m.
On Wed, Jun 6, 2012 at 3:49 PM, Steven Bosscher <stevenb.gcc@gmail.com> wrote:
> On Mon, Jun 4, 2012 at 7:53 PM, Sterling Augustine
> <saugustine@google.com> wrote:
>> On Fri, Jun 1, 2012 at 4:38 PM, Gabriel Dos Reis
>> <gdr@integrable-solutions.net> wrote:
>>> On Fri, Jun 1, 2012 at 6:07 PM, Sterling Augustine
>>> <saugustine@google.com> wrote:
>>>> After finding yet another bug in the previous patch dealing with pretty-printing
>>>> decls for dwarf in canonical form, I have figured out a way to do it that is
>>>> less invasive and much cleaner.
>>>>
>>>> This updated patch simply wraps the two entry points into the decl pretty-
>>>> printer called from cxx_dwarf_name with new functions that set the
>>>> appropriate flag on the pretty printer. This is much cleaner and avoids
>>>> the need for translating flags for C++ pretty-printing into standard C
>>>> pretty printing flags.
>>>>
>>>> OK for mainline?
>>>
>>> OK.
>>
>> Thanks! Committed as posted.
>
> With a wrong ChangeLog:
>
>        * 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/error.c (dump_decl): Check pp_c_flag_gnu_v3.
>        (decl_as_dwarf_string, lang_decl_dwarf_name): New functions.
>        (lang_decl_name): Handle namespace decls.
>        * gcc/cp/cp-tree.h: Declare decl_as_dwarf_string, lang_decl_dwarf_name.
>        * gcc/cp/cp-lang.c: Call them.
>
> Changes for files in gcc/ go in gcc/ChangeLog.
> Changes for files in gcc/cp go in gcc/cp/ChangeLog.
> Changes for files in gcc/c-family go in gcc/c-family/ChangeLog.
>
> The path is not pre-fixed. So:
>
> c-family/
>        * c-pretty-print.h (pp_c_flag_gnu_v3): New enumerator.
>        * c-pretty-print.c (pp_c_specifier_qualifier_list): Check
>        it at both the start and end of the function.
>
> cp/
>        * error.c (dump_decl): Check pp_c_flag_gnu_v3.
>        (decl_as_dwarf_string, lang_decl_dwarf_name): New functions.
>        (lang_decl_name): Handle namespace decls.
>        * cp-tree.h: Declare decl_as_dwarf_string, lang_decl_dwarf_name.
>        * cp-lang.c: Call them.
>
> Can you please fix this?
> You don't have to post such patches for review.

Fixes committed as you recomend.

FWIW, the original entries were generated with contrib/mklog. Someone
may want to fix it to do the right thing in this case.
Gabriel Dos Reis - June 7, 2012, 12:25 a.m.
On Wed, Jun 6, 2012 at 6:07 PM, Sterling Augustine
<saugustine@google.com> wrote:
> On Wed, Jun 6, 2012 at 3:49 PM, Steven Bosscher <stevenb.gcc@gmail.com> wrote:
>> On Mon, Jun 4, 2012 at 7:53 PM, Sterling Augustine
>> <saugustine@google.com> wrote:
>>> On Fri, Jun 1, 2012 at 4:38 PM, Gabriel Dos Reis
>>> <gdr@integrable-solutions.net> wrote:
>>>> On Fri, Jun 1, 2012 at 6:07 PM, Sterling Augustine
>>>> <saugustine@google.com> wrote:
>>>>> After finding yet another bug in the previous patch dealing with pretty-printing
>>>>> decls for dwarf in canonical form, I have figured out a way to do it that is
>>>>> less invasive and much cleaner.
>>>>>
>>>>> This updated patch simply wraps the two entry points into the decl pretty-
>>>>> printer called from cxx_dwarf_name with new functions that set the
>>>>> appropriate flag on the pretty printer. This is much cleaner and avoids
>>>>> the need for translating flags for C++ pretty-printing into standard C
>>>>> pretty printing flags.
>>>>>
>>>>> OK for mainline?
>>>>
>>>> OK.
>>>
>>> Thanks! Committed as posted.
>>
>> With a wrong ChangeLog:
>>
>>        * 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/error.c (dump_decl): Check pp_c_flag_gnu_v3.
>>        (decl_as_dwarf_string, lang_decl_dwarf_name): New functions.
>>        (lang_decl_name): Handle namespace decls.
>>        * gcc/cp/cp-tree.h: Declare decl_as_dwarf_string, lang_decl_dwarf_name.
>>        * gcc/cp/cp-lang.c: Call them.
>>
>> Changes for files in gcc/ go in gcc/ChangeLog.
>> Changes for files in gcc/cp go in gcc/cp/ChangeLog.
>> Changes for files in gcc/c-family go in gcc/c-family/ChangeLog.
>>
>> The path is not pre-fixed. So:
>>
>> c-family/
>>        * c-pretty-print.h (pp_c_flag_gnu_v3): New enumerator.
>>        * c-pretty-print.c (pp_c_specifier_qualifier_list): Check
>>        it at both the start and end of the function.
>>
>> cp/
>>        * error.c (dump_decl): Check pp_c_flag_gnu_v3.
>>        (decl_as_dwarf_string, lang_decl_dwarf_name): New functions.
>>        (lang_decl_name): Handle namespace decls.
>>        * cp-tree.h: Declare decl_as_dwarf_string, lang_decl_dwarf_name.
>>        * cp-lang.c: Call them.
>>
>> Can you please fix this?
>> You don't have to post such patches for review.
>
> Fixes committed as you recomend.
>
> FWIW, the original entries were generated with contrib/mklog. Someone
> may want to fix it to do the right thing in this case.

My understanding is that it was designed for branches, which has different
ChangeLog entry policies.  This is trunk.

Patch

Index: gcc/c-family/c-pretty-print.c
===================================================================
--- gcc/c-family/c-pretty-print.c	(revision 188034)
+++ gcc/c-family/c-pretty-print.c	(working copy)
@@ -446,7 +446,7 @@ 
 {
   const enum tree_code code = TREE_CODE (t);
 
-  if (TREE_CODE (t) != POINTER_TYPE)
+  if (!(pp->flags & pp_c_flag_gnu_v3) && code != POINTER_TYPE)
     pp_c_type_qualifier_list (pp, t);
   switch (code)
     {
@@ -494,6 +494,8 @@ 
       pp_simple_type_specifier (pp, t);
       break;
     }
+  if ((pp->flags & pp_c_flag_gnu_v3) && code != 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 188034)
+++ gcc/c-family/c-pretty-print.h	(working copy)
@@ -30,7 +30,8 @@ 
 typedef enum
   {
      pp_c_flag_abstract = 1 << 1,
-     pp_c_flag_last_bit = 2
+     pp_c_flag_gnu_v3 = 1 << 2,
+     pp_c_flag_last_bit = 3
   } pp_c_pretty_print_flags;
 
 
Index: gcc/cp/error.c
===================================================================
--- gcc/cp/error.c	(revision 188034)
+++ gcc/cp/error.c	(working copy)
@@ -1028,7 +1028,12 @@ 
 	    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));
 	}
@@ -2556,7 +2561,22 @@ 
   return pp_formatted_text (cxx_pp);
 }
 
+/* Wrap decl_as_string with options appropriate for dwarf.  */
+
 const char *
+decl_as_dwarf_string (tree decl, int flags)
+{
+  const char *name;
+  /* Curiously, reinit_cxx_pp doesn't reset the flags field, so setting the flag
+     here will be adequate to get the desired behaviour.  */
+  pp_c_base (cxx_pp)->flags |= pp_c_flag_gnu_v3;
+  name = decl_as_string (decl, flags);
+  /* Subsequent calls to the pretty printer shouldn't use this style.  */
+  pp_c_base (cxx_pp)->flags &= ~pp_c_flag_gnu_v3;
+  return name;
+}
+
+const char *
 decl_as_string (tree decl, int flags)
 {
   reinit_cxx_pp ();
@@ -2573,6 +2593,21 @@ 
   return pp_formatted_text (cxx_pp);
 }
 
+/* Wrap lang_decl_name with options appropriate for dwarf.  */
+
+const char *
+lang_decl_dwarf_name (tree decl, int v, bool translate)
+{
+  const char *name;
+  /* Curiously, reinit_cxx_pp doesn't reset the flags field, so setting the flag
+     here will be adequate to get the desired behaviour.  */
+  pp_c_base (cxx_pp)->flags |= pp_c_flag_gnu_v3;
+  name = lang_decl_name (decl, v, translate);
+  /* Subsequent calls to the pretty printer shouldn't use this style.  */
+  pp_c_base (cxx_pp)->flags &= ~pp_c_flag_gnu_v3;
+  return name;
+}
+
 /* Generate the three forms of printable names for cxx_printable_name.  */
 
 const char *
@@ -2596,6 +2631,9 @@ 
 
   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 188034)
+++ gcc/cp/cp-lang.c	(working copy)
@@ -118,11 +118,11 @@ 
       && (ANON_AGGRNAME_P (DECL_NAME (t)) || LAMBDANAME_P (DECL_NAME (t))))
     return NULL;
   if (verbosity >= 2)
-    return decl_as_string (t,
-			   TFF_DECL_SPECIFIERS | TFF_UNQUALIFIED_NAME
-			   | TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS);
+    return decl_as_dwarf_string (t,
+                                 TFF_DECL_SPECIFIERS | TFF_UNQUALIFIED_NAME
+                                 | TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS);
 
-  return cxx_printable_name (t, verbosity);
+  return lang_decl_dwarf_name (t, verbosity, false);
 }
 
 static enum classify_record
Index: gcc/cp/cp-tree.h
===================================================================
--- gcc/cp/cp-tree.h	(revision 188034)
+++ gcc/cp/cp-tree.h	(working copy)
@@ -5169,8 +5169,10 @@ 
 extern const char *type_as_string_translate	(tree, int);
 extern const char *decl_as_string		(tree, int);
 extern const char *decl_as_string_translate	(tree, int);
+extern const char *decl_as_dwarf_string		(tree, int);
 extern const char *expr_as_string		(tree, int);
 extern const char *lang_decl_name		(tree, int, bool);
+extern const char *lang_decl_dwarf_name		(tree, int, bool);
 extern const char *language_to_string		(enum languages);
 extern const char *class_key_or_enum_as_string	(tree);
 extern void print_instantiation_context		(void);