mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-19 06:40:31 +08:00
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:
parent
865e8e8e51
commit
5074d72c59
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
3
gcc/testsuite/gcc.dg/lto/20101009-2_0.c
Normal file
3
gcc/testsuite/gcc.dg/lto/20101009-2_0.c
Normal file
@ -0,0 +1,3 @@
|
||||
/* { dg-lto-do link } */
|
||||
|
||||
int main() { return 0; }
|
5
gcc/testsuite/gcc.dg/lto/20101009-2_1.c
Normal file
5
gcc/testsuite/gcc.dg/lto/20101009-2_1.c
Normal file
@ -0,0 +1,5 @@
|
||||
int foo (void)
|
||||
{
|
||||
static int i;
|
||||
return ++i;
|
||||
}
|
5
gcc/testsuite/gcc.dg/lto/20101009-2_2.c
Normal file
5
gcc/testsuite/gcc.dg/lto/20101009-2_2.c
Normal file
@ -0,0 +1,5 @@
|
||||
int bar (void)
|
||||
{
|
||||
static int i;
|
||||
return ++i;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user