ipa-devirt.c (maybe_record_node): Ignore all non-methods (including cxa_pure_virtual).
authorJan Hubicka <hubicka@ucw.cz>
Mon, 14 Apr 2014 19:59:00 +0000 (21:59 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 14 Apr 2014 19:59:00 +0000 (19:59 +0000)
* ipa-devirt.c (maybe_record_node): Ignore all non-methods (including
cxa_pure_virtual).

From-SVN: r209391

gcc/ChangeLog
gcc/ipa-devirt.c

index f2c127c97bb4ac9b45c05071957812fd37f7695b..ca7dfb51d0e4df6ca40062a4bf11d520c8353650 100644 (file)
@@ -1,3 +1,8 @@
+2014-04-14  Jan Hubicka  <hubicka@ucw.cz>
+
+       * ipa-devirt.c (maybe_record_node): Ignore all non-methods (including
+       cxa_pure_virtual).
+
 2014-04-14  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * tree.h (TYPE_IDENTIFIER): Declare.
index 03a6c5b5d3b5c59371db82fb338bcfaf23b7ee8b..3a5432e13c13fec7651c90ca1aaec6c4fdcda693 100644 (file)
@@ -611,7 +611,12 @@ maybe_record_node (vec <cgraph_node *> &nodes,
                   bool *completep)
 {
   struct cgraph_node *target_node;
-  enum built_in_function fcode;
+
+  /* cxa_pure_virtual and __builtin_unreachable do not need to be added into
+     list of targets; the runtime effect of calling them is undefined.
+     Only "real" virtual methods should be accounted.  */
+  if (target && TREE_CODE (TREE_TYPE (target)) != METHOD_TYPE)
+    return;
 
   if (!can_refer)
     {
@@ -619,22 +624,19 @@ maybe_record_node (vec <cgraph_node *> &nodes,
         is when we completely optimized it out.  */
       if (flag_ltrans
          || !target 
-          || !type_in_anonymous_namespace_p (DECL_CONTEXT (target)))
+         || !type_in_anonymous_namespace_p (DECL_CONTEXT (target)))
        *completep = false;
       return;
     }
 
-  if (!target
-      /* Those are used to mark impossible scenarios.  */
-      || (fcode = DECL_FUNCTION_CODE (target))
-         == BUILT_IN_UNREACHABLE
-      || fcode == BUILT_IN_TRAP)
+  if (!target)
     return;
 
   target_node = cgraph_get_node (target);
 
   if (target_node != NULL
-      && (TREE_PUBLIC (target)
+      && ((TREE_PUBLIC (target)
+          || DECL_EXTERNAL (target))
          || target_node->definition)
       && symtab_real_symbol_p (target_node))
     {