mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-07-23 01:30:19 +00:00
use 'continue' to make the function linker simpler. When linking a strong
function into a weak function, zap the weak function body so that the strong one overrides it. This fixes PR2410 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52135 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8246849829
commit
822143e6f7
@ -916,20 +916,26 @@ static bool LinkFunctionProtos(Module *Dest, const Module *Src,
|
|||||||
// the declarations, we aren't adding anything.
|
// the declarations, we aren't adding anything.
|
||||||
if (SF->hasDLLImportLinkage()) {
|
if (SF->hasDLLImportLinkage()) {
|
||||||
if (DF->isDeclaration()) {
|
if (DF->isDeclaration()) {
|
||||||
ValueMap.insert(std::make_pair(SF, DF));
|
ValueMap[SF] = DF;
|
||||||
DF->setLinkage(SF->getLinkage());
|
DF->setLinkage(SF->getLinkage());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ValueMap[SF] = DF;
|
ValueMap[SF] = DF;
|
||||||
}
|
}
|
||||||
} else if (DF->isDeclaration() && !DF->hasDLLImportLinkage()) {
|
continue;
|
||||||
// If DF is external but SF is not...
|
}
|
||||||
// Link the external functions, update linkage qualifiers
|
|
||||||
|
// If DF is external but SF is not, link the external functions, update
|
||||||
|
// linkage qualifiers.
|
||||||
|
if (DF->isDeclaration() && !DF->hasDLLImportLinkage()) {
|
||||||
ValueMap.insert(std::make_pair(SF, DF));
|
ValueMap.insert(std::make_pair(SF, DF));
|
||||||
DF->setLinkage(SF->getLinkage());
|
DF->setLinkage(SF->getLinkage());
|
||||||
} else if (SF->hasWeakLinkage() || SF->hasLinkOnceLinkage() ||
|
continue;
|
||||||
SF->hasCommonLinkage()) {
|
}
|
||||||
// At this point we know that DF has LinkOnce, Weak, or External* linkage.
|
|
||||||
|
// At this point we know that DF has LinkOnce, Weak, or External* linkage.
|
||||||
|
if (SF->hasWeakLinkage() || SF->hasLinkOnceLinkage() ||
|
||||||
|
SF->hasCommonLinkage()) {
|
||||||
ValueMap[SF] = DF;
|
ValueMap[SF] = DF;
|
||||||
|
|
||||||
// Linkonce+Weak = Weak
|
// Linkonce+Weak = Weak
|
||||||
@ -938,24 +944,34 @@ static bool LinkFunctionProtos(Module *Dest, const Module *Src,
|
|||||||
(SF->hasWeakLinkage() || SF->hasCommonLinkage())) ||
|
(SF->hasWeakLinkage() || SF->hasCommonLinkage())) ||
|
||||||
DF->hasExternalWeakLinkage())
|
DF->hasExternalWeakLinkage())
|
||||||
DF->setLinkage(SF->getLinkage());
|
DF->setLinkage(SF->getLinkage());
|
||||||
} else if (DF->hasWeakLinkage() || DF->hasLinkOnceLinkage() ||
|
continue;
|
||||||
DF->hasCommonLinkage()) {
|
}
|
||||||
|
|
||||||
|
if (DF->hasWeakLinkage() || DF->hasLinkOnceLinkage() ||
|
||||||
|
DF->hasCommonLinkage()) {
|
||||||
// At this point we know that SF has LinkOnce or External* linkage.
|
// At this point we know that SF has LinkOnce or External* linkage.
|
||||||
ValueMap[SF] = DF;
|
ValueMap[SF] = DF;
|
||||||
if (!SF->hasLinkOnceLinkage() && !SF->hasExternalWeakLinkage())
|
|
||||||
// Don't inherit linkonce & external weak linkage
|
// If the source function has stronger linkage than the destination,
|
||||||
|
// its body and linkage should override ours.
|
||||||
|
if (!SF->hasLinkOnceLinkage() && !SF->hasExternalWeakLinkage()) {
|
||||||
|
// Don't inherit linkonce & external weak linkage.
|
||||||
DF->setLinkage(SF->getLinkage());
|
DF->setLinkage(SF->getLinkage());
|
||||||
} else if (SF->getLinkage() != DF->getLinkage()) {
|
DF->deleteBody();
|
||||||
return Error(Err, "Functions named '" + SF->getName() +
|
}
|
||||||
"' have different linkage specifiers!");
|
continue;
|
||||||
} else if (SF->hasExternalLinkage()) {
|
}
|
||||||
// The function is defined identically in both modules!!
|
|
||||||
|
if (SF->getLinkage() != DF->getLinkage())
|
||||||
|
return Error(Err, "Functions named '" + SF->getName() +
|
||||||
|
"' have different linkage specifiers!");
|
||||||
|
|
||||||
|
// The function is defined identically in both modules!
|
||||||
|
if (SF->hasExternalLinkage())
|
||||||
return Error(Err, "Function '" +
|
return Error(Err, "Function '" +
|
||||||
ToStr(SF->getFunctionType(), Src) + "':\"" +
|
ToStr(SF->getFunctionType(), Src) + "':\"" +
|
||||||
SF->getName() + "\" - Function is already defined!");
|
SF->getName() + "\" - Function is already defined!");
|
||||||
} else {
|
assert(0 && "Unknown linkage configuration found!");
|
||||||
assert(0 && "Unknown linkage configuration found!");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user