1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

Implement the final missing bits for block extractor support. Now bugpoint

can extract basic blocks up to the limit of the block extractor implementation.

llvm-svn: 13475
This commit is contained in:
Chris Lattner 2004-05-12 02:43:24 +00:00
parent 9f74e683c2
commit 9bb62d5754

View File

@ -403,13 +403,46 @@ static bool ExtractBlocks(BugDriver &BD,
if (Blocks.size() == OldSize)
return false;
Module *ProgClone = CloneModule(BD.getProgram());
Module *ToExtract = SplitFunctionsOutOfModule(ProgClone,
MiscompiledFunctions);
Module *Extracted = BD.ExtractMappedBlocksFromModule(Blocks, ToExtract);
if (Extracted == 0) {
// Wierd, extraction should have worked.
std::cerr << "Nondeterministic problem extracting blocks??\n";
delete ProgClone;
delete ToExtract;
return false;
}
// Otherwise, block extraction succeeded. Link the two program fragments back
// together.
delete ToExtract;
// FIXME: This should actually update the module in the bugdriver!
std::string ErrorMsg;
if (LinkModules(ProgClone, Extracted, &ErrorMsg)) {
std::cerr << BD.getToolName() << ": Error linking modules together:"
<< ErrorMsg << "\n";
exit(1);
}
// Set the new program and delete the old one.
BD.setNewProgram(ProgClone);
// Update the list of miscompiled functions.
MiscompiledFunctions.clear();
return false;
for (Module::iterator I = Extracted->begin(), E = Extracted->end(); I != E;
++I)
if (!I->isExternal()) {
Function *NF = ProgClone->getFunction(I->getName(), I->getFunctionType());
assert(NF && "Mapped function not found!");
MiscompiledFunctions.push_back(NF);
}
delete Extracted;
return true;
}