diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-12-07 17:36:54 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-12-07 17:36:54 +0000 |
commit | e0dec29d6fa999d00c10078a676e253ea9a944cc (patch) | |
tree | 88a2ecfa7b9a4506583492a38ea5179fc643bd39 /gcc/ipa-visibility.c | |
parent | 796bb135db3d9f2e75722bccca526c96f234d56b (diff) | |
download | linaro-gcc-e0dec29d6fa999d00c10078a676e253ea9a944cc.tar.gz linaro-gcc-e0dec29d6fa999d00c10078a676e253ea9a944cc.tar.bz2 linaro-gcc-e0dec29d6fa999d00c10078a676e253ea9a944cc.zip |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@231373 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ipa-visibility.c')
-rw-r--r-- | gcc/ipa-visibility.c | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/gcc/ipa-visibility.c b/gcc/ipa-visibility.c index 2eab214243e..0423f242af0 100644 --- a/gcc/ipa-visibility.c +++ b/gcc/ipa-visibility.c @@ -185,6 +185,8 @@ static bool cgraph_externally_visible_p (struct cgraph_node *node, bool whole_program) { + while (node->transparent_alias && node->definition) + node = node->get_alias_target (); if (!node->definition) return false; if (!TREE_PUBLIC (node->decl) @@ -248,6 +250,8 @@ cgraph_externally_visible_p (struct cgraph_node *node, bool varpool_node::externally_visible_p (void) { + while (transparent_alias && definition) + return get_alias_target ()->externally_visible_p (); if (DECL_EXTERNAL (decl)) return true; @@ -531,7 +535,8 @@ function_and_variable_visibility (bool whole_program) next->set_comdat_group (NULL); if (!next->alias) next->set_section (NULL); - next->make_decl_local (); + if (!next->transparent_alias) + next->make_decl_local (); next->unique_name |= ((next->resolution == LDPR_PREVAILING_DEF_IRONLY || next->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP) && TREE_PUBLIC (next->decl) @@ -547,7 +552,8 @@ function_and_variable_visibility (bool whole_program) node->set_comdat_group (NULL); if (DECL_COMDAT (node->decl) && !node->alias) node->set_section (NULL); - node->make_decl_local (); + if (!node->transparent_alias) + node->make_decl_local (); } if (node->thunk.thunk_p @@ -654,7 +660,7 @@ function_and_variable_visibility (bool whole_program) DECL_ATTRIBUTES (vnode->decl))) vnode->no_reorder = 1; if (!vnode->externally_visible - && !vnode->weakref) + && !vnode->transparent_alias) { gcc_assert (in_lto_p || whole_program || !TREE_PUBLIC (vnode->decl)); vnode->unique_name |= ((vnode->resolution == LDPR_PREVAILING_DEF_IRONLY @@ -675,11 +681,14 @@ function_and_variable_visibility (bool whole_program) next->set_comdat_group (NULL); if (!next->alias) next->set_section (NULL); - next->make_decl_local (); - next->unique_name |= ((next->resolution == LDPR_PREVAILING_DEF_IRONLY - || next->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP) - && TREE_PUBLIC (next->decl) - && !flag_incremental_link); + if (!next->transparent_alias) + { + next->make_decl_local (); + next->unique_name |= ((next->resolution == LDPR_PREVAILING_DEF_IRONLY + || next->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP) + && TREE_PUBLIC (next->decl) + && !flag_incremental_link); + } } vnode->dissolve_same_comdat_group_list (); } @@ -687,8 +696,11 @@ function_and_variable_visibility (bool whole_program) vnode->set_comdat_group (NULL); if (DECL_COMDAT (vnode->decl) && !vnode->alias) vnode->set_section (NULL); - vnode->make_decl_local (); - vnode->resolution = LDPR_PREVAILING_DEF_IRONLY; + if (!vnode->transparent_alias) + { + vnode->make_decl_local (); + vnode->resolution = LDPR_PREVAILING_DEF_IRONLY; + } } update_visibility_by_resolution_info (vnode); |