From: Chris Lattner Date: Wed, 12 May 2004 02:43:24 +0000 (+0000) Subject: Implement the final missing bits for block extractor support. Now bugpoint X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=2290e754061f1393bb96b1808ac33dc03399c939;p=oota-llvm.git 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 --- diff --git a/tools/bugpoint/Miscompilation.cpp b/tools/bugpoint/Miscompilation.cpp index adbc62d3eb9..4c957ac480e 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; }