summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2016-04-13 20:35:59 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2016-04-13 20:35:59 +0000
commitd11f9fe74c7bfaab9aab8ef09a6da9cd4f309cbd (patch)
tree0cac4a7a9e433c5534ba4454c22865d450fd9388
parent25c036a76d946bbac4c81da270068b996b81f33d (diff)
downloadgcc-d11f9fe74c7bfaab9aab8ef09a6da9cd4f309cbd.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234961 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/tree-pretty-print.c94
-rw-r--r--gcc/tree-sra.c2
3 files changed, 103 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e2ac9171a4d..328903d1c54 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+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.
+
2016-04-13 Jason Merrill <jason@redhat.com>
* cfgexpand.c (pass_expand::execute): Handle attribute "abi warning".
diff --git a/gcc/tree-pretty-print.c b/gcc/tree-pretty-print.c
index 39e3691a48f..f8a6b43219d 100644
--- a/gcc/tree-pretty-print.c
+++ b/gcc/tree-pretty-print.c
@@ -161,6 +161,85 @@ print_generic_expr (FILE *file, tree t, int flags)
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 node, int flags)
{
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, tree node, int spc, int flags,
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))
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 1d2b1c5ad05..6fafe559cf2 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -2132,6 +2132,7 @@ create_access_replacement (struct access *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 ipa_parm_adjustment *adj)
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;