From b353c3f7f2eb9d04d46ecb254b9b5d34ff51148a Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Mon, 13 Jan 2014 05:16:45 +0000 Subject: [PATCH] [PM] Wire up support for printing assembly output from the opt command. This lets us round-trip IR in the expected manner with the opt tool. llvm-svn: 199075 --- llvm/test/Other/new-pass-manager.ll | 6 ++++++ llvm/tools/opt/NewPMDriver.cpp | 19 ++++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/llvm/test/Other/new-pass-manager.ll b/llvm/test/Other/new-pass-manager.ll index 48b97624b804..d7cfb5ec7a40 100644 --- a/llvm/test/Other/new-pass-manager.ll +++ b/llvm/test/Other/new-pass-manager.ll @@ -23,6 +23,12 @@ ; CHECK-FUNCTION-PRINT: Finished function pass manager ; CHECK-FUNCTION-PRINT: Finished module pass manager +; RUN: opt -S -o - -passes='no-op-module,no-op-module' %s \ +; RUN: | FileCheck %s --check-prefix=CHECK-NOOP +; CHECK-NOOP: define void @foo() { +; CHECK-NOOP: ret void +; CHECK-NOOP: } + define void @foo() { ret void } diff --git a/llvm/tools/opt/NewPMDriver.cpp b/llvm/tools/opt/NewPMDriver.cpp index b05da36d2812..c7534e794a4e 100644 --- a/llvm/tools/opt/NewPMDriver.cpp +++ b/llvm/tools/opt/NewPMDriver.cpp @@ -16,10 +16,12 @@ #include "NewPMDriver.h" #include "Passes.h" #include "llvm/ADT/StringRef.h" +#include "llvm/IR/IRPrintingPasses.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/IR/PassManager.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ToolOutputFile.h" using namespace llvm; @@ -28,15 +30,26 @@ using namespace opt_tool; bool llvm::runPassPipeline(StringRef Arg0, LLVMContext &Context, Module &M, tool_output_file *Out, StringRef PassPipeline, OutputKind OK) { - // Before executing passes, print the final values of the LLVM options. - cl::PrintOptionValues(); - ModulePassManager MPM; if (!parsePassPipeline(MPM, PassPipeline)) { errs() << Arg0 << ": unable to parse pass pipeline description.\n"; return false; } + // Add any relevant output pass at the end of the pipeline. + switch (OK) { + case OK_NoOutput: + break; // No output pass needed. + case OK_OutputAssembly: + MPM.addPass(PrintModulePass(Out->os())); + break; + case OK_OutputBitcode: + llvm::report_fatal_error("Bitcode output is not yet implemented!"); + } + + // Before executing passes, print the final values of the LLVM options. + cl::PrintOptionValues(); + // Now that we have all of the passes ready, run them. MPM.run(&M);