summaryrefslogtreecommitdiff
path: root/gcc/ipa-visibility.c
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2015-12-07 17:36:54 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2015-12-07 17:36:54 +0000
commite0dec29d6fa999d00c10078a676e253ea9a944cc (patch)
tree88a2ecfa7b9a4506583492a38ea5179fc643bd39 /gcc/ipa-visibility.c
parent796bb135db3d9f2e75722bccca526c96f234d56b (diff)
downloadlinaro-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.c32
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);