mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-02 07:32:52 +00:00
Specutively revert r178130.
This may be causing a failure on some buildbots: Referencing function in another module! tail call fastcc void @_ZL11EvaluateOpstPtRj(i16 zeroext %17, i16* %Vals, i32* %NumVals), !dbg !219 Referencing function in another module! tail call fastcc void @_ZL11EvaluateOpstPtRj(i16 zeroext %19, i16* %Vals, i32* %NumVals), !dbg !221 Broken module found, compilation aborted! Stack dump: 0. Running pass 'Function Pass Manager' on module 'ld-temp.o'. 1. Running pass 'Module Verifier' on function '@_ZL11EvaluateOpstPtRj' clang: error: unable to execute command: Illegal instruction: 4 clang: error: linker command failed due to signal (use -v to see invocation) <rdar://problem/13516485> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178156 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
354504320b
commit
d99a29e984
@ -370,16 +370,11 @@ namespace {
|
|||||||
|
|
||||||
unsigned Mode; // Mode to treat source module.
|
unsigned Mode; // Mode to treat source module.
|
||||||
|
|
||||||
struct LazyLinkEntry {
|
|
||||||
Function *Fn;
|
|
||||||
llvm::SmallPtrSet<User*, 4> Uses;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Set of items not to link in from source.
|
// Set of items not to link in from source.
|
||||||
SmallPtrSet<const Value*, 16> DoNotLinkFromSource;
|
SmallPtrSet<const Value*, 16> DoNotLinkFromSource;
|
||||||
|
|
||||||
// Vector of functions to lazily link in.
|
// Vector of functions to lazily link in.
|
||||||
std::vector<LazyLinkEntry> LazilyLinkFunctions;
|
std::vector<Function*> LazilyLinkFunctions;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
std::string ErrorMsg;
|
std::string ErrorMsg;
|
||||||
@ -806,18 +801,6 @@ bool ModuleLinker::linkFunctionProto(Function *SF) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the function is to be lazily linked, don't create it just yet.
|
|
||||||
// Instead, remember its current set of uses to diff against later.
|
|
||||||
if (!DGV && (SF->hasLocalLinkage() || SF->hasLinkOnceLinkage() ||
|
|
||||||
SF->hasAvailableExternallyLinkage())) {
|
|
||||||
LazyLinkEntry LLE;
|
|
||||||
LLE.Fn = SF;
|
|
||||||
LLE.Uses.insert(SF->use_begin(), SF->use_end());
|
|
||||||
LazilyLinkFunctions.push_back(LLE);
|
|
||||||
DoNotLinkFromSource.insert(SF);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If there is no linkage to be performed or we are linking from the source,
|
// If there is no linkage to be performed or we are linking from the source,
|
||||||
// bring SF over.
|
// bring SF over.
|
||||||
Function *NewDF = Function::Create(TypeMap.get(SF->getFunctionType()),
|
Function *NewDF = Function::Create(TypeMap.get(SF->getFunctionType()),
|
||||||
@ -830,6 +813,13 @@ bool ModuleLinker::linkFunctionProto(Function *SF) {
|
|||||||
// Any uses of DF need to change to NewDF, with cast.
|
// Any uses of DF need to change to NewDF, with cast.
|
||||||
DGV->replaceAllUsesWith(ConstantExpr::getBitCast(NewDF, DGV->getType()));
|
DGV->replaceAllUsesWith(ConstantExpr::getBitCast(NewDF, DGV->getType()));
|
||||||
DGV->eraseFromParent();
|
DGV->eraseFromParent();
|
||||||
|
} else {
|
||||||
|
// Internal, LO_ODR, or LO linkage - stick in set to ignore and lazily link.
|
||||||
|
if (SF->hasLocalLinkage() || SF->hasLinkOnceLinkage() ||
|
||||||
|
SF->hasAvailableExternallyLinkage()) {
|
||||||
|
DoNotLinkFromSource.insert(SF);
|
||||||
|
LazilyLinkFunctions.push_back(SF);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ValueMap[SF] = NewDF;
|
ValueMap[SF] = NewDF;
|
||||||
@ -1246,33 +1236,16 @@ bool ModuleLinker::run() {
|
|||||||
do {
|
do {
|
||||||
LinkedInAnyFunctions = false;
|
LinkedInAnyFunctions = false;
|
||||||
|
|
||||||
for(std::vector<LazyLinkEntry>::iterator I = LazilyLinkFunctions.begin(),
|
for(std::vector<Function*>::iterator I = LazilyLinkFunctions.begin(),
|
||||||
E = LazilyLinkFunctions.end(); I != E; ++I) {
|
E = LazilyLinkFunctions.end(); I != E; ++I) {
|
||||||
Function *SF = I->Fn;
|
if (!*I)
|
||||||
if (!SF)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// If the number of uses of this function is the same as it was at the
|
Function *SF = *I;
|
||||||
// start of the link, it is not used in this link.
|
Function *DF = cast<Function>(ValueMap[SF]);
|
||||||
if (SF->getNumUses() != I->Uses.size()) {
|
|
||||||
Function *DF = Function::Create(TypeMap.get(SF->getFunctionType()),
|
if (!DF->use_empty()) {
|
||||||
SF->getLinkage(), SF->getName(), DstM);
|
|
||||||
copyGVAttributes(DF, SF);
|
|
||||||
|
|
||||||
// Now, copy over any uses of SF that were from DstM to DF.
|
|
||||||
for (Function::use_iterator UI = SF->use_begin(), UE = SF->use_end();
|
|
||||||
UI != UE;) {
|
|
||||||
if (I->Uses.count(*UI) == 0) {
|
|
||||||
Use &U = UI.getUse();
|
|
||||||
// Increment UI before performing the set to ensure the iterator
|
|
||||||
// remains valid.
|
|
||||||
++UI;
|
|
||||||
U.set(DF);
|
|
||||||
} else {
|
|
||||||
++UI;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Materialize if necessary.
|
// Materialize if necessary.
|
||||||
if (SF->isDeclaration()) {
|
if (SF->isDeclaration()) {
|
||||||
if (!SF->isMaterializable())
|
if (!SF->isMaterializable())
|
||||||
@ -1286,7 +1259,7 @@ bool ModuleLinker::run() {
|
|||||||
SF->Dematerialize();
|
SF->Dematerialize();
|
||||||
|
|
||||||
// "Remove" from vector by setting the element to 0.
|
// "Remove" from vector by setting the element to 0.
|
||||||
I->Fn = 0;
|
*I = 0;
|
||||||
|
|
||||||
// Set flag to indicate we may have more functions to lazily link in
|
// Set flag to indicate we may have more functions to lazily link in
|
||||||
// since we linked in a function.
|
// since we linked in a function.
|
||||||
@ -1295,6 +1268,18 @@ bool ModuleLinker::run() {
|
|||||||
}
|
}
|
||||||
} while (LinkedInAnyFunctions);
|
} while (LinkedInAnyFunctions);
|
||||||
|
|
||||||
|
// Remove any prototypes of functions that were not actually linked in.
|
||||||
|
for(std::vector<Function*>::iterator I = LazilyLinkFunctions.begin(),
|
||||||
|
E = LazilyLinkFunctions.end(); I != E; ++I) {
|
||||||
|
if (!*I)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Function *SF = *I;
|
||||||
|
Function *DF = cast<Function>(ValueMap[SF]);
|
||||||
|
if (DF->use_empty())
|
||||||
|
DF->eraseFromParent();
|
||||||
|
}
|
||||||
|
|
||||||
// Now that all of the types from the source are used, resolve any structs
|
// Now that all of the types from the source are used, resolve any structs
|
||||||
// copied over to the dest that didn't exist there.
|
// copied over to the dest that didn't exist there.
|
||||||
TypeMap.linkDefinedTypeBodies();
|
TypeMap.linkDefinedTypeBodies();
|
||||||
|
Loading…
Reference in New Issue
Block a user