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/CGSCCPassManager.h" 20 #include "llvm/Bitcode/BitcodeWriterPass.h" 21 #include "llvm/IR/Dominators.h" 22 #include "llvm/IR/IRPrintingPasses.h" 23 #include "llvm/IR/LLVMContext.h" 24 #include "llvm/IR/Module.h" 25 #include "llvm/IR/PassManager.h" 26 #include "llvm/IR/Verifier.h" 27 #include "llvm/Support/CommandLine.h" 28 #include "llvm/Support/ErrorHandling.h" 29 #include "llvm/Support/ToolOutputFile.h" 30 #include "llvm/Target/TargetMachine.h" 31 32 using namespace llvm; 33 using namespace opt_tool; 34 35 static cl::opt<bool> 36 DebugPM("debug-pass-manager", cl::Hidden, 37 cl::desc("Print pass management debugging information")); 38 39 bool llvm::runPassPipeline(StringRef Arg0, LLVMContext &Context, Module &M, 40 TargetMachine *TM, tool_output_file *Out, 41 StringRef PassPipeline, OutputKind OK, 42 VerifierKind VK) { 43 Passes P(TM); 44 45 FunctionAnalysisManager FAM(DebugPM); 46 CGSCCAnalysisManager CGAM(DebugPM); 47 ModuleAnalysisManager MAM(DebugPM); 48 49 // Register all the basic analyses with the managers. 50 P.registerModuleAnalyses(MAM); 51 P.registerCGSCCAnalyses(CGAM); 52 P.registerFunctionAnalyses(FAM); 53 54 // Cross register the analysis managers through their proxies. 55 MAM.registerPass(FunctionAnalysisManagerModuleProxy(FAM)); 56 MAM.registerPass(CGSCCAnalysisManagerModuleProxy(CGAM)); 57 CGAM.registerPass(FunctionAnalysisManagerCGSCCProxy(FAM)); 58 CGAM.registerPass(ModuleAnalysisManagerCGSCCProxy(MAM)); 59 FAM.registerPass(CGSCCAnalysisManagerFunctionProxy(CGAM)); 60 FAM.registerPass(ModuleAnalysisManagerFunctionProxy(MAM)); 61 62 ModulePassManager MPM(DebugPM); 63 if (VK > VK_NoVerifier) 64 MPM.addPass(VerifierPass()); 65 66 if (!P.parsePassPipeline(MPM, PassPipeline, VK == VK_VerifyEachPass, 67 DebugPM)) { 68 errs() << Arg0 << ": unable to parse pass pipeline description.\n"; 69 return false; 70 } 71 72 if (VK > VK_NoVerifier) 73 MPM.addPass(VerifierPass()); 74 75 // Add any relevant output pass at the end of the pipeline. 76 switch (OK) { 77 case OK_NoOutput: 78 break; // No output pass needed. 79 case OK_OutputAssembly: 80 MPM.addPass(PrintModulePass(Out->os())); 81 break; 82 case OK_OutputBitcode: 83 MPM.addPass(BitcodeWriterPass(Out->os())); 84 break; 85 } 86 87 // Before executing passes, print the final values of the LLVM options. 88 cl::PrintOptionValues(); 89 90 // Now that we have all of the passes ready, run them. 91 MPM.run(M, &MAM); 92 93 // Declare success. 94 if (OK != OK_NoOutput) 95 Out->keep(); 96 return true; 97 } 98