decl2.c (decl_needed_p): When not optimizing, do not consider external decls as needed.
authorJan Hubicka <hubicka@ucw.cz>
Mon, 15 Dec 2014 22:50:18 +0000 (23:50 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 15 Dec 2014 22:50:18 +0000 (22:50 +0000)
* decl2.c (decl_needed_p): When not optimizing, do not consider external
decls as needed.

From-SVN: r218769

gcc/cp/ChangeLog
gcc/cp/decl2.c

index afb24839c4256792ef7251235194e5a966e11489..4c6043e24eb99758ba716b8bb6824369c4dc052b 100644 (file)
@@ -1,3 +1,8 @@
+2014-12-15  Jan Hubicka  <hubicka@ucw.cz>
+
+       * decl2.c (decl_needed_p): When not optimizing, do not consider external
+       decls as needed.
+
 2014-12-15  Jason Merrill  <jason@redhat.com>
 
        PR c++/64297
index 07bdd92de93236ccbdea3fe862b20cab3b2ab3b0..b2123f2decb47a437bde8c67ebdc718dc14e4ffa 100644 (file)
@@ -1996,19 +1996,30 @@ decl_needed_p (tree decl)
      COMDAT until that point.  */
   gcc_assert (at_eof);
 
-  /* All entities with external linkage that are not COMDAT should be
+  /* All entities with external linkage that are not COMDAT/EXTERN should be
      emitted; they may be referred to from other object files.  */
-  if (TREE_PUBLIC (decl) && !DECL_COMDAT (decl))
+  if (TREE_PUBLIC (decl) && !DECL_COMDAT (decl) && !DECL_REALLY_EXTERN (decl))
     return true;
-  /* If this entity was used, let the back end see it; it will decide
-     whether or not to emit it into the object file.  */
-  if (TREE_USED (decl))
-      return true;
   /* Functions marked "dllexport" must be emitted so that they are
      visible to other DLLs.  */
   if (flag_keep_inline_dllexport
       && lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl)))
     return true;
+
+  /* When not optimizing, do not bother to produce definitions for extern
+     symbols.  */
+  if (DECL_REALLY_EXTERN (decl)
+      && ((TREE_CODE (decl) != FUNCTION_DECL
+          && !optimize)
+         || (TREE_CODE (decl) == FUNCTION_DECL
+             && !opt_for_fn (decl, optimize)))
+      && !lookup_attribute ("always_inline", decl))
+    return false;
+
+  /* If this entity was used, let the back end see it; it will decide
+     whether or not to emit it into the object file.  */
+  if (TREE_USED (decl))
+      return true;
   /* Virtual functions might be needed for devirtualization.  */
   if (flag_devirtualize
       && TREE_CODE (decl) == FUNCTION_DECL