On 10/11/2017 08:28 AM, Richard Biener wrote:
On Tue, Oct 10, 2017 at 3:03 PM, Nathan Sidwell <nat...@acm.org> wrote:
I have a patch cleaning up a bit of the C++ FE, which will involve hashing
via DECL_ASSEMBLER_NAME.  however, all the items in that hash are known to
have it set, so its mapping to a function call is undesirable.

Ok.

I broke the patch into two. This is the part introducing DECL_ASSEMBLER_NAME_RAW.

nathan
--
Nathan Sidwell
2017-10-11  Nathan Sidwell  <nat...@acm.org>

	* tree.h (DECL_ASSEMBLER_NAME_RAW): New.
	(SET_DECL_ASSEMBLER_NAME): Use it.
	(DECL_ASSEMBLER_NAME_SET_P): Likewise.
	(COPY_DECL_ASSEMBLER_NAME): Likewise.
	* tree.c (decl_assembler_name): Use DECL_ASSEMBLER_NAME_RAW.

	lto/
	* lto.c (mentions_vars_p_decl_with_vis): Use
	DECL_ASSEMBLER_NAME_RAW.
	(lto_fixup_prevailing_decls): Likewise.

	cp
	* decl2.c (struct mangled_decl_hash): Use DECL_ASSEMBLER_NAME_RAW.
	(record_mangling): Likewise.

Index: gcc/cp/decl2.c
===================================================================
--- gcc/cp/decl2.c	(revision 253645)
+++ gcc/cp/decl2.c	(working copy)
@@ -103,7 +103,7 @@ static GTY(()) vec<tree, va_gc> *no_link
 static GTY(()) vec<tree, va_gc> *mangling_aliases;
 
 /* hash traits for declarations.  Hashes single decls via
-   DECL_ASSEMBLER_NAME.  */
+   DECL_ASSEMBLER_NAME_RAW.  */
 
 struct mangled_decl_hash : ggc_remove <tree>
 {
@@ -112,11 +112,11 @@ struct mangled_decl_hash : ggc_remove <t
 
   static hashval_t hash (const value_type decl)
   {
-    return IDENTIFIER_HASH_VALUE (DECL_ASSEMBLER_NAME (decl));
+    return IDENTIFIER_HASH_VALUE (DECL_ASSEMBLER_NAME_RAW (decl));
   }
   static bool equal (const value_type existing, compare_type candidate)
   {
-    tree name = DECL_ASSEMBLER_NAME (existing);
+    tree name = DECL_ASSEMBLER_NAME_RAW (existing);
     return candidate == name;
   }
 
@@ -4399,7 +4399,7 @@ record_mangling (tree decl, bool need_wa
     mangled_decls = hash_table<mangled_decl_hash>::create_ggc (499);
 
   gcc_checking_assert (DECL_ASSEMBLER_NAME_SET_P (decl));
-  tree id = DECL_ASSEMBLER_NAME (decl);
+  tree id = DECL_ASSEMBLER_NAME_RAW (decl);
   tree *slot
     = mangled_decls->find_slot_with_hash (id, IDENTIFIER_HASH_VALUE (id),
 					  INSERT);
Index: gcc/lto/lto.c
===================================================================
--- gcc/lto/lto.c	(revision 253645)
+++ gcc/lto/lto.c	(working copy)
@@ -591,7 +591,7 @@ mentions_vars_p_decl_with_vis (tree t)
     return true;
 
   /* Accessor macro has side-effects, use field-name here. */
-  CHECK_NO_VAR (t->decl_with_vis.assembler_name);
+  CHECK_NO_VAR (DECL_ASSEMBLER_NAME_RAW (t));
   return false;
 }
 
@@ -2557,7 +2557,7 @@ lto_fixup_prevailing_decls (tree t)
 	}
       if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
 	{
-	  LTO_NO_PREVAIL (t->decl_with_vis.assembler_name);
+	  LTO_NO_PREVAIL (DECL_ASSEMBLER_NAME_RAW (t));
 	}
       if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
 	{
Index: gcc/tree.c
===================================================================
--- gcc/tree.c	(revision 253645)
+++ gcc/tree.c	(working copy)
@@ -671,7 +671,7 @@ decl_assembler_name (tree decl)
 {
   if (!DECL_ASSEMBLER_NAME_SET_P (decl))
     lang_hooks.set_decl_assembler_name (decl);
-  return DECL_WITH_VIS_CHECK (decl)->decl_with_vis.assembler_name;
+  return DECL_ASSEMBLER_NAME_RAW (decl);
 }
 
 /* When the target supports COMDAT groups, this indicates which group the
Index: gcc/tree.h
===================================================================
--- gcc/tree.h	(revision 253645)
+++ gcc/tree.h	(working copy)
@@ -2721,6 +2721,10 @@ extern void decl_value_expr_insert (tree
    LTO compilation and C++.  */
 #define DECL_ASSEMBLER_NAME(NODE) decl_assembler_name (NODE)
 
+/* Raw accessor for DECL_ASSEMBLE_NAME.  */
+#define DECL_ASSEMBLER_NAME_RAW(NODE) \
+  (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.assembler_name)
+
 /* Return true if NODE is a NODE that can contain a DECL_ASSEMBLER_NAME.
    This is true of all DECL nodes except FIELD_DECL.  */
 #define HAS_DECL_ASSEMBLER_NAME_P(NODE) \
@@ -2731,11 +2735,11 @@ extern void decl_value_expr_insert (tree
    yet.  */
 #define DECL_ASSEMBLER_NAME_SET_P(NODE) \
   (HAS_DECL_ASSEMBLER_NAME_P (NODE) \
-   && DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.assembler_name != NULL_TREE)
+   && DECL_ASSEMBLER_NAME_RAW (NODE) != NULL_TREE)
 
 /* Set the DECL_ASSEMBLER_NAME for NODE to NAME.  */
 #define SET_DECL_ASSEMBLER_NAME(NODE, NAME) \
-  (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.assembler_name = (NAME))
+  (DECL_ASSEMBLER_NAME_RAW (NODE) = (NAME))
 
 /* Copy the DECL_ASSEMBLER_NAME from DECL1 to DECL2.  Note that if DECL1's
    DECL_ASSEMBLER_NAME has not yet been set, using this macro will not cause
@@ -2747,10 +2751,7 @@ extern void decl_value_expr_insert (tree
    which will try to set the DECL_ASSEMBLER_NAME for DECL1.  */
 
 #define COPY_DECL_ASSEMBLER_NAME(DECL1, DECL2)				\
-  (DECL_ASSEMBLER_NAME_SET_P (DECL1)					\
-   ? (void) SET_DECL_ASSEMBLER_NAME (DECL2,				\
-				     DECL_ASSEMBLER_NAME (DECL1))	\
-   : (void) 0)
+  SET_DECL_ASSEMBLER_NAME (DECL2, DECL_ASSEMBLER_NAME_RAW (DECL1))
 
 /* Records the section name in a section attribute.  Used to pass
    the name from decl_attributes to make_function_rtl and make_decl_rtl.  */

Reply via email to