1 //===- NewPMDriver.cpp - Driver for opt with new PM -----------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 /// \file 10 /// 11 /// This file is just a split of the code that logically belongs in opt.cpp but 12 /// that includes the new pass manager headers. 13 /// 14 //===----------------------------------------------------------------------===// 15 16 #include "NewPMDriver.h" 17 #include "Passes.h" 18 #include "llvm/ADT/StringRef.h" 19 #include "llvm/Analysis/LazyCallGraph.h" 20 #include "llvm/Bitcode/BitcodeWriterPass.h" 21 #include "llvm/IR/IRPrintingPasses.h" 22 #include "llvm/IR/LLVMContext.h" 23 #include "llvm/IR/Module.h" 24 #include "llvm/IR/PassManager.h" 25 #include "llvm/IR/Verifier.h" 26 #include "llvm/Support/CommandLine.h" 27 #include "llvm/Support/ErrorHandling.h" 28 #include "llvm/Support/ToolOutputFile.h" 29 30 using namespace llvm; 31 using namespace opt_tool; 32 33 bool llvm::runPassPipeline(StringRef Arg0, LLVMContext &Context, Module &M, 34 tool_output_file *Out, StringRef PassPipeline, 35 OutputKind OK, VerifierKind VK) { 36 FunctionAnalysisManager FAM; 37 ModuleAnalysisManager MAM; 38 39 // FIXME: Lift this registration of analysis passes into a .def file adjacent 40 // to the one used to associate names with passes. 41 MAM.registerPass(LazyCallGraphAnalysis()); 42 43 // Cross register the analysis managers through their proxies. 44 MAM.registerPass(FunctionAnalysisManagerModuleProxy(FAM)); 45 FAM.registerPass(ModuleAnalysisManagerFunctionProxy(MAM)); 46 47 ModulePassManager MPM; 48 if (VK > VK_NoVerifier) 49 MPM.addPass(VerifierPass()); 50 51 if (!parsePassPipeline(MPM, PassPipeline, VK == VK_VerifyEachPass)) { 52 errs() << Arg0 << ": unable to parse pass pipeline description.\n"; 53 return false; 54 } 55 56 if (VK > VK_NoVerifier) 57 MPM.addPass(VerifierPass()); 58 59 // Add any relevant output pass at the end of the pipeline. 60 switch (OK) { 61 case OK_NoOutput: 62 break; // No output pass needed. 63 case OK_OutputAssembly: 64 MPM.addPass(PrintModulePass(Out->os())); 65 break; 66 case OK_OutputBitcode: 67 MPM.addPass(BitcodeWriterPass(Out->os())); 68 break; 69 } 70 71 // Before executing passes, print the final values of the LLVM options. 72 cl::PrintOptionValues(); 73 74 // Now that we have all of the passes ready, run them. 75 MPM.run(&M, &MAM); 76 77 // Declare success. 78 if (OK != OK_NoOutput) 79 Out->keep(); 80 return true; 81 } 82