ipa-devirt.c (type_with_linkage_p, [...]): Move to ...
authorJan Hubicka <hubicka@ucw.cz>
Tue, 1 Dec 2015 06:36:02 +0000 (07:36 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 1 Dec 2015 06:36:02 +0000 (06:36 +0000)
* ipa-devirt.c (type_with_linkage_p, type_in_anonymous_namespace_p,
odr_type_p): Move to ...
* ipa-utils.h (type_with_linkage_p, type_in_anonymous_namespace_p,
odr_type_p): here; miscro-optimize.

From-SVN: r231098

gcc/ChangeLog
gcc/ipa-devirt.c
gcc/ipa-utils.h

index 5f675f1f64392dd701b9153415864a09493e271c..c1114532c2e2c6324b75a2093ab541bd62d3ea91 100644 (file)
@@ -1,3 +1,10 @@
+2015-12-01  Jan Hubicka  <hubicka@ucw.cz>
+
+       * ipa-devirt.c (type_with_linkage_p, type_in_anonymous_namespace_p,
+       odr_type_p): Move to ...
+       * ipa-utils.h (type_with_linkage_p, type_in_anonymous_namespace_p,
+       odr_type_p): here; miscro-optimize.
+
 2015-12-01  Bin Cheng  <bin.cheng@arm.com>
 
        PR tree-optimization/68529
index 2d78952ddbf49c6229edae5c314632de1fcb87ce..7a77b5a10d6453cc276b457dc8ae6dfe1db0115c 100644 (file)
@@ -209,93 +209,6 @@ struct GTY(()) odr_type_d
   bool rtti_broken;
 };
 
