]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
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 6f6172ebc98e7bc78b7d0d4d60842d91930fbb62..5dfad7bdb3f72f1aa85449c779df6d4ab364c0f7 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 9593134fb02cd53cedfbeec34ac4fb89241115ee..6c1169a3ec684bb8ca254dd20d8e21334bdd5638 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 50f17867d52cb212a30122c50b64c2f4725b953a..66880f0e0a764093836c61ce63b0680a0fd3f43b 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 fea15ff1137debd51d00bfa961c0fe3c63670727..d90ee803a1389269f9c0d37793b655e69cffe146 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);