diff options
author | Jan Hubicka <jh@suse.cz> | 2013-05-15 10:09:26 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2013-05-15 08:09:26 +0000 |
commit | 2d6e460353fd7ad3160faaa96a0174042c6c28f1 (patch) | |
tree | b5bf9542ac17e96b9f1eab08c77364e8adba45c3 /gcc | |
parent | 83f44b399712cc22564013b42bb6976ef60895c4 (diff) | |
download | gcc-2d6e460353fd7ad3160faaa96a0174042c6c28f1.tar.gz |
re PR c++/57038 (Latest libreoffice compilation fails with enabled LTO)
PR lto/57038
PR lto/47375
* lto-symtab.c (lto_symtab_symbol_p): Add external symbol; weakrefs are
not external.
(lto_symtab_merge_decls): Fix thinko when dealing with non-lto_symtab decls.
(lto_symtab_merge_cgraph_nodes): Use lto_symtab_symbol_p.
(lto_symtab_prevailing_decl): Get int sync with lto_symtab_symbol_p.
* varpool.c (dump_varpool_node): Dump more flags.
* lto-partition.c (get_symbol_class): Fix weakrefs.
(lto_balanced_map): Fix weakrefs.
(privatize_symbol_name): Remove unnecesary label.
(rename_statics): Handle weakrefs as statics.
* gcc.dg/lto/attr-weakref-1_0.c: New testcase.
* gcc.dg/lto/attr-weakref-1_1.c: New testcase.
* gcc.dg/lto/attr-weakref-1_2.c: New testcase.
From-SVN: r198917
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/lto-symtab.c | 35 | ||||
-rw-r--r-- | gcc/lto/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/lto/lto-partition.c | 22 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/20070621-1.C | 1 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/lto/attr-weakref-1_0.c | 29 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/lto/attr-weakref-1_1.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/lto/attr-weakref-1_2.c | 7 | ||||
-rw-r--r-- | gcc/varpool.c | 4 |
10 files changed, 112 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ee2d403aac4..f3daf5ad668 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2013-05-15 Jan Hubicka <jh@suse.cz> + + PR lto/57038 + PR lto/47375 + * lto-symtab.c (lto_symtab_symbol_p): Add external symbol; weakrefs are + not external. + (lto_symtab_merge_decls): Fix thinko when dealing with non-lto_symtab decls. + (lto_symtab_merge_cgraph_nodes): Use lto_symtab_symbol_p. + (lto_symtab_prevailing_decl): Get int sync with lto_symtab_symbol_p. + * varpool.c (dump_varpool_node): Dump more flags. + 2013-05-15 Ganesh Gopalasubramanian <Ganesh.Gopalasubramanian@amd.com> * config/i386/i386.c (processor_alias_table): Add instruction diff --git a/gcc/lto-symtab.c b/gcc/lto-symtab.c index b28fe63aa85..e33ed465c09 100644 --- a/gcc/lto-symtab.c +++ b/gcc/lto-symtab.c @@ -227,13 +227,16 @@ lto_symtab_resolve_replaceable_p (symtab_node e) } /* Return true, if the symbol E should be resolved by lto-symtab. - Those are all real symbols that are not static (we handle renaming - of static later in partitioning). */ + Those are all external symbols and all real symbols that are not static (we + handle renaming of static later in partitioning). */ static bool lto_symtab_symbol_p (symtab_node e) { - if (!TREE_PUBLIC (e->symbol.decl)) + if (!TREE_PUBLIC (e->symbol.decl) && !DECL_EXTERNAL (e->symbol.decl)) + return false; + /* weakrefs are really static variables that are made external by a hack. */ + if (lookup_attribute ("weakref", DECL_ATTRIBUTES (e->symbol.decl))) return false; return symtab_real_symbol_p (e); } @@ -528,10 +531,19 @@ lto_symtab_merge_decls (void) symtab_initialize_asm_name_hash (); FOR_EACH_SYMBOL (node) - if (TREE_PUBLIC (node->symbol.decl) - && node->symbol.next_sharing_asm_name - && !node->symbol.previous_sharing_asm_name) - lto_symtab_merge_decls_1 (node); + if (lto_symtab_symbol_p (node) + && node->symbol.next_sharing_asm_name) + { + symtab_node n; + + /* To avoid duplicated work, see if this is first real symbol in the + chain. */ + for (n = node->symbol.previous_sharing_asm_name; + n && !lto_symtab_symbol_p (n); n = n->symbol.previous_sharing_asm_name) + ; + if (!n) + lto_symtab_merge_decls_1 (node); + } } /* Helper to process the decl chain for the symbol table entry *SLOT. */ @@ -574,7 +586,7 @@ lto_symtab_merge_cgraph_nodes (void) if (!flag_ltrans) FOR_EACH_SYMBOL (node) - if (TREE_PUBLIC (node->symbol.decl) + if (lto_symtab_symbol_p (node) && node->symbol.next_sharing_asm_name && !node->symbol.previous_sharing_asm_name) lto_symtab_merge_cgraph_nodes_1 (node); @@ -602,7 +614,7 @@ lto_symtab_prevailing_decl (tree decl) symtab_node ret; /* Builtins and local symbols are their own prevailing decl. */ - if (!TREE_PUBLIC (decl) || is_builtin_fn (decl)) + if ((!TREE_PUBLIC (decl) && !DECL_EXTERNAL (decl)) || is_builtin_fn (decl)) return decl; /* DECL_ABSTRACTs are their own prevailng decl. */ @@ -614,6 +626,11 @@ lto_symtab_prevailing_decl (tree decl) if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl)) return decl; + /* As an anoying special cases weakrefs are really static variables with + EXTERNAL flag. */ + if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))) + return decl; + /* Ensure DECL_ASSEMBLER_NAME will not set assembler name. */ gcc_assert (DECL_ASSEMBLER_NAME_SET_P (decl)); diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 87320693361..9a86b4958d7 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,12 @@ +2013-05-15 Jan Hubicka <jh@suse.cz> + + PR lto/57038 + PR lto/47375 + * lto-partition.c (get_symbol_class): Fix weakrefs. + (lto_balanced_map): Fix weakrefs. + (privatize_symbol_name): Remove unnecesary label. + (rename_statics): Handle weakrefs as statics. + 2013-05-09 Jan Hubicka <jh@suse.cz> Richard Biener <rguenther@suse.de> diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c index 652272ac1ef..acf8f290237 100644 --- a/gcc/lto/lto-partition.c +++ b/gcc/lto/lto-partition.c @@ -59,6 +59,10 @@ get_symbol_class (symtab_node node) if (cnode && cnode->global.inlined_to) return SYMBOL_DUPLICATE; + /* Weakref aliases are always duplicated. */ + if (lookup_attribute ("weakref", DECL_ATTRIBUTES (node->symbol.decl))) + return SYMBOL_DUPLICATE; + /* External declarations are external. */ if (DECL_EXTERNAL (node->symbol.decl)) return SYMBOL_EXTERNAL; @@ -79,10 +83,6 @@ get_symbol_class (symtab_node node) else if (!cgraph (node)->analyzed) return SYMBOL_EXTERNAL; - /* Weakref aliases are always duplicated. */ - if (lookup_attribute ("weakref", DECL_ATTRIBUTES (node->symbol.decl))) - return SYMBOL_DUPLICATE; - /* Comdats are duplicated to every use unless they are keyed. Those do not need duplication. */ if (DECL_COMDAT (node->symbol.decl) @@ -561,7 +561,8 @@ lto_balanced_map (void) last_visited_node++; - gcc_assert (node->analyzed); + gcc_assert (node->analyzed + || lookup_attribute ("weakref", DECL_ATTRIBUTES (node->symbol.decl))); /* Compute boundary cost of callgraph edges. */ for (edge = node->callees; edge; edge = edge->next_callee) @@ -768,7 +769,6 @@ privatize_symbol_name (symtab_node node) { tree decl = node->symbol.decl; const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); - char *label; /* Our renaming machinery do not handle more than one change of assembler name. We should not need more than one anyway. */ @@ -793,7 +793,6 @@ privatize_symbol_name (symtab_node node) name); return; } - ASM_FORMAT_PRIVATE_NAME (label, name, DECL_UID (decl)); change_decl_assembler_name (decl, clone_function_name (decl, "lto_priv")); if (node->symbol.lto_file_data) lto_record_renamed_decl (node->symbol.lto_file_data, name, @@ -869,7 +868,8 @@ rename_statics (lto_symtab_encoder_t encoder, symtab_node node) once this is fixed. */ || DECL_EXTERNAL (node->symbol.decl) || !symtab_real_symbol_p (node)) - && !may_need_named_section_p (encoder, node)) + && !may_need_named_section_p (encoder, node) + && !lookup_attribute ("weakref", DECL_ATTRIBUTES (node->symbol.decl))) return; /* Now walk symbols sharing the same name and see if there are any conflicts. @@ -894,9 +894,11 @@ rename_statics (lto_symtab_encoder_t encoder, symtab_node node) /* Assign every symbol in the set that shares the same ASM name an unique mangled name. */ for (s = symtab_node_for_asm (name); s;) - if (!s->symbol.externally_visible + if ((!s->symbol.externally_visible + || lookup_attribute ("weakref", DECL_ATTRIBUTES (node->symbol.decl))) && ((symtab_real_symbol_p (s) - && !DECL_EXTERNAL (node->symbol.decl) + && (!DECL_EXTERNAL (node->symbol.decl) + || lookup_attribute ("weakref", DECL_ATTRIBUTES (node->symbol.decl))) && !TREE_PUBLIC (node->symbol.decl)) || may_need_named_section_p (encoder, s)) && (!encoder diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d4059893482..383dc9d9d9c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-05-15 Jan Hubicka <jh@suse.cz> + + * gcc.dg/lto/attr-weakref-1_0.c: New testcase. + * gcc.dg/lto/attr-weakref-1_1.c: New testcase. + * gcc.dg/lto/attr-weakref-1_2.c: New testcase. + 2013-05-14 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com> * gcc.dg/torture/alias-1.c: Add dg-require-effective-target diff --git a/gcc/testsuite/g++.dg/torture/20070621-1.C b/gcc/testsuite/g++.dg/torture/20070621-1.C index 185314a47ca..15d1ac74c99 100644 --- a/gcc/testsuite/g++.dg/torture/20070621-1.C +++ b/gcc/testsuite/g++.dg/torture/20070621-1.C @@ -1,3 +1,4 @@ +// { dg-do compile } /* Reduced from libstdc++-v3/testsuite/25_algorithms/equal/1.cc 1.2.ii: In function 'void test1()': diff --git a/gcc/testsuite/gcc.dg/lto/attr-weakref-1_0.c b/gcc/testsuite/gcc.dg/lto/attr-weakref-1_0.c new file mode 100644 index 00000000000..1e02f68f2c1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/attr-weakref-1_0.c @@ -0,0 +1,29 @@ +/* { dg-lto-do run } */ +int first = 0; +void abort (void); +int second = 0; +void callmealias (void) +{ + if (!first || !second) + abort (); +} +void callmefirst (void) +{ + if (first) + abort(); + first = 1; +} +void callmesecond (void) +{ + if (!first) + abort(); + if (second) + abort(); + second = 1; +} +main() +{ + c(); + b(); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/lto/attr-weakref-1_1.c b/gcc/testsuite/gcc.dg/lto/attr-weakref-1_1.c new file mode 100644 index 00000000000..67e6e1c1fdc --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/attr-weakref-1_1.c @@ -0,0 +1,7 @@ +extern void callmesecond(); +static void callmealias() __attribute__((weakref ("callmesecond"))); + +b() +{ + callmealias(); +} diff --git a/gcc/testsuite/gcc.dg/lto/attr-weakref-1_2.c b/gcc/testsuite/gcc.dg/lto/attr-weakref-1_2.c new file mode 100644 index 00000000000..6f382f61e5e --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/attr-weakref-1_2.c @@ -0,0 +1,7 @@ +extern void callmefirst(); +static void callmealias() __attribute__((weakref ("callmefirst"))); + +c() +{ + callmealias(); +} diff --git a/gcc/varpool.c b/gcc/varpool.c index dbf519e6137..e3ad22b1cfd 100644 --- a/gcc/varpool.c +++ b/gcc/varpool.c @@ -86,6 +86,10 @@ dump_varpool_node (FILE *f, struct varpool_node *node) fprintf (f, " finalized"); if (node->output) fprintf (f, " output"); + if (TREE_READONLY (node->symbol.decl)) + fprintf (f, " read-only"); + if (const_value_known_p (node->symbol.decl)) + fprintf (f, " const-value-known"); fprintf (f, "\n"); } |