2012-12-15 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 15 Dec 2011 09:44:11 +0000 (09:44 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 15 Dec 2011 09:44:11 +0000 (09:44 +0000)
Revert
PR lto/48437
* lto-streamer-out.c (tree_is_indexable): Exclude block-local
extern declarations.

PR lto/48508
PR lto/48437
* tree-streamer-out.c (streamer_write_chain): Stream DECL_EXTERNAL
VAR_DECLs and FUNCTION_DECLs locally.

* g++.dg/lto/pr48508-1_0.C: New testcase.
* g++.dg/lto/pr48508-1_1.C: Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@182358 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/lto-streamer-out.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lto/pr48508-1_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/pr48508-1_1.C [new file with mode: 0644]
gcc/tree-streamer-out.c

index 6f6172e..5dfad7b 100644 (file)
@@ -1,3 +1,15 @@
+2012-12-15  Richard Guenther  <rguenther@suse.de>
+
+       Revert
+       PR lto/48437
+       * lto-streamer-out.c (tree_is_indexable): Exclude block-local
+       extern declarations.
+
+       PR lto/48508
+       PR lto/48437
+       * tree-streamer-out.c (streamer_write_chain): Stream DECL_EXTERNAL
+       VAR_DECLs and FUNCTION_DECLs locally.
+
 2011-12-14  Richard Henderson  <rth@redhat.com>
 
        * config/arm/arm.md (*addsi3_compare0_scratch): Set predicable.
index 9593134..6c1169a 100644 (file)
@@ -129,16 +129,6 @@ tree_is_indexable (tree t)
   else if (TREE_CODE (t) == VAR_DECL && decl_function_context (t)
           && !TREE_STATIC (t))
     return false;
-  /* If this is a decl generated for block local externs for
-     debug info generation, stream it unshared alongside BLOCK_VARS.  */
-  else if (VAR_OR_FUNCTION_DECL_P (t)
-          /* ???  The following tests are a literal match on what
-             c-decl.c:pop_scope does.  */
-          && TREE_PUBLIC (t)
-          && DECL_EXTERNAL (t)
-          && DECL_CONTEXT (t)
-          && TREE_CODE (DECL_CONTEXT (t)) == FUNCTION_DECL)
-    return false;
   /* Variably modified types need to be streamed alongside function
      bodies because they can refer to local entities.  Together with
      them we have to localize their members as well.
index 50f1786..66880f0 100644 (file)
@@ -1,3 +1,9 @@
+2012-12-15  Richard Guenther  <rguenther@suse.de>
+
+       PR lto/48508
+       * g++.dg/lto/pr48508-1_0.C: New testcase.
+       * g++.dg/lto/pr48508-1_1.C: Likewise.
+
 2011-12-14  Jason Merrill  <jason@redhat.com>
 
        PR c++/51554
diff --git a/gcc/testsuite/g++.dg/lto/pr48508-1_0.C b/gcc/testsuite/g++.dg/lto/pr48508-1_0.C
new file mode 100644 (file)
index 0000000..6faee75
--- /dev/null
@@ -0,0 +1,7 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -g -O2 -flto -flto-partition=none } } }
+
+void __attribute__((externally_visible))
+foo (int i)
+{
+}
diff --git a/gcc/testsuite/g++.dg/lto/pr48508-1_1.C b/gcc/testsuite/g++.dg/lto/pr48508-1_1.C
new file mode 100644 (file)
index 0000000..5cda192
--- /dev/null
@@ -0,0 +1,10 @@
+static void
+bar (void)
+{
+  extern void foo (int);
+  foo (0);
+}
+int main()
+{
+  bar ();
+}
index fea15ff..d90ee80 100644 (file)
@@ -405,7 +405,13 @@ streamer_write_chain (struct output_block *ob, tree t, bool ref_p)
       saved_chain = TREE_CHAIN (t);
       TREE_CHAIN (t) = NULL_TREE;
 
-      stream_write_tree (ob, t, ref_p);
+      /* We avoid outputting external vars or functions by reference
+        to the global decls section as we do not want to have them
+        enter decl merging.  This is, of course, only for the call
+        for streaming BLOCK_VARS, but other callers are safe.  */
+      stream_write_tree (ob, t,
+                        ref_p && !(VAR_OR_FUNCTION_DECL_P (t)
+                                   && DECL_EXTERNAL (t)));
 
       TREE_CHAIN (t) = saved_chain;
       t = TREE_CHAIN (t);