mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-29 22:30:33 +00:00
LTO: Check local linkage first
Since visibility is meaningless for symbols with local linkage, check local linkage before visibility when setting symbol attributes. When linkage is `internal` and the visibility is `hidden`, the exposed attribute is now `LTO_SYMBOL_SCOPE_INTERNAL` instead of `LTO_SYMBOL_SCOPE_HIDDEN`. Although the bitfield allows *both* to be specified, the combination is nonsense anyway. Given changes (in progress) to drop visibility when a symbol has local linkage, this almost has no functionality change: it's mostly a cleanup to clarify the logic. The exception is when something has `appending` linkage. Before this change, such symbols would be advertised as `LTO_SYMBOL_SCOPE_INTERNAL`; now, they'll be given `LTO_SYMBOL_SCOPE_COMMON`. Unfortunately this is really awkward to test. This only changes what we advertise to linkers (before running LTO), not what the final object looks like. In theory I could add `DEBUG` output to `llvm-lto` (and test with "REQUIRES: asserts"), but follow-up commits to disallow `internal hidden` simplify this anyway. <rdar://problem/16141113> llvm-svn: 208261
This commit is contained in:
parent
548eb2e304
commit
9739ca9e59
@ -418,17 +418,17 @@ void LTOModule::addDefinedSymbol(const GlobalValue *def, bool isFunction) {
|
||||
attr |= LTO_SYMBOL_DEFINITION_REGULAR;
|
||||
|
||||
// set scope part
|
||||
if (def->hasHiddenVisibility())
|
||||
if (def->hasLocalLinkage())
|
||||
// Ignore visibility if linkage is local.
|
||||
attr |= LTO_SYMBOL_SCOPE_INTERNAL;
|
||||
else if (def->hasHiddenVisibility())
|
||||
attr |= LTO_SYMBOL_SCOPE_HIDDEN;
|
||||
else if (def->hasProtectedVisibility())
|
||||
attr |= LTO_SYMBOL_SCOPE_PROTECTED;
|
||||
else if (canBeHidden(def))
|
||||
attr |= LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN;
|
||||
else if (def->hasExternalLinkage() || def->hasWeakLinkage() ||
|
||||
def->hasLinkOnceLinkage() || def->hasCommonLinkage())
|
||||
attr |= LTO_SYMBOL_SCOPE_DEFAULT;
|
||||
else
|
||||
attr |= LTO_SYMBOL_SCOPE_INTERNAL;
|
||||
attr |= LTO_SYMBOL_SCOPE_DEFAULT;
|
||||
|
||||
StringSet::value_type &entry = _defines.GetOrCreateValue(Buffer);
|
||||
entry.setValue(1);
|
||||
|
Loading…
Reference in New Issue
Block a user