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 "llvm/ADT/StringRef.h" 18#include "llvm/Analysis/AliasAnalysis.h" 19#include "llvm/Analysis/CGSCCPassManager.h" 20#include "llvm/Analysis/LoopPassManager.h" 21#include "llvm/Bitcode/BitcodeWriterPass.h" 22#include "llvm/IR/Dominators.h" 23#include "llvm/IR/IRPrintingPasses.h" 24#include "llvm/IR/LLVMContext.h" 25#include "llvm/IR/Module.h" 26#include "llvm/IR/PassManager.h" 27#include "llvm/IR/Verifier.h" 28#include "llvm/Passes/PassBuilder.h" 29#include "llvm/Support/CommandLine.h" 30#include "llvm/Support/ErrorHandling.h" 31#include "llvm/Support/ToolOutputFile.h" 32#include "llvm/Target/TargetMachine.h" 33 34using namespace llvm; 35using namespace opt_tool; 36 37static cl::opt<bool> 38 DebugPM("debug-pass-manager", cl::Hidden, 39 cl::desc("Print pass management debugging information")); 40 41// This flag specifies a textual description of the alias analysis pipeline to 42// use when querying for aliasing information. It only works in concert with 43// the "passes" flag above. 44static cl::opt<std::string> 45 AAPipeline("aa-pipeline", 46 cl::desc("A textual description of the alias analysis " 47 "pipeline for handling managed aliasing queries"), 48 cl::Hidden); 49 50bool llvm::runPassPipeline(StringRef Arg0, LLVMContext &Context, Module &M, 51 TargetMachine *TM, tool_output_file *Out, 52 StringRef PassPipeline, OutputKind OK, 53 VerifierKind VK, 54 bool ShouldPreserveAssemblyUseListOrder, 55 bool ShouldPreserveBitcodeUseListOrder) { 56 PassBuilder PB(TM); 57 58 // Specially handle the alias analysis manager so that we can register 59 // a custom pipeline of AA passes with it. 60 AAManager AA; 61 if (!PB.parseAAPipeline(AA, AAPipeline)) { 62 errs() << Arg0 << ": unable to parse AA pipeline description.\n"; 63 return false; 64 } 65 66 LoopAnalysisManager LAM(DebugPM); 67 FunctionAnalysisManager FAM(DebugPM); 68 CGSCCAnalysisManager CGAM(DebugPM); 69 ModuleAnalysisManager MAM(DebugPM); 70 71 // Register the AA manager first so that our version is the one used. 72 FAM.registerPass([&] { return std::move(AA); }); 73 74 // Register all the basic analyses with the managers. 75 PB.registerModuleAnalyses(MAM); 76 PB.registerCGSCCAnalyses(CGAM); 77 PB.registerFunctionAnalyses(FAM); 78 PB.registerLoopAnalyses(LAM); 79 PB.crossRegisterProxies(LAM, FAM, CGAM, MAM); 80 81 ModulePassManager MPM(DebugPM); 82 if (VK > VK_NoVerifier) 83 MPM.addPass(VerifierPass()); 84 85 if (!PB.parsePassPipeline(MPM, PassPipeline, VK == VK_VerifyEachPass, 86 DebugPM)) { 87 errs() << Arg0 << ": unable to parse pass pipeline description.\n"; 88 return false; 89 } 90 91 if (VK > VK_NoVerifier) 92 MPM.addPass(VerifierPass()); 93 94 // Add any relevant output pass at the end of the pipeline. 95 switch (OK) { 96 case OK_NoOutput: 97 break; // No output pass needed. 98 case OK_OutputAssembly: 99 MPM.addPass( 100 PrintModulePass(Out->os(), "", ShouldPreserveAssemblyUseListOrder)); 101 break; 102 case OK_OutputBitcode: 103 MPM.addPass( 104 BitcodeWriterPass(Out->os(), ShouldPreserveBitcodeUseListOrder)); 105 break; 106 } 107 108 // Before executing passes, print the final values of the LLVM options. 109 cl::PrintOptionValues(); 110 111 // Now that we have all of the passes ready, run them. 112 MPM.run(M, MAM); 113 114 // Declare success. 115 if (OK != OK_NoOutput) 116 Out->keep(); 117 return true; 118} 119