diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5c4d210611bb..5cb3cecba2c1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-10-09 Richard Guenther + + 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 PR lto/45947 diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c index fb27e63b753d..72ac6eca2f30 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; + tree context; - ASM_FORMAT_PRIVATE_NAME (label, name, DECL_UID (decl)); - SET_DECL_ASSEMBLER_NAME (decl, get_identifier (label)); - rest_of_decl_compilation (decl, 1, 0); - } + /* 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 9c16eed597a5..d5af564c7ebc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2010-10-09 Richard Guenther + + 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 PR lto/45947 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 000000000000..249d0e079e00 --- /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 000000000000..887057db7a5e --- /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 000000000000..4a97fe806207 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/20101009-2_2.c @@ -0,0 +1,5 @@ +int bar (void) +{ + static int i; + return ++i; +}