From afbb56ab924d9f419ac4f65f5c535ebdbd22f16e Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Thu, 12 Feb 2015 15:03:00 -0800
Subject: [PATCH] non-default visibility is local
---
gcc/cgraphunit.c | 4 +++-
gcc/varasm.c | 12 +++++++++---
2 files changed, 12 insertions(+), 4 deletions(-)
@@ -442,8 +442,10 @@ cgraph_node::finalize_function (tree decl, bool no_collect)
node->local.redefined_extern_inline = true;
}
- notice_global_symbol (decl);
+ /* Set definition first before calling notice_global_symbol so that
+ it is available to notice_global_symbol. */
node->definition = true;
+ notice_global_symbol (decl);
node->lowered = DECL_STRUCT_FUNCTION (decl)->cfg != NULL;
/* With -fkeep-inline-functions we are keeping all inline functions except
@@ -6830,9 +6830,15 @@ default_binds_local_p_2 (const_tree exp, bool shlib, bool weak_dominate)
bool resolved_locally = false;
if (symtab_node *node = symtab_node::get (exp))
{
- /* When not building shared library and weak_dominate is true:
- weak, common or initialized symbols are resolved locally. */
- if ((weak_dominate && !shlib && node->definition)
+ /* When weak_dominate is true and not building shared library or
+ non-default visibility is specified by user: weak, common or
+ initialized symbols are resolved locally.
+ */
+ if (((!shlib
+ || (DECL_VISIBILITY_SPECIFIED (exp)
+ && DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT))
+ && weak_dominate
+ && node->definition)
|| node->in_other_partition
|| resolution_local_p (node->resolution))
resolved_locally = true;
--
1.9.3