Message ID | 20160413143225.GO19207@tucnak.redhat.com |
---|---|
State | New |
Headers | show |
On April 13, 2016 4:32:25 PM GMT+02:00, Jakub Jelinek <jakub@redhat.com> wrote: >On Wed, Apr 13, 2016 at 09:25:56AM +0200, Richard Biener wrote: >> So if you think it's not acceptable to drop the relation between >> the artificial number used by SRA and the original UID then go >> with a hash-map unconditionally. You still have to dump and lookup >> the actual relation though - there's no way around this unless you >> hack dump-final-insns to filter DECL names (maybe just make it >> strip all DECL_ARTIFICIAL names completely?) > >Here is an alternative patch, keep the fancy names as before, >but in TDF_NOUID dumps sanitize them. Most of the DECL_NAMELESS >decls other than ones with the SRA fancy names should not contain >anything that would be tweaked for the printout, and doing it this >way has the advantage that one can always just use flags without >TDF_NOUID >to see the real fancy names. > >Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? OK. Richard. >2016-04-13 Jakub Jelinek <jakub@redhat.com> > > PR c++/70594 > * tree-sra.c (create_access_replacement, > get_replaced_param_substitute): Set DECL_NAMELESS on repl if it > gets fancy name. > * tree-pretty-print.c (dump_fancy_name): New function. > (dump_decl_name, dump_generic_node): Use it. > >--- gcc/tree-sra.c.jj 2016-04-12 19:12:34.000000000 +0200 >+++ gcc/tree-sra.c 2016-04-13 13:52:28.329925560 +0200 >@@ -2132,6 +2132,7 @@ create_access_replacement (struct access > bool fail = false; > > DECL_NAME (repl) = get_identifier (pretty_name); >+ DECL_NAMELESS (repl) = 1; > obstack_free (&name_obstack, pretty_name); > > /* Get rid of any SSA_NAMEs embedded in debug_expr, >@@ -4704,6 +4705,7 @@ get_replaced_param_substitute (struct ip > > repl = create_tmp_reg (TREE_TYPE (adj->base), "ISR"); > DECL_NAME (repl) = get_identifier (pretty_name); >+ DECL_NAMELESS (repl) = 1; > obstack_free (&name_obstack, pretty_name); > > adj->new_ssa_base = repl; >--- gcc/tree-pretty-print.c.jj 2016-03-17 16:54:44.000000000 +0100 >+++ gcc/tree-pretty-print.c 2016-04-13 14:10:59.667085487 +0200 >@@ -161,6 +161,85 @@ print_generic_expr (FILE *file, tree t, > pp_flush (tree_pp); > } > >+/* Dump NAME, an IDENTIFIER_POINTER, sanitized so that D<num> >sequences >+ in it are replaced with Dxxxx, as long as they are at the start or >+ preceded by $ and at the end or followed by $. See make_fancy_name >+ in tree-sra.c. */ >+ >+static void >+dump_fancy_name (pretty_printer *pp, tree name) >+{ >+ int cnt = 0; >+ int length = IDENTIFIER_LENGTH (name); >+ const char *n = IDENTIFIER_POINTER (name); >+ do >+ { >+ n = strchr (n, 'D'); >+ if (n == NULL) >+ break; >+ if (ISDIGIT (n[1]) >+ && (n == IDENTIFIER_POINTER (name) || n[-1] == '$')) >+ { >+ int l = 2; >+ while (ISDIGIT (n[l])) >+ l++; >+ if (n[l] == '\0' || n[l] == '$') >+ { >+ cnt++; >+ length += 5 - l; >+ } >+ n += l; >+ } >+ else >+ n++; >+ } >+ while (1); >+ if (cnt == 0) >+ { >+ pp_tree_identifier (pp, name); >+ return; >+ } >+ >+ char *str = XNEWVEC (char, length + 1); >+ char *p = str; >+ const char *q; >+ q = n = IDENTIFIER_POINTER (name); >+ do >+ { >+ q = strchr (q, 'D'); >+ if (q == NULL) >+ break; >+ if (ISDIGIT (q[1]) >+ && (q == IDENTIFIER_POINTER (name) || q[-1] == '$')) >+ { >+ int l = 2; >+ while (ISDIGIT (q[l])) >+ l++; >+ if (q[l] == '\0' || q[l] == '$') >+ { >+ memcpy (p, n, q - n); >+ memcpy (p + (q - n), "Dxxxx", 5); >+ p += (q - n) + 5; >+ n = q + l; >+ } >+ q += l; >+ } >+ else >+ q++; >+ } >+ while (1); >+ memcpy (p, n, IDENTIFIER_LENGTH (name) - (n - IDENTIFIER_POINTER >(name))); >+ str[length] = '\0'; >+ if (pp_translate_identifiers (pp)) >+ { >+ const char *text = identifier_to_locale (str); >+ pp_append_text (pp, text, text + strlen (text)); >+ } >+ else >+ pp_append_text (pp, str, str + length); >+ XDELETEVEC (str); >+} >+ > /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set > in FLAGS. */ > >@@ -171,6 +250,10 @@ dump_decl_name (pretty_printer *pp, tree > { > if ((flags & TDF_ASMNAME) && DECL_ASSEMBLER_NAME_SET_P (node)) > pp_tree_identifier (pp, DECL_ASSEMBLER_NAME (node)); >+ /* For DECL_NAMELESS names look for embedded uids in the >+ names and sanitize them for TDF_NOUID. */ >+ else if ((flags & TDF_NOUID) && DECL_NAMELESS (node)) >+ dump_fancy_name (pp, DECL_NAME (node)); > else > pp_tree_identifier (pp, DECL_NAME (node)); > } >@@ -2593,8 +2676,15 @@ dump_generic_node (pretty_printer *pp, t > > case SSA_NAME: > if (SSA_NAME_IDENTIFIER (node)) >- dump_generic_node (pp, SSA_NAME_IDENTIFIER (node), >- spc, flags, false); >+ { >+ if ((flags & TDF_NOUID) >+ && SSA_NAME_VAR (node) >+ && DECL_NAMELESS (SSA_NAME_VAR (node))) >+ dump_fancy_name (pp, SSA_NAME_IDENTIFIER (node)); >+ else >+ dump_generic_node (pp, SSA_NAME_IDENTIFIER (node), >+ spc, flags, false); >+ } > pp_underscore (pp); > pp_decimal_int (pp, SSA_NAME_VERSION (node)); > if (SSA_NAME_IS_DEFAULT_DEF (node)) > > > Jakub
--- gcc/tree-sra.c.jj 2016-04-12 19:12:34.000000000 +0200 +++ gcc/tree-sra.c 2016-04-13 13:52:28.329925560 +0200 @@ -2132,6 +2132,7 @@ create_access_replacement (struct access bool fail = false; DECL_NAME (repl) = get_identifier (pretty_name); + DECL_NAMELESS (repl) = 1; obstack_free (&name_obstack, pretty_name); /* Get rid of any SSA_NAMEs embedded in debug_expr, @@ -4704,6 +4705,7 @@ get_replaced_param_substitute (struct ip repl = create_tmp_reg (TREE_TYPE (adj->base), "ISR"); DECL_NAME (repl) = get_identifier (pretty_name); + DECL_NAMELESS (repl) = 1; obstack_free (&name_obstack, pretty_name); adj->new_ssa_base = repl; --- gcc/tree-pretty-print.c.jj 2016-03-17 16:54:44.000000000 +0100 +++ gcc/tree-pretty-print.c 2016-04-13 14:10:59.667085487 +0200 @@ -161,6 +161,85 @@ print_generic_expr (FILE *file, tree t, pp_flush (tree_pp); } +/* Dump NAME, an IDENTIFIER_POINTER, sanitized so that D<num> sequences + in it are replaced with Dxxxx, as long as they are at the start or + preceded by $ and at the end or followed by $. See make_fancy_name + in tree-sra.c. */ + +static void +dump_fancy_name (pretty_printer *pp, tree name) +{ + int cnt = 0; + int length = IDENTIFIER_LENGTH (name); + const char *n = IDENTIFIER_POINTER (name); + do + { + n = strchr (n, 'D'); + if (n == NULL) + break; + if (ISDIGIT (n[1]) + && (n == IDENTIFIER_POINTER (name) || n[-1] == '$')) + { + int l = 2; + while (ISDIGIT (n[l])) + l++; + if (n[l] == '\0' || n[l] == '$') + { + cnt++; + length += 5 - l; + } + n += l; + } + else + n++; + } + while (1); + if (cnt == 0) + { + pp_tree_identifier (pp, name); + return; + } + + char *str = XNEWVEC (char, length + 1); + char *p = str; + const char *q; + q = n = IDENTIFIER_POINTER (name); + do + { + q = strchr (q, 'D'); + if (q == NULL) + break; + if (ISDIGIT (q[1]) + && (q == IDENTIFIER_POINTER (name) || q[-1] == '$')) + { + int l = 2; + while (ISDIGIT (q[l])) + l++; + if (q[l] == '\0' || q[l] == '$') + { + memcpy (p, n, q - n); + memcpy (p + (q - n), "Dxxxx", 5); + p += (q - n) + 5; + n = q + l; + } + q += l; + } + else + q++; + } + while (1); + memcpy (p, n, IDENTIFIER_LENGTH (name) - (n - IDENTIFIER_POINTER (name))); + str[length] = '\0'; + if (pp_translate_identifiers (pp)) + { + const char *text = identifier_to_locale (str); + pp_append_text (pp, text, text + strlen (text)); + } + else + pp_append_text (pp, str, str + length); + XDELETEVEC (str); +} + /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set in FLAGS. */ @@ -171,6 +250,10 @@ dump_decl_name (pretty_printer *pp, tree { if ((flags & TDF_ASMNAME) && DECL_ASSEMBLER_NAME_SET_P (node)) pp_tree_identifier (pp, DECL_ASSEMBLER_NAME (node)); + /* For DECL_NAMELESS names look for embedded uids in the + names and sanitize them for TDF_NOUID. */ + else if ((flags & TDF_NOUID) && DECL_NAMELESS (node)) + dump_fancy_name (pp, DECL_NAME (node)); else pp_tree_identifier (pp, DECL_NAME (node)); } @@ -2593,8 +2676,15 @@ dump_generic_node (pretty_printer *pp, t case SSA_NAME: if (SSA_NAME_IDENTIFIER (node)) - dump_generic_node (pp, SSA_NAME_IDENTIFIER (node), - spc, flags, false); + { + if ((flags & TDF_NOUID) + && SSA_NAME_VAR (node) + && DECL_NAMELESS (SSA_NAME_VAR (node))) + dump_fancy_name (pp, SSA_NAME_IDENTIFIER (node)); + else + dump_generic_node (pp, SSA_NAME_IDENTIFIER (node), + spc, flags, false); + } pp_underscore (pp); pp_decimal_int (pp, SSA_NAME_VERSION (node)); if (SSA_NAME_IS_DEFAULT_DEF (node))