aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2011-12-15 09:44:11 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2011-12-15 09:44:11 +0000
commit2e537cdecbdc4180821b0baca1af4a716bd0f1e4 (patch)
tree42ee680c41066552ec1065a5355d39eb26b5f7e4 /gcc
parent4fde01bb0b2b1fbedb40ed3d2cccfdba422b64c6 (diff)
downloadgcc-2e537cdecbdc4180821b0baca1af4a716bd0f1e4.zip
gcc-2e537cdecbdc4180821b0baca1af4a716bd0f1e4.tar.gz
gcc-2e537cdecbdc4180821b0baca1af4a716bd0f1e4.tar.bz2
revert: re PR lto/48437 (LTO crashes with block-local function declarations)
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. * g++.dg/lto/pr48508-1_0.C: New testcase. * g++.dg/lto/pr48508-1_1.C: Likewise. From-SVN: r182358
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/lto-streamer-out.c10
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/lto/pr48508-1_0.C7
-rw-r--r--gcc/testsuite/g++.dg/lto/pr48508-1_1.C10
-rw-r--r--gcc/tree-streamer-out.c8
6 files changed, 42 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6f6172e..5dfad7b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c
index 9593134..6c1169a 100644
--- a/gcc/lto-streamer-out.c
+++ b/gcc/lto-streamer-out.c
@@ -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.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 50f1786..66880f0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..6faee75
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/pr48508-1_0.C
@@ -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
index 0000000..5cda192
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/pr48508-1_1.C
@@ -0,0 +1,10 @@
+static void
+bar (void)
+{
+ extern void foo (int);
+ foo (0);
+}
+int main()
+{
+ bar ();
+}
diff --git a/gcc/tree-streamer-out.c b/gcc/tree-streamer-out.c
index fea15ff..d90ee80 100644
--- a/gcc/tree-streamer-out.c
+++ b/gcc/tree-streamer-out.c
@@ -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);