Implement the final missing bits for block extractor support. Now bugpoint
authorChris Lattner <sabre@nondot.org>
Wed, 12 May 2004 02:43:24 +0000 (02:43 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 12 May 2004 02:43:24 +0000 (02:43 +0000)
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

tools/bugpoint/Miscompilation.cpp

index adbc62d3eb97f3cc83bad91240a223f2381e6c3d..4c957ac480e9583bf6da4ca87a6304d997d67de2 100644 (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;
 }