diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2015-12-07 18:36:54 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2015-12-07 17:36:54 +0000 |
commit | 71e546870c4afb3c3ff993bd354a98637bcccdc7 (patch) | |
tree | 88a2ecfa7b9a4506583492a38ea5179fc643bd39 /gcc/cgraph.h | |
parent | 058c6384fe443310b1788dcdc8880beba24d6b43 (diff) | |
download | gcc-71e546870c4afb3c3ff993bd354a98637bcccdc7.zip gcc-71e546870c4afb3c3ff993bd354a98637bcccdc7.tar.gz gcc-71e546870c4afb3c3ff993bd354a98637bcccdc7.tar.bz2 |
re PR lto/61886 (LTO breaks fread with _FORTIFY_SOURCE=2)
PR ipa/61886
* symtab.c (ultimate_transparent_alias_target): New inline function.
(symbol_table::assembler_names_equal_p): New method; break out from ...
(symbol_table::decl_assembler_name_equal): ... here.
(symbol_table::change_decl_assembler_name): Also update names and
translation links of transparent aliases.
(symtab_node::dump_base): Dump transparent_alias.
(symtab_node::verify_base): Implement basic transparent alias
verification.
(symtab_node::make_decl_local): Support localization of weakrefs;
recurse to transparent aliases; set TREE_STATIC.
(symtab_node::ultimate_alias_target_1): Handle visibility of
transparent aliases.
(symtab_node::resolve_alias): New parmaeter transparent; handle
transparent aliases; recurse to aliases of aliases to fix comdat
groups.
(symtab_node::get_partitioning_class): Handle transparent aliases.
* ipa-visibility.c (cgraph_externally_visible_p,
varpool_node::externally_visible_p): Visibility of transparent alias
depends on its target.
(function_and_variable_visibility): Do not tweak visibility of
transparent laiases.
(function_and_variable_visibility): Likewise.
* ipa.c (symbol_table::remove_unreachable_nodes): Clear
transparent_alias flag.
* alias.c (cgraph_node::create_alias, cgraph_node::get_availability):
Support transparent aliases.
* cgraph.h (symtab_node): Update prototype of resolve_alias;
add transparent_alias flag.
(symbol_table: Add assembler_names_equal_p.
(symtab_node::real_symbol_p): Skip transparent aliases.
* cgraphunit.c (cgraph_node::reset): Reset transparent_alias flag.
(handle_alias_pairs): Set transparent_alias for weakref.
(cgraph_node::assemble_thunks_and_aliases): Do not asemble transparent
aliases.
* lto-cgraph.c (lto_output_node): When outputting same_comdat_group
skip symbols not put into boundary; stream transparent_alias.
(lto_output_varpool_node): Likewise.
(input_overwrite_node, input_varpool_node): Stream transparent alias.
* varpool.c (ctor_for_folding, varpool_node::get_availability,
varpool_node::assemble_aliases,
symbol_table::remove_unreferenced_decls): Handle transparent aliase.
(varpool_node::create_alias): Set transparent_alias.
* lto-partition.c (add_symbol_to_partition_1, contained_in_symbol,
rename_statics, rename_statics): Handle transparent aliases.
From-SVN: r231373
Diffstat (limited to 'gcc/cgraph.h')
-rw-r--r-- | gcc/cgraph.h | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/gcc/cgraph.h b/gcc/cgraph.h index e689fcd..7c643502 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -249,9 +249,10 @@ public: inline symtab_node *next_defined_symbol (void); /* Add reference recording that symtab node is alias of TARGET. + If TRANSPARENT is true make the alias to be transparent alias. The function can fail in the case of aliasing cycles; in this case it returns false. */ - bool resolve_alias (symtab_node *target); + bool resolve_alias (symtab_node *target, bool transparent = false); /* C++ FE sometimes change linkage flags after producing same body aliases. */ @@ -421,6 +422,28 @@ public: /* True when symbol is an alias. Set by ssemble_alias. */ unsigned alias : 1; + /* When true the alias is translated into its target symbol either by GCC + or assembler (it also may just be a duplicate declaration of the same + linker name). + + Currently transparent aliases come in three different flavors + - aliases having the same assembler name as their target (aka duplicated + declarations). In this case the assembler names compare via + assembler_names_equal_p and weakref is false + - aliases that are renamed at a time being output to final file + by varasm.c. For those DECL_ASSEMBLER_NAME have + IDENTIFIER_TRANSPARENT_ALIAS set and thus also their assembler + name must be unique. + Weakrefs belong to this cateogry when we target assembler without + .weakref directive. + - weakrefs that are renamed by assembler via .weakref directive. + In this case the alias may or may not be definition (depending if + target declaration was seen by the compiler), weakref is set. + Unless we are before renaming statics, assembler names are different. + + Given that we now support duplicate declarations, the second option is + redundant and will be removed. */ + unsigned transparent_alias : 1; /* True when alias is a weakref. */ unsigned weakref : 1; /* C++ frontend produce same body aliases and extra name aliases for @@ -2098,6 +2121,10 @@ public: /* Set the DECL_ASSEMBLER_NAME and update symtab hashtables. */ void change_decl_assembler_name (tree decl, tree name); + /* Return true if assembler names NAME1 and NAME2 leads to the same symbol + name. */ + static bool assembler_names_equal_p (const char *name1, const char *name2); + int cgraph_count; int cgraph_max_uid; int cgraph_max_summary_uid; @@ -2251,6 +2278,8 @@ symtab_node::real_symbol_p (void) if (DECL_ABSTRACT_P (decl)) return false; + if (transparent_alias && definition) + return false; if (!is_a <cgraph_node *> (this)) return true; cnode = dyn_cast <cgraph_node *> (this); |