aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-03-14 21:17:03 +0000
committerChris Lattner <sabre@nondot.org>2004-03-14 21:17:03 +0000
commit3b6441e1050a9a2a55c79f58513191b3195fdaf7 (patch)
treecc0e85a78ee3f83f2b4b348cfbdf5c6a630f82f0 /tools
parentefdc0b505712d1ca4460def27e51c430f033d58d (diff)
downloadexternal_llvm-3b6441e1050a9a2a55c79f58513191b3195fdaf7.zip
external_llvm-3b6441e1050a9a2a55c79f58513191b3195fdaf7.tar.gz
external_llvm-3b6441e1050a9a2a55c79f58513191b3195fdaf7.tar.bz2
Add new method
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12394 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools')
-rw-r--r--tools/bugpoint/BugDriver.h5
-rw-r--r--tools/bugpoint/OptimizerDriver.cpp23
2 files changed, 28 insertions, 0 deletions
diff --git a/tools/bugpoint/BugDriver.h b/tools/bugpoint/BugDriver.h
index a4428cf..b1cc3e8 100644
--- a/tools/bugpoint/BugDriver.h
+++ b/tools/bugpoint/BugDriver.h
@@ -190,6 +190,11 @@ public:
/// program or if the loop extractor crashes.
Module *ExtractLoop(Module *M);
+ /// runPassesOn - Carefully run the specified set of pass on the specified
+ /// module, returning the transformed module on success, or a null pointer on
+ /// failure.
+ Module *runPassesOn(Module *M, const std::vector<const PassInfo*> &Passes);
+
/// runPasses - Run the specified passes on Program, outputting a bytecode
/// file and writting the filename into OutputFile if successful. If the
/// optimizations fail for some reason (optimizer crashes), return true,
diff --git a/tools/bugpoint/OptimizerDriver.cpp b/tools/bugpoint/OptimizerDriver.cpp
index d21b5b5..d741265 100644
--- a/tools/bugpoint/OptimizerDriver.cpp
+++ b/tools/bugpoint/OptimizerDriver.cpp
@@ -161,3 +161,26 @@ bool BugDriver::runPasses(const std::vector<const PassInfo*> &Passes,
return !ExitedOK;
}
+
+/// runPassesOn - Carefully run the specified set of pass on the specified
+/// module, returning the transformed module on success, or a null pointer on
+/// failure.
+Module *BugDriver::runPassesOn(Module *M,
+ const std::vector<const PassInfo*> &Passes) {
+ Module *OldProgram = swapProgramIn(M);
+ std::string BytecodeResult;
+ if (runPasses(Passes, BytecodeResult, false/*delete*/, true/*quiet*/))
+ return 0;
+
+ // Restore the current program.
+ swapProgramIn(OldProgram);
+
+ Module *Ret = ParseInputFile(BytecodeResult);
+ if (Ret == 0) {
+ std::cerr << getToolName() << ": Error reading bytecode file '"
+ << BytecodeResult << "'!\n";
+ exit(1);
+ }
+ removeFile(BytecodeResult); // No longer need the file on disk
+ return Ret;
+}