diff options
author | Chris Lattner <sabre@nondot.org> | 2004-05-12 02:43:24 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-05-12 02:43:24 +0000 |
commit | 2290e754061f1393bb96b1808ac33dc03399c939 (patch) | |
tree | ccd6cc2c067eeb86badb34944f14c3fc9c949110 /tools/bugpoint | |
parent | 300e74b43fd75d240bea59049c3b729e3b0d9539 (diff) | |
download | llvm-2290e754061f1393bb96b1808ac33dc03399c939.tar.gz llvm-2290e754061f1393bb96b1808ac33dc03399c939.tar.bz2 llvm-2290e754061f1393bb96b1808ac33dc03399c939.tar.xz |
Implement the final missing bits for block extractor support. Now bugpoint
can extract basic blocks up to the limit of the block extractor implementation.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13475 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/bugpoint')
-rw-r--r-- | tools/bugpoint/Miscompilation.cpp | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/tools/bugpoint/Miscompilation.cpp b/tools/bugpoint/Miscompilation.cpp index adbc62d3eb..4c957ac480 100644 --- a/tools/bugpoint/Miscompilation.cpp +++ b/tools/bugpoint/Miscompilation.cpp @@ -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; } |