[PATCH] DECL_ASSEMBLER_NAME and friends

https://gcc.gnu.org/ml/gcc-patches/2017-10/msg00582.html
	* tree.h (DECL_ASSEMBLER_NAME_SET_P): Don't check
	HAS_DECL_ASSEMBLER_NAME_P.
	* gimple-expr.c (gimple_decl_printable_name: Check
	HAS_DECL_ASSEMBLER_NAME_P too.
	* ipa-utils.h (type_in_anonymous_namespace_p): Check
	DECL_ASSEMBLER_NAME_SET_P of TYPE_NAME.
	(odr_type_p): No need to assert TYPE_NAME is a TYPE_DECL.
	* passes.c (rest_of_decl_compilation): Check
	HAS_DECL_ASSEMBLER_NAME_P too.
	* recog.c (verify_changes): Likewise.
	* tree-pretty-print.c (dump_decl_name): Likewise.
	* tree-ssa-structalias.c (alias_get_name): Likewise.  Reimplement.

	c/
	* c-decl.c (grokdeclarator): Check HAS_DECL_ASSEMBLER_NAME_P too.

From-SVN: r253649
This commit is contained in:
Nathan Sidwell 2017-10-11 16:35:18 +00:00 committed by Nathan Sidwell
parent 4e7d02606e
commit a92f67261a
10 changed files with 61 additions and 48 deletions

View File

@ -1,5 +1,18 @@
2017-10-11 Nathan Sidwell <nathan@acm.org> 2017-10-11 Nathan Sidwell <nathan@acm.org>
* tree.h (DECL_ASSEMBLER_NAME_SET_P): Don't check
HAS_DECL_ASSEMBLER_NAME_P.
* gimple-expr.c (gimple_decl_printable_name: Check
HAS_DECL_ASSEMBLER_NAME_P too.
* ipa-utils.h (type_in_anonymous_namespace_p): Check
DECL_ASSEMBLER_NAME_SET_P of TYPE_NAME.
(odr_type_p): No need to assert TYPE_NAME is a TYPE_DECL.
* passes.c (rest_of_decl_compilation): Check
HAS_DECL_ASSEMBLER_NAME_P too.
* recog.c (verify_changes): Likewise.
* tree-pretty-print.c (dump_decl_name): Likewise.
* tree-ssa-structalias.c (alias_get_name): Likewise. Reimplement.
* tree.h (DECL_ASSEMBLER_NAME_RAW): New. * tree.h (DECL_ASSEMBLER_NAME_RAW): New.
(SET_DECL_ASSEMBLER_NAME): Use it. (SET_DECL_ASSEMBLER_NAME): Use it.
(DECL_ASSEMBLER_NAME_SET_P): Likewise. (DECL_ASSEMBLER_NAME_SET_P): Likewise.

View File

@ -1,3 +1,7 @@
2017-10-11 Nathan Sidwell <nathan@acm.org>
* c-decl.c (grokdeclarator): Check HAS_DECL_ASSEMBLER_NAME_P too.
2017-10-10 Richard Sandiford <richard.sandiford@linaro.org> 2017-10-10 Richard Sandiford <richard.sandiford@linaro.org>
* c-parser.c (c_parser_cilk_clause_vectorlength): Use wi::to_wide when * c-parser.c (c_parser_cilk_clause_vectorlength): Use wi::to_wide when

View File

@ -7011,7 +7011,8 @@ grokdeclarator (const struct c_declarator *declarator,
/* This is the earliest point at which we might know the assembler /* This is the earliest point at which we might know the assembler
name of a variable. Thus, if it's known before this, die horribly. */ name of a variable. Thus, if it's known before this, die horribly. */
gcc_assert (!DECL_ASSEMBLER_NAME_SET_P (decl)); gcc_assert (!HAS_DECL_ASSEMBLER_NAME_P (decl)
|| !DECL_ASSEMBLER_NAME_SET_P (decl));
if (warn_cxx_compat if (warn_cxx_compat
&& VAR_P (decl) && VAR_P (decl)

View File

@ -337,9 +337,8 @@ gimple_decl_printable_name (tree decl, int verbosity)
if (!DECL_NAME (decl)) if (!DECL_NAME (decl))
return NULL; return NULL;
if (DECL_ASSEMBLER_NAME_SET_P (decl)) if (HAS_DECL_ASSEMBLER_NAME_P (decl) && DECL_ASSEMBLER_NAME_SET_P (decl))
{ {
const char *str, *mangled_str;
int dmgl_opts = DMGL_NO_OPTS; int dmgl_opts = DMGL_NO_OPTS;
if (verbosity >= 2) if (verbosity >= 2)
@ -352,9 +351,10 @@ gimple_decl_printable_name (tree decl, int verbosity)
dmgl_opts |= DMGL_PARAMS; dmgl_opts |= DMGL_PARAMS;
} }
mangled_str = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); const char *mangled_str
str = cplus_demangle_v3 (mangled_str, dmgl_opts); = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME_RAW (decl));
return (str) ? str : mangled_str; const char *str = cplus_demangle_v3 (mangled_str, dmgl_opts);
return str ? str : mangled_str;
} }
return IDENTIFIER_POINTER (DECL_NAME (decl)); return IDENTIFIER_POINTER (DECL_NAME (decl));

View File

@ -217,11 +217,11 @@ type_in_anonymous_namespace_p (const_tree t)
{ {
/* C++ FE uses magic <anon> as assembler names of anonymous types. /* C++ FE uses magic <anon> as assembler names of anonymous types.
verify that this match with type_in_anonymous_namespace_p. */ verify that this match with type_in_anonymous_namespace_p. */
gcc_checking_assert (!in_lto_p || !DECL_ASSEMBLER_NAME_SET_P (t) gcc_checking_assert (!in_lto_p
|| !strcmp || !DECL_ASSEMBLER_NAME_SET_P (TYPE_NAME (t))
("<anon>", || !strcmp ("<anon>",
IDENTIFIER_POINTER IDENTIFIER_POINTER
(DECL_ASSEMBLER_NAME (TYPE_NAME (t))))); (DECL_ASSEMBLER_NAME (TYPE_NAME (t)))));
return true; return true;
} }
return false; return false;
@ -245,14 +245,13 @@ odr_type_p (const_tree t)
if (type_in_anonymous_namespace_p (t)) if (type_in_anonymous_namespace_p (t))
return true; return true;
if (TYPE_NAME (t) && TREE_CODE (TYPE_NAME (t)) == TYPE_DECL if (TYPE_NAME (t) && DECL_ASSEMBLER_NAME_SET_P (TYPE_NAME (t)))
&& DECL_ASSEMBLER_NAME_SET_P (TYPE_NAME (t)))
{ {
/* C++ FE uses magic <anon> as assembler names of anonymous types. /* C++ FE uses magic <anon> as assembler names of anonymous types.
verify that this match with type_in_anonymous_namespace_p. */ verify that this match with type_in_anonymous_namespace_p. */
gcc_checking_assert (strcmp ("<anon>", gcc_checking_assert (strcmp ("<anon>",
IDENTIFIER_POINTER IDENTIFIER_POINTER
(DECL_ASSEMBLER_NAME (TYPE_NAME (t))))); (DECL_ASSEMBLER_NAME (TYPE_NAME (t)))));
return true; return true;
} }
return false; return false;

View File

@ -197,7 +197,9 @@ rest_of_decl_compilation (tree decl,
/* Can't defer this, because it needs to happen before any /* Can't defer this, because it needs to happen before any
later function definitions are processed. */ later function definitions are processed. */
if (DECL_ASSEMBLER_NAME_SET_P (decl) && DECL_REGISTER (decl)) if (HAS_DECL_ASSEMBLER_NAME_P (decl)
&& DECL_ASSEMBLER_NAME_SET_P (decl)
&& DECL_REGISTER (decl))
make_decl_rtl (decl); make_decl_rtl (decl);
/* Forward declarations for nested functions are not "external", /* Forward declarations for nested functions are not "external",

View File

@ -408,6 +408,7 @@ verify_changes (int num)
&& REG_P (changes[i].old) && REG_P (changes[i].old)
&& asm_noperands (PATTERN (object)) > 0 && asm_noperands (PATTERN (object)) > 0
&& REG_EXPR (changes[i].old) != NULL_TREE && REG_EXPR (changes[i].old) != NULL_TREE
&& HAS_DECL_ASSEMBLER_NAME_P (REG_EXPR (changes[i].old))
&& DECL_ASSEMBLER_NAME_SET_P (REG_EXPR (changes[i].old)) && DECL_ASSEMBLER_NAME_SET_P (REG_EXPR (changes[i].old))
&& DECL_REGISTER (REG_EXPR (changes[i].old))) && DECL_REGISTER (REG_EXPR (changes[i].old)))
{ {

View File

@ -249,8 +249,10 @@ dump_decl_name (pretty_printer *pp, tree node, dump_flags_t flags)
{ {
if (DECL_NAME (node)) if (DECL_NAME (node))
{ {
if ((flags & TDF_ASMNAME) && DECL_ASSEMBLER_NAME_SET_P (node)) if ((flags & TDF_ASMNAME)
pp_tree_identifier (pp, DECL_ASSEMBLER_NAME (node)); && HAS_DECL_ASSEMBLER_NAME_P (node)
&& DECL_ASSEMBLER_NAME_SET_P (node))
pp_tree_identifier (pp, DECL_ASSEMBLER_NAME_RAW (node));
/* For DECL_NAMELESS names look for embedded uids in the /* For DECL_NAMELESS names look for embedded uids in the
names and sanitize them for TDF_NOUID. */ names and sanitize them for TDF_NOUID. */
else if ((flags & TDF_NOUID) && DECL_NAMELESS (node)) else if ((flags & TDF_NOUID) && DECL_NAMELESS (node))

View File

@ -2849,41 +2849,33 @@ lookup_vi_for_tree (tree t)
static const char * static const char *
alias_get_name (tree decl) alias_get_name (tree decl)
{ {
const char *res = NULL; const char *res = "NULL";
char *temp; if (dump_file)
if (!dump_file)
return "NULL";
if (TREE_CODE (decl) == SSA_NAME)
{ {
res = get_name (decl); char *temp = NULL;
if (res) if (TREE_CODE (decl) == SSA_NAME)
temp = xasprintf ("%s_%u", res, SSA_NAME_VERSION (decl)); {
else res = get_name (decl);
temp = xasprintf ("_%u", SSA_NAME_VERSION (decl)); temp = xasprintf ("%s_%u", res ? res : "", SSA_NAME_VERSION (decl));
res = ggc_strdup (temp); }
free (temp); else if (HAS_DECL_ASSEMBLER_NAME_P (decl)
} && DECL_ASSEMBLER_NAME_SET_P (decl))
else if (DECL_P (decl)) res = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME_RAW (decl));
{ else if (DECL_P (decl))
if (DECL_ASSEMBLER_NAME_SET_P (decl))
res = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
else
{ {
res = get_name (decl); res = get_name (decl);
if (!res) if (!res)
{ temp = xasprintf ("D.%u", DECL_UID (decl));
temp = xasprintf ("D.%u", DECL_UID (decl)); }
res = ggc_strdup (temp);
free (temp); if (temp)
} {
res = ggc_strdup (temp);
free (temp);
} }
} }
if (res != NULL)
return res;
return "NULL"; return res;
} }
/* Find the variable id for tree T in the map. /* Find the variable id for tree T in the map.

View File

@ -2734,8 +2734,7 @@ extern void decl_value_expr_insert (tree, tree);
the NODE might still have a DECL_ASSEMBLER_NAME -- it just hasn't been set the NODE might still have a DECL_ASSEMBLER_NAME -- it just hasn't been set
yet. */ yet. */
#define DECL_ASSEMBLER_NAME_SET_P(NODE) \ #define DECL_ASSEMBLER_NAME_SET_P(NODE) \
(HAS_DECL_ASSEMBLER_NAME_P (NODE) \ (DECL_ASSEMBLER_NAME_RAW (NODE) != NULL_TREE)
&& DECL_ASSEMBLER_NAME_RAW (NODE) != NULL_TREE)
/* Set the DECL_ASSEMBLER_NAME for NODE to NAME. */ /* Set the DECL_ASSEMBLER_NAME for NODE to NAME. */
#define SET_DECL_ASSEMBLER_NAME(NODE, NAME) \ #define SET_DECL_ASSEMBLER_NAME(NODE, NAME) \