re PR lto/45956 (Promoted statics conflict)

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.

	* 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.

From-SVN: r165235
This commit is contained in:
Richard Guenther 2010-10-09 18:28:16 +00:00 committed by Richard Biener
parent 865e8e8e51
commit 5074d72c59
6 changed files with 45 additions and 20 deletions

View File

@ -1,3 +1,9 @@
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

View File

@ -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

View File

@ -1,3 +1,10 @@
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

View File

@ -0,0 +1,3 @@
/* { dg-lto-do link } */
int main() { return 0; }

View File

@ -0,0 +1,5 @@
int foo (void)
{
static int i;
return ++i;
}

View File

@ -0,0 +1,5 @@
int bar (void)
{
static int i;
return ++i;
}