-/* Return true if T is a type with linkage defined.  */
-
-bool
-type_with_linkage_p (const_tree t)
-{
-  /* Builtin types do not define linkage, their TYPE_CONTEXT is NULL.  */
-  if (!TYPE_CONTEXT (t)
-      || !TYPE_NAME (t) || TREE_CODE (TYPE_NAME (t)) != TYPE_DECL
-      || !TYPE_STUB_DECL (t))
-    return false;
-
-  /* In LTO do not get confused by non-C++ produced types or types built
-     with -fno-lto-odr-type-merigng.  */
-  if (in_lto_p)
-    {
-      /* To support -fno-lto-odr-type-merigng recognize types with vtables
-         to have linkage.  */
-      if (RECORD_OR_UNION_TYPE_P (t)
-         && TYPE_BINFO (t) && BINFO_VTABLE (TYPE_BINFO (t)))
-        return true;
-      /* Do not accept any other types - we do not know if they were produced
-         by C++ FE.  */
-      if (!DECL_ASSEMBLER_NAME_SET_P (TYPE_NAME (t)))
-        return false;
-    }
-
-  return (RECORD_OR_UNION_TYPE_P (t)
-         || TREE_CODE (t) == ENUMERAL_TYPE);
-}
-
-/* Return true if T is in anonymous namespace.
-   This works only on those C++ types with linkage defined.  */
-
-bool
-type_in_anonymous_namespace_p (const_tree t)
-{
-  gcc_assert (type_with_linkage_p (t));
-
-  /* Keep -fno-lto-odr-type-merging working by recognizing classes with vtables
-     properly into anonymous namespaces.  */
-  if (RECORD_OR_UNION_TYPE_P (t)
-      && TYPE_BINFO (t) && BINFO_VTABLE (TYPE_BINFO (t)))
-    return (TYPE_STUB_DECL (t) && !TREE_PUBLIC (TYPE_STUB_DECL (t)));
-
-  if (TYPE_STUB_DECL (t) && !TREE_PUBLIC (TYPE_STUB_DECL (t)))
-    {
-      /* C++ FE uses magic <anon> as assembler names of anonymous types.
-        verify that this match with type_in_anonymous_namespace_p.  */
-      if (in_lto_p)
-       gcc_checking_assert (!strcmp ("<anon>",
-                                     IDENTIFIER_POINTER
-                                       (DECL_ASSEMBLER_NAME (TYPE_NAME (t)))));
-      return true;
-    }
-  return false;
-}
-
-/* Return true of T is type with One Definition Rule info attached. 
-   It means that either it is anonymous type or it has assembler name
-   set.  */
-
-bool
-odr_type_p (const_tree t)
-{
-  /* We do not have this information when not in LTO, but we do not need
-     to care, since it is used only for type merging.  */
-  gcc_checking_assert (in_lto_p || flag_lto);
-
-  /* To support -fno-lto-odr-type-merging consider types with vtables ODR.  */
-  if (type_with_linkage_p (t) && type_in_anonymous_namespace_p (t))
-    return true;
-
-  if (TYPE_NAME (t) && TREE_CODE (TYPE_NAME (t)) == TYPE_DECL
-      && (DECL_ASSEMBLER_NAME_SET_P (TYPE_NAME (t))))
-    {
-      /* C++ FE uses magic <anon> as assembler names of anonymous types.
-        verify that this match with type_in_anonymous_namespace_p.  */
-      gcc_checking_assert (!type_with_linkage_p (t)
-                          || strcmp ("<anon>",
-                                     IDENTIFIER_POINTER
-                                       (DECL_ASSEMBLER_NAME (TYPE_NAME (t))))
-                          || type_in_anonymous_namespace_p (t));
-      return true;
-    }
-  return false;
-}
-
 /* Return TRUE if all derived types of T are known and thus
    we may consider the walk of derived type complete.
 
index 1604641e1b5f1bc07d0590c12b04c79741a4ca6d..b537f3c8f311456b3bc81ce2bc080603028d7a27 100644 (file)
@@ -63,8 +63,6 @@ possible_polymorphic_call_targets (tree, HOST_WIDE_INT,
                                   void **cache_token = NULL,
                                   bool speuclative = false);
 odr_type get_odr_type (tree, bool insert = false);
-bool type_in_anonymous_namespace_p (const_tree);
-bool type_with_linkage_p (const_tree);
 bool odr_type_p (const_tree);
 bool possible_polymorphic_call_target_p (tree ref, gimple *stmt, struct cgraph_node *n);
 void dump_possible_polymorphic_call_targets (FILE *, tree, HOST_WIDE_INT,
@@ -176,6 +174,92 @@ polymorphic_type_binfo_p (const_tree binfo)
   return (BINFO_TYPE (binfo) && TYPE_BINFO (BINFO_TYPE (binfo))
          && BINFO_VTABLE (TYPE_BINFO (BINFO_TYPE (binfo))));
 }
+
+/* Return true if T is a type with linkage defined.  */
+
+inline bool
+type_with_linkage_p (const_tree t)
+{
+  if (!TYPE_NAME (t) || TREE_CODE (TYPE_NAME (t)) != TYPE_DECL
+      || !TYPE_STUB_DECL (t))
+    return false;
+  /* In LTO do not get confused by non-C++ produced types or types built
+     with -fno-lto-odr-type-merigng.  */
+  if (in_lto_p)
+    {
+      /* To support -fno-lto-odr-type-merigng recognize types with vtables
+         to have linkage.  */
+      if (RECORD_OR_UNION_TYPE_P (t)
+         && TYPE_BINFO (t) && BINFO_VTABLE (TYPE_BINFO (t)))
+        return true;
+      /* With -flto-odr-type-merging C++ FE specify mangled names
+        for all types with the linkage.  */
+      return DECL_ASSEMBLER_NAME_SET_P (TYPE_NAME (t));
+    }
+
+  if (!RECORD_OR_UNION_TYPE_P (t) && TREE_CODE (t) != ENUMERAL_TYPE)
+    return false;
+
+  /* Builtin types do not define linkage, their TYPE_CONTEXT is NULL.  */
+  if (!TYPE_CONTEXT (t))
+    return false;
+
+  return true;
+}
+
+/* Return true if T is in anonymous namespace.
+   This works only on those C++ types with linkage defined.  */
+
+inline bool
+type_in_anonymous_namespace_p (const_tree t)
+{
+  gcc_checking_assert (type_with_linkage_p (t));
+
+  if (!TREE_PUBLIC (TYPE_STUB_DECL (t)))
+    {
+      /* C++ FE uses magic <anon> as assembler names of anonymous types.
+        verify that this match with type_in_anonymous_namespace_p.  */
+      gcc_checking_assert (!in_lto_p || !DECL_ASSEMBLER_NAME_SET_P (t)
+                          || !strcmp
+                                ("<anon>",
+                                 IDENTIFIER_POINTER
+                                    (DECL_ASSEMBLER_NAME (TYPE_NAME (t)))));
+      return true;
+    }
+  return false;
+}
+
+/* Return true of T is type with One Definition Rule info attached. 
+   It means that either it is anonymous type or it has assembler name
+   set.  */
+
+inline bool
+odr_type_p (const_tree t)
+{
+  /* We do not have this information when not in LTO, but we do not need
+     to care, since it is used only for type merging.  */
+  gcc_checking_assert (in_lto_p || flag_lto);
+
+  if (!type_with_linkage_p (t))
+    return false;
+
+  /* To support -fno-lto-odr-type-merging consider types with vtables ODR.  */
+  if (type_in_anonymous_namespace_p (t))
+    return true;
+
+  if (TYPE_NAME (t) && TREE_CODE (TYPE_NAME (t)) == TYPE_DECL
+      && DECL_ASSEMBLER_NAME_SET_P (TYPE_NAME (t)))
+    {
+      /* C++ FE uses magic <anon> as assembler names of anonymous types.
+        verify that this match with type_in_anonymous_namespace_p.  */
+      gcc_checking_assert (strcmp ("<anon>",
+                                     IDENTIFIER_POINTER
+                                       (DECL_ASSEMBLER_NAME (TYPE_NAME (t)))));
+      return true;
+    }
+  return false;
+}
+
 #endif  /* GCC_IPA_UTILS_H  */