gimple-fold.c (can_refer_decl_in_current_unit_p): Do not accept abstract functions...
authorJan Hubicka <jh@suse.cz>
Mon, 16 Sep 2013 11:47:48 +0000 (13:47 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 16 Sep 2013 11:47:48 +0000 (11:47 +0000)
* gimple-fold.c (can_refer_decl_in_current_unit_p): Do not accept
abstract functions; for static functions check the presence
of body.

From-SVN: r202626

gcc/ChangeLog
gcc/gimple-fold.c

index 68091bbcbbd1c46c13bfeb5e0b54b3464a39c1d2..b9a335adaac85f32892f4670aa090f12dd9fde29 100644 (file)
@@ -1,3 +1,9 @@
+2013-09-16  Jan Hubicka  <jh@suse.cz>
+
+       * gimple-fold.c (can_refer_decl_in_current_unit_p): Do not accept
+       abstract functions; for static functions check the presence
+       of body.
+
 2013-09-16  James Greenhalgh  <james.greenhalgh@arm.com>
 
        * config/aarch64/aarch64-simd-builtins.def (fma): New.
index 98c3a153f3f643b9e1a80391e4c6c9baca610bed..51713e64655055bf0644576313b01e7a466118eb 100644 (file)
@@ -60,6 +60,24 @@ can_refer_decl_in_current_unit_p (tree decl, tree from_decl)
   struct cgraph_node *node;
   symtab_node snode;
 
+  if (DECL_ABSTRACT (decl))
+    return false;
+
+  /* We are concerned only about static/external vars and functions.  */
+  if ((!TREE_STATIC (decl) && !DECL_EXTERNAL (decl))
+      || (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL))
+    return true;
+
+  /* Static objects can be referred only if they was not optimized out yet.  */
+  if (!TREE_PUBLIC (decl) && !DECL_EXTERNAL (decl))
+    {
+      snode = symtab_get_node (decl);
+      if (!snode)
+       return false;
+      node = dyn_cast <cgraph_node> (snode);
+      return !node || !node->global.inlined_to;
+    }
+
   /* We will later output the initializer, so we can refer to it.
      So we are concerned only when DECL comes from initializer of
      external var.  */
@@ -69,10 +87,6 @@ can_refer_decl_in_current_unit_p (tree decl, tree from_decl)
       || (flag_ltrans
          && symtab_get_node (from_decl)->symbol.in_other_partition))
     return true;
-  /* We are concerned only about static/external vars and functions.  */
-  if ((!TREE_STATIC (decl) && !DECL_EXTERNAL (decl))
-      || (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL))
-    return true;
   /* We are folding reference from external vtable.  The vtable may reffer
      to a symbol keyed to other compilation unit.  The other compilation
      unit may be in separate DSO and the symbol may be hidden.  */