From 4a76032da63f0c9006336d9b9ab1074cf657b2c3 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Mon, 13 Jan 2014 03:08:40 +0000 Subject: [PATCH] [PM] Add an enum for describing the desired output strategy, and run that through the interface rather than a simple bool. This should allow starting to wire up real output to round-trip IR through opt with the new pass manager. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199071 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/opt/NewPMDriver.cpp | 5 +++-- tools/opt/NewPMDriver.h | 10 +++++++++- tools/opt/opt.cpp | 10 ++++++++-- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/tools/opt/NewPMDriver.cpp b/tools/opt/NewPMDriver.cpp index e577995e260..b05da36d281 100644 --- a/tools/opt/NewPMDriver.cpp +++ b/tools/opt/NewPMDriver.cpp @@ -23,10 +23,11 @@ #include "llvm/Support/ToolOutputFile.h" using namespace llvm; +using namespace opt_tool; bool llvm::runPassPipeline(StringRef Arg0, LLVMContext &Context, Module &M, tool_output_file *Out, StringRef PassPipeline, - bool NoOutput) { + OutputKind OK) { // Before executing passes, print the final values of the LLVM options. cl::PrintOptionValues(); @@ -40,7 +41,7 @@ bool llvm::runPassPipeline(StringRef Arg0, LLVMContext &Context, Module &M, MPM.run(&M); // Declare success. - if (!NoOutput) + if (OK != OK_NoOutput) Out->keep(); return true; } diff --git a/tools/opt/NewPMDriver.h b/tools/opt/NewPMDriver.h index 17ac75be549..2ae1ad5d838 100644 --- a/tools/opt/NewPMDriver.h +++ b/tools/opt/NewPMDriver.h @@ -28,6 +28,14 @@ class LLVMContext; class Module; class tool_output_file; +namespace opt_tool { +enum OutputKind { + OK_NoOutput, + OK_OutputAssembly, + OK_OutputBitcode +}; +} + /// \brief Driver function to run the new pass manager over a module. /// /// This function only exists factored away from opt.cpp in order to prevent @@ -36,7 +44,7 @@ class tool_output_file; /// when the transition finishes. bool runPassPipeline(StringRef Arg0, LLVMContext &Context, Module &M, tool_output_file *Out, StringRef PassPipeline, - bool NoOutput); + opt_tool::OutputKind OK); } #endif diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp index 92b63bd8303..c4ab3426509 100644 --- a/tools/opt/opt.cpp +++ b/tools/opt/opt.cpp @@ -49,6 +49,7 @@ #include #include using namespace llvm; +using namespace opt_tool; // The OptimizationList is automatically populated with registered Passes by the // PassNameParser. @@ -670,14 +671,19 @@ int main(int argc, char **argv) { if (CheckBitcodeOutputToConsole(Out->os(), !Quiet)) NoOutput = true; - if (PassPipeline.getNumOccurrences() > 0) + if (PassPipeline.getNumOccurrences() > 0) { + OutputKind OK = OK_NoOutput; + if (!NoOutput) + OK = OutputAssembly ? OK_OutputAssembly : OK_OutputBitcode; + // The user has asked to use the new pass manager and provided a pipeline // string. Hand off the rest of the functionality to the new code for that // layer. return runPassPipeline(argv[0], Context, *M.get(), Out.get(), PassPipeline, - NoOutput) + OK) ? 0 : 1; + } // Create a PassManager to hold and optimize the collection of passes we are // about to build.