aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/lto-streamer-in.c41
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.dg/lto/20101009-2_0.c3
-rw-r--r--gcc/testsuite/gcc.dg/lto/20101009-2_1.c5
-rw-r--r--gcc/testsuite/gcc.dg/lto/20101009-2_2.c5
6 files changed, 46 insertions, 21 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5c4d210..5cb3cec 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2010-10-09 Richard Guenther <rguenther@suse.de>
+ PR lto/45956
+ * lto-streamer-in.c (lto_register_var_decl_in_symtab):
+ Properly check if a decl is an automatic var.
+
+2010-10-09 Richard Guenther <rguenther@suse.de>
+
PR lto/45947
* tree.c (free_lang_data_in_cgraph): Properly walk the varpool.
diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c
index fb27e63..72ac6ec 100644
--- a/gcc/lto-streamer-in.c
+++ b/gcc/lto-streamer-in.c
@@ -2367,27 +2367,26 @@ lto_input_tree_pointers (struct lto_input_block *ib, struct data_in *data_in,
static void
lto_register_var_decl_in_symtab (struct data_in *data_in, tree decl)
{
- /* Register symbols with file or global scope to mark what input
- file has their definition. */
- if (decl_function_context (decl) == NULL_TREE)
- {
- /* Variable has file scope, not local. Need to ensure static variables
- between different files don't clash unexpectedly. */
- if (!TREE_PUBLIC (decl))
- {
- /* ??? We normally pre-mangle names before we serialize them
- out. Here, in lto1, we do not know the language, and
- thus cannot do the mangling again. Instead, we just
- append a suffix to the mangled name. The resulting name,
- however, is not a properly-formed mangled name, and will
- confuse any attempt to unmangle it. */
- const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
- char *label;
-
- ASM_FORMAT_PRIVATE_NAME (label, name, DECL_UID (decl));
- SET_DECL_ASSEMBLER_NAME (decl, get_identifier (label));
- rest_of_decl_compilation (decl, 1, 0);
- }
+ tree context;
+
+ /* Variable has file scope, not local. Need to ensure static variables
+ between different files don't clash unexpectedly. */
+ if (!TREE_PUBLIC (decl)
+ && !((context = decl_function_context (decl))
+ && auto_var_in_fn_p (decl, context)))
+ {
+ /* ??? We normally pre-mangle names before we serialize them
+ out. Here, in lto1, we do not know the language, and
+ thus cannot do the mangling again. Instead, we just
+ append a suffix to the mangled name. The resulting name,
+ however, is not a properly-formed mangled name, and will
+ confuse any attempt to unmangle it. */
+ const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
+ char *label;
+
+ ASM_FORMAT_PRIVATE_NAME (label, name, DECL_UID (decl));
+ SET_DECL_ASSEMBLER_NAME (decl, get_identifier (label));
+ rest_of_decl_compilation (decl, 1, 0);
}
/* If this variable has already been declared, queue the
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9c16eed..d5af564 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,12 @@
2010-10-09 Richard Guenther <rguenther@suse.de>
+ PR lto/45956
+ * gcc.dg/lto/20101009-2_0.c: New testcase.
+ * gcc.dg/lto/20101009-2_1.c: Likewise.
+ * gcc.dg/lto/20101009-2_2.c: Likewise.
+
+2010-10-09 Richard Guenther <rguenther@suse.de>
+
PR lto/45947
* g++.dg/lto/20101009-1_0.C: New testcase.
diff --git a/gcc/testsuite/gcc.dg/lto/20101009-2_0.c b/gcc/testsuite/gcc.dg/lto/20101009-2_0.c
new file mode 100644
index 0000000..249d0e0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/lto/20101009-2_0.c
@@ -0,0 +1,3 @@
+/* { dg-lto-do link } */
+
+int main() { return 0; }
diff --git a/gcc/testsuite/gcc.dg/lto/20101009-2_1.c b/gcc/testsuite/gcc.dg/lto/20101009-2_1.c
new file mode 100644
index 0000000..887057d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/lto/20101009-2_1.c
@@ -0,0 +1,5 @@
+int foo (void)
+{
+ static int i;
+ return ++i;
+}
diff --git a/gcc/testsuite/gcc.dg/lto/20101009-2_2.c b/gcc/testsuite/gcc.dg/lto/20101009-2_2.c
new file mode 100644
index 0000000..4a97fe8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/lto/20101009-2_2.c
@@ -0,0 +1,5 @@
+int bar (void)
+{
+ static int i;
+ return ++i;
+}