1
0
mirror of https://github.com/c64scene-ar/llvm-6502.git synced 2025-04-05 17:39:16 +00:00

Simplify ModuleLinker::getLinkageResult. NFC.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@217441 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2014-09-09 14:07:40 +00:00
parent b3fa7e412b
commit efed46fe31

@ -670,11 +670,22 @@ bool ModuleLinker::getComdatResult(const Comdat *SrcC,
LinkFromSrc);
}
/// getLinkageResult - This analyzes the two global values and determines what
/// the result will look like in the destination module. In particular, it
/// computes the resultant linkage type and visibility, computes whether the
/// global in the source should be copied over to the destination (replacing
/// the existing one), and computes whether this linkage is an error or not.
// FIXME: Duplicated from the gold plugin. This should be refactored somewhere.
static bool isDeclaration(const GlobalValue &V) {
if (V.hasAvailableExternallyLinkage())
return true;
if (V.isMaterializable())
return false;
return V.isDeclaration();
}
/// This analyzes the two global values and determines what the result will look
/// like in the destination module. In particular, it computes the resultant
/// linkage type and visibility, computes whether the global in the source
/// should be copied over to the destination (replacing the existing one), and
/// computes whether this linkage is an error or not.
bool ModuleLinker::getLinkageResult(GlobalValue *Dest, const GlobalValue *Src,
GlobalValue::LinkageTypes &LT,
GlobalValue::VisibilityTypes &Vis,
@ -683,8 +694,8 @@ bool ModuleLinker::getLinkageResult(GlobalValue *Dest, const GlobalValue *Src,
assert(!Src->hasLocalLinkage() &&
"If Src has internal linkage, Dest shouldn't be set!");
bool SrcIsDeclaration = Src->isDeclaration() && !Src->isMaterializable();
bool DestIsDeclaration = Dest->isDeclaration();
bool SrcIsDeclaration = isDeclaration(*Src);
bool DestIsDeclaration = isDeclaration(*Dest);
if (SrcIsDeclaration) {
// If Src is external or if both Src & Dest are external.. Just link the
@ -703,17 +714,15 @@ bool ModuleLinker::getLinkageResult(GlobalValue *Dest, const GlobalValue *Src,
LinkFromSrc = false;
LT = Dest->getLinkage();
}
} else if (DestIsDeclaration && !Dest->hasDLLImportStorageClass()) {
} else if (DestIsDeclaration) {
// If Dest is external but Src is not:
LinkFromSrc = true;
LT = Src->getLinkage();
} else if (Src->isWeakForLinker()) {
// At this point we know that Dest has LinkOnce, External*, Weak, Common,
// or DLL* linkage.
if (Dest->hasExternalWeakLinkage() ||
Dest->hasAvailableExternallyLinkage() ||
(Dest->hasLinkOnceLinkage() &&
(Src->hasWeakLinkage() || Src->hasCommonLinkage()))) {
assert(!Dest->hasExternalWeakLinkage());
assert(!Dest->hasAvailableExternallyLinkage());
if (Dest->hasLinkOnceLinkage() &&
(Src->hasWeakLinkage() || Src->hasCommonLinkage())) {
LinkFromSrc = true;
LT = Src->getLinkage();
} else {
@ -721,20 +730,16 @@ bool ModuleLinker::getLinkageResult(GlobalValue *Dest, const GlobalValue *Src,
LT = Dest->getLinkage();
}
} else if (Dest->isWeakForLinker()) {
// At this point we know that Src has External* or DLL* linkage.
if (Src->hasExternalWeakLinkage()) {
LinkFromSrc = false;
LT = Dest->getLinkage();
} else {
LinkFromSrc = true;
LT = GlobalValue::ExternalLinkage;
}
assert(!Src->hasExternalWeakLinkage());
LinkFromSrc = true;
LT = GlobalValue::ExternalLinkage;
} else {
assert((Dest->hasExternalLinkage() || Dest->hasExternalWeakLinkage()) &&
(Src->hasExternalLinkage() || Src->hasExternalWeakLinkage()) &&
assert(!Src->hasExternalWeakLinkage());
assert(!Dest->hasExternalWeakLinkage());
assert(Dest->hasExternalLinkage() && Src->hasExternalLinkage() &&
"Unexpected linkage type!");
return emitError("Linking globals named '" + Src->getName() +
"': symbol multiply defined!");
"': symbol multiply defined!");
}
// Compute the visibility. We follow the rules in the System V Application