[PATCH] Commonize anon-name generation
authorNathan Sidwell <nathan@acm.org>
Tue, 28 May 2019 13:31:16 +0000 (13:31 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 28 May 2019 13:31:16 +0000 (13:31 +0000)
https://gcc.gnu.org/ml/gcc-patches/2019-05/msg01699.html
* tree.h (IDENTIFIER_ANON_P): New.
(anon_aggrname_format, anon_aggname_p): Don't declare.
(make_anon_name): Declare.
* lto-streamer-out.c (DFS::DFS_write_tree_body): Use IDENTIFIER_ANON_P.
(hash_tree): Likewise.
* tree-streamer-out.c (write_ts_decl_minimal_tree): Likewise.
* tree.c (anon_aggrname_p, anon_aggrname_format): Delete.
(anon_cnt, make_anon_name): New.

  gcc/cp/
* cp-tree.h (make_anon_name): Drop declaration.
(TYPE_UNNAMED_P): Use IDENTIFIER_ANON_P.
* cp-lang.c (cxx_dwarf_name): Likewise.
* class.c (find_flexarrays): Likewise.
* decl.c (name_unnamed_type, xref_tag_1): Likewise.
* error.c (dump_aggr_type): Likewise.
* pt.c (push_template_decl_real): Likewise.
* name-lookup.c (consider_binding_level): Likewise.
(anon_cnt, make_anon_name): Delete.

gcc/d/
* types.cc (fixup_anonymous_offset): Use IDENTIFIER_ANON_P.
(layout_aggregate_members): Use make_anon_name.

From-SVN: r271702

15 files changed:
gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/cp-lang.c
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/error.c
gcc/cp/name-lookup.c
gcc/cp/pt.c
gcc/d/ChangeLog
gcc/d/types.cc
gcc/lto-streamer-out.c
gcc/tree-streamer-out.c
gcc/tree.c
gcc/tree.h

index ad36bddd894952f2fb538f57b5e1b6c33d962039..1bbe8950e9942dfb5e973b1c1282538aa300e5dd 100644 (file)
@@ -1,3 +1,14 @@
+2019-05-28  Nathan Sidwell  <nathan@acm.org>
+
+       * tree.h (IDENTIFIER_ANON_P): New.
+       (anon_aggrname_format, anon_aggname_p): Don't declare.
+       (make_anon_name): Declare.
+       * lto-streamer-out.c (DFS::DFS_write_tree_body): Use IDENTIFIER_ANON_P.
+       (hash_tree): Likewise.
+       * tree-streamer-out.c (write_ts_decl_minimal_tree): Likewise.
+       * tree.c (anon_aggrname_p, anon_aggrname_format): Delete.
+       (anon_cnt, make_anon_name): New.
+
 2019-05-28  Martin Liska  <mliska@suse.cz>
 
        PR other/90315
index 0c37f55fe25881559c5f1f0b0d2d321aad200258..001c53ee1fcf7b1583e7a398ba883347713d9c05 100644 (file)
@@ -1,3 +1,15 @@
+2019-05-28  Nathan Sidwell  <nathan@acm.org>
+
+       * cp-tree.h (make_anon_name): Drop declaration.
+       (TYPE_UNNAMED_P): Use IDENTIFIER_ANON_P.
+       * cp-lang.c (cxx_dwarf_name): Likewise.
+       * class.c (find_flexarrays): Likewise.
+       * decl.c (name_unnamed_type, xref_tag_1): Likewise.
+       * error.c (dump_aggr_type): Likewise.
+       * pt.c (push_template_decl_real): Likewise.
+       * name-lookup.c (consider_binding_level): Likewise.
+       (anon_cnt, make_anon_name): Delete.
+
 2019-05-25  Marek Polacek  <polacek@redhat.com>
 
        PR c++/90572 - wrong disambiguation in friend declaration.
index ed885a5a2c18c9f828ddb5880ac81ed0745d3c5d..a2585a61f96bfc32617ece38af8f02c176405c5f 100644 (file)
@@ -6585,7 +6585,7 @@ find_flexarrays (tree t, flexmems_t *fmem, bool base_p,
       if (TREE_CODE (fld) == TYPE_DECL
          && DECL_IMPLICIT_TYPEDEF_P (fld)
          && CLASS_TYPE_P (TREE_TYPE (fld))
-         && anon_aggrname_p (DECL_NAME (fld)))
+         && IDENTIFIER_ANON_P (DECL_NAME (fld)))
        {
          /* Check the nested unnamed type referenced via a typedef
             independently of FMEM (since it's not a data member of
index 9dc3659c21055290f809e78e5e4835c8d49f50d5..b725dece4bb54232ce88dc611072e4d99aeb6591 100644 (file)
@@ -110,7 +110,7 @@ cxx_dwarf_name (tree t, int verbosity)
   gcc_assert (DECL_P (t));
 
   if (DECL_NAME (t)
-      && (anon_aggrname_p (DECL_NAME (t)) || LAMBDA_TYPE_P (t)))
+      && (IDENTIFIER_ANON_P (DECL_NAME (t)) || LAMBDA_TYPE_P (t)))
     return NULL;
   if (verbosity >= 2)
     return decl_as_dwarf_string (t,
index fb5470dd8c2cbad60c934b2895461bef280362d8..7a74fd4fac5696473d960dd09731753b930b5942 100644 (file)
@@ -1937,7 +1937,7 @@ enum languages { lang_c, lang_cplusplus };
 
 /* Nonzero if NODE has no name for linkage purposes.  */
 #define TYPE_UNNAMED_P(NODE) \
-  (OVERLOAD_TYPE_P (NODE) && anon_aggrname_p (TYPE_LINKAGE_IDENTIFIER (NODE)))
+  (OVERLOAD_TYPE_P (NODE) && IDENTIFIER_ANON_P (TYPE_LINKAGE_IDENTIFIER (NODE)))
 
 /* The _DECL for this _TYPE.  */
 #define TYPE_MAIN_DECL(NODE) (TYPE_STUB_DECL (TYPE_MAIN_VARIANT (NODE)))
@@ -6350,7 +6350,6 @@ extern tree strip_fnptr_conv                      (tree);
 
 /* in name-lookup.c */
 extern void maybe_push_cleanup_level           (tree);
-extern tree make_anon_name                     (void);
 extern tree maybe_push_decl                    (tree);
 extern tree current_decl_namespace             (void);
 
index 19d14a6a5e9f0ffa89a25749360208a90ad3f455..5b22f65ec8d295ba27718b90e71581be9b95190f 100644 (file)
@@ -10233,15 +10233,12 @@ name_unnamed_type (tree type, tree decl)
 
   /* Replace the anonymous name with the real name everywhere.  */
   for (tree t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
-    {
-      if (anon_aggrname_p (TYPE_IDENTIFIER (t)))
-       /* We do not rename the debug info representing the
-          unnamed tagged type because the standard says in
-          [dcl.typedef] that the naming applies only for
-          linkage purposes.  */
-       /*debug_hooks->set_name (t, decl);*/
-       TYPE_NAME (t) = decl;
-    }
+    if (IDENTIFIER_ANON_P (TYPE_IDENTIFIER (t)))
+      /* We do not rename the debug info representing the unnamed
+        tagged type because the standard says in [dcl.typedef] that
+        the naming applies only for linkage purposes.  */
+      /*debug_hooks->set_name (t, decl);*/
+      TYPE_NAME (t) = decl;
 
   if (TYPE_LANG_SPECIFIC (type))
     TYPE_WAS_UNNAMED (type) = 1;
@@ -14061,7 +14058,7 @@ xref_tag_1 (enum tag_types tag_code, tree name,
   /* In case of anonymous name, xref_tag is only called to
      make type node and push name.  Name lookup is not required.  */
   tree t = NULL_TREE;
-  if (scope != ts_lambda && !anon_aggrname_p (name))
+  if (scope != ts_lambda && !IDENTIFIER_ANON_P (name))
     t = lookup_and_check_tag  (tag_code, name, scope, template_header_p);
   
   if (t == error_mark_node)
index 4a0aed2b7256de2f91128020c6953de0ec1ff732..5e7c36d869862c31347b775b5448cf137e938134 100644 (file)
@@ -738,7 +738,7 @@ dump_aggr_type (cxx_pretty_printer *pp, tree t, int flags)
       name = DECL_NAME (name);
     }
 
-  if (name == 0 || anon_aggrname_p (name))
+  if (!name || IDENTIFIER_ANON_P (name))
     {
       if (flags & TFF_CLASS_KEY_OR_ENUM)
        pp_string (pp, M_("<unnamed>"));
index 0dcaf65165694053e964d7bc632d6bd2f0680746..242e30f8a125a971b663d09ec25f26bf3bf7f22f 100644 (file)
@@ -3797,25 +3797,9 @@ constructor_name_p (tree name, tree type)
   return false;
 }
 
-/* Counter used to create anonymous type names.  */
-
-static GTY(()) int anon_cnt;
-
-/* Return an IDENTIFIER which can be used as a name for
-   unnamed structs and unions.  */
-
-tree
-make_anon_name (void)
-{
-  char buf[32];
-
-  sprintf (buf, anon_aggrname_format (), anon_cnt++);
-  return get_identifier (buf);
-}
-
-/* This code is practically identical to that for creating
-   anonymous names, but is just used for lambdas instead.  This isn't really
-   necessary, but it's convenient to avoid treating lambdas like other
+/* This code is practically identical to that for creating anonymous
+   names, but is just used for lambdas instead.  This isn't really
+   necessary, but it's convenient to avoid mistaking lambdas for other
    unnamed types.  */
 
 static GTY(()) int lambda_cnt = 0;
@@ -5982,7 +5966,7 @@ consider_binding_level (tree name, best_match <tree, const char *> &bm,
 
       /* Don't suggest names that are for anonymous aggregate types, as
         they are an implementation detail generated by the compiler.  */
-      if (anon_aggrname_p (suggestion))
+      if (IDENTIFIER_ANON_P (suggestion))
        continue;
 
       const char *suggestion_str = IDENTIFIER_POINTER (suggestion);
index 592adfcf5c1c1c4a53e7c42b7b3e83417f7b2c59..e52668ab49d6b80301ccffffbb9d7094d25a964a 100644 (file)
@@ -5501,7 +5501,7 @@ push_template_decl_real (tree decl, bool is_friend)
       if (DECL_CLASS_SCOPE_P (decl))
        member_template_p = true;
       if (TREE_CODE (decl) == TYPE_DECL
-         && anon_aggrname_p (DECL_NAME (decl)))
+         && IDENTIFIER_ANON_P (DECL_NAME (decl)))
        {
          error ("template class without a name");
          return error_mark_node;
index b6ac2f8f080a041e8547378a9d383c3c4ee2fe91..800dcb0abbce925962e0ae0f285d3866c26afd74 100644 (file)
@@ -1,3 +1,8 @@
+2019-05-24  Nathan Sidwell  <nathan@acm.org>
+
+       * types.cc (fixup_anonymous_offset): Use IDENTIFIER_ANON_P.
+       (layout_aggregate_members): Use make_anon_name.
+
 2019-05-16  Martin Sebor  <msebor@redhat.com>
 
         * d-builtins.cc (d_init_builtins): Quote keywords, operators,
index cdbfbb7d0034e64f88e58887a6de8e824e6d9cd8..8f0aa37f578b6330bb0dd9e82477229798b92e0d 100644 (file)
@@ -239,7 +239,7 @@ fixup_anonymous_offset (tree fields, tree offset)
       /* Traverse all nested anonymous aggregates to update their offset.
         Set the anonymous decl offset to its first member.  */
       tree ftype = TREE_TYPE (fields);
-      if (TYPE_NAME (ftype) && anon_aggrname_p (TYPE_IDENTIFIER (ftype)))
+      if (TYPE_NAME (ftype) && IDENTIFIER_ANON_P (TYPE_IDENTIFIER (ftype)))
        {
          tree vfields = TYPE_FIELDS (ftype);
          fixup_anonymous_offset (vfields, offset);
@@ -324,12 +324,7 @@ layout_aggregate_members (Dsymbols *members, tree context, bool inherited_p)
       AnonDeclaration *ad = sym->isAnonDeclaration ();
       if (ad != NULL)
        {
-         /* Use a counter to create anonymous type names.  */
-         static int anon_cnt = 0;
-         char buf[32];
-         sprintf (buf, anon_aggrname_format (), anon_cnt++);
-
-         tree ident = get_identifier (buf);
+         tree ident = make_anon_name ();
          tree type = make_node (ad->isunion ? UNION_TYPE : RECORD_TYPE);
          ANON_AGGR_TYPE_P (type) = 1;
          d_keep (type);
index e22a9e596e1dd4cdaff0aac4e887125d6c56a552..b1084f4d3c5598c44b3674728f3c389ab6f63d4e 100644 (file)
@@ -782,7 +782,7 @@ DFS::DFS_write_tree_body (struct output_block *ob,
       /* Drop names that were created for anonymous entities.  */
       if (DECL_NAME (expr)
          && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
-         && anon_aggrname_p (DECL_NAME (expr)))
+         && IDENTIFIER_ANON_P (DECL_NAME (expr)))
        ;
       else
        DFS_follow_tree_edge (DECL_NAME (expr));
@@ -1211,7 +1211,7 @@ hash_tree (struct streamer_tree_cache_d *cache, hash_map<tree, hashval_t> *map,
       /* Drop names that were created for anonymous entities.  */
       if (DECL_NAME (t)
          && TREE_CODE (DECL_NAME (t)) == IDENTIFIER_NODE
-         && anon_aggrname_p (DECL_NAME (t)))
+         && IDENTIFIER_ANON_P (DECL_NAME (t)))
        ;
       else
        visit (DECL_NAME (t));
index 3f619e830a7738c34c129d2aba93c2ed28183480..b89cb6547dbc3168fd01371e95f582e75ecb2a2b 100644 (file)
@@ -579,7 +579,7 @@ write_ts_decl_minimal_tree_pointers (struct output_block *ob, tree expr,
   /* Drop names that were created for anonymous entities.  */
   if (DECL_NAME (expr)
       && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
-      && anon_aggrname_p (DECL_NAME (expr)))
+      && IDENTIFIER_ANON_P (DECL_NAME (expr)))
     stream_write_tree (ob, NULL_TREE, ref_p);
   else
     stream_write_tree (ob, DECL_NAME (expr), ref_p);
index 9a8f5e567429d065629fbe3a16c0dbd23120bba2..8ca72110526cf7d71fbd9069494393867cf12489 100644 (file)
@@ -9747,40 +9747,32 @@ clean_symbol_name (char *p)
       *p = '_';
 }
 
-/* For anonymous aggregate types, we need some sort of name to
-   hold on to.  In practice, this should not appear, but it should
-   not be harmful if it does.  */
-bool 
-anon_aggrname_p(const_tree id_node)
-{
-#ifndef NO_DOT_IN_LABEL
- return (IDENTIFIER_POINTER (id_node)[0] == '.'
-        && IDENTIFIER_POINTER (id_node)[1] == '_');
-#else /* NO_DOT_IN_LABEL */
-#ifndef NO_DOLLAR_IN_LABEL
-  return (IDENTIFIER_POINTER (id_node)[0] == '$' \
-         && IDENTIFIER_POINTER (id_node)[1] == '_');
-#else /* NO_DOLLAR_IN_LABEL */
-#define ANON_AGGRNAME_PREFIX "__anon_"
-  return (!strncmp (IDENTIFIER_POINTER (id_node), ANON_AGGRNAME_PREFIX, 
-                   sizeof (ANON_AGGRNAME_PREFIX) - 1));
-#endif /* NO_DOLLAR_IN_LABEL */
-#endif /* NO_DOT_IN_LABEL */
-}
-
-/* Return a format for an anonymous aggregate name.  */
-const char *
-anon_aggrname_format()
-{
-#ifndef NO_DOT_IN_LABEL
- return "._%d";
-#else /* NO_DOT_IN_LABEL */
-#ifndef NO_DOLLAR_IN_LABEL
-  return "$_%d";
-#else /* NO_DOLLAR_IN_LABEL */
-  return "__anon_%d";
-#endif /* NO_DOLLAR_IN_LABEL */
-#endif /* NO_DOT_IN_LABEL */
+static GTY(()) unsigned anon_cnt = 0; /* Saved for PCH.  */
+
+/* Create a unique anonymous identifier.  The identifier is still a
+   valid assembly label.  */
+
+tree
+make_anon_name ()
+{
+  const char *fmt = 
+#if !defined (NO_DOT_IN_LABEL)
+    "."
+#elif !defined (NO_DOLLAR_IN_LABEL)
+    "$"
+#else
+    "_"
+#endif
+    "_anon_%d";
+
+  char buf[24];
+  int len = snprintf (buf, sizeof (buf), fmt, anon_cnt++);
+  gcc_checking_assert (len < int (sizeof (buf)));
+
+  tree id = get_identifier_with_length (buf, len);
+  IDENTIFIER_ANON_P (id) = true;
+
+  return id;
 }
 
 /* Generate a name for a special-purpose function.
index 72544b63d79c16402c440e645900c85094b2b5bd..7009c673a1c3464de3f7dbe754ce7f1804d40862 100644 (file)
@@ -932,6 +932,11 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int,
 #define TREE_DEPRECATED(NODE) \
   ((NODE)->base.deprecated_flag)
 
+/* Nonzero indicates an IDENTIFIER_NODE that names an anonymous
+   aggregate, (as created by anon_aggr_name_format).  */
+#define IDENTIFIER_ANON_P(NODE) \
+  (IDENTIFIER_NODE_CHECK (NODE)->base.private_flag)
+
 /* Nonzero in an IDENTIFIER_NODE if the name is a local alias, whose
    uses are to be substituted for uses of the TREE_CHAINed identifier.  */
 #define IDENTIFIER_TRANSPARENT_ALIAS(NODE) \
@@ -5441,9 +5446,9 @@ target_opts_for_fn (const_tree fndecl)
 
 /* For anonymous aggregate types, we need some sort of name to
    hold on to.  In practice, this should not appear, but it should
-   not be harmful if it does.  */
-extern const char *anon_aggrname_format();
-extern bool anon_aggrname_p (const_tree);
+   not be harmful if it does.  Identifiers returned will be
+   IDENTIFIER_ANON_P.  */
+extern tree make_anon_name ();
 
 /* The tree and const_tree overload templates.   */
 namespace wi