123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- //===- NewPMDriver.cpp - Driver for opt with new PM -----------------------===//
- //
- // The LLVM Compiler Infrastructure
- //
- // This file is distributed under the University of Illinois Open Source
- // License. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- /// \file
- ///
- /// This file is just a split of the code that logically belongs in opt.cpp but
- /// that includes the new pass manager headers.
- ///
- //===----------------------------------------------------------------------===//
- #include "NewPMDriver.h"
- #include "llvm/ADT/StringRef.h"
- #include "llvm/Analysis/CGSCCPassManager.h"
- #include "llvm/Bitcode/BitcodeWriterPass.h"
- #include "llvm/IR/Dominators.h"
- #include "llvm/IR/IRPrintingPasses.h"
- #include "llvm/IR/LLVMContext.h"
- #include "llvm/IR/Module.h"
- #include "llvm/IR/PassManager.h"
- #include "llvm/IR/Verifier.h"
- #include "llvm/Passes/PassBuilder.h"
- #include "llvm/Support/CommandLine.h"
- #include "llvm/Support/ErrorHandling.h"
- #include "llvm/Support/ToolOutputFile.h"
- #include "llvm/Target/TargetMachine.h"
- using namespace llvm;
- using namespace opt_tool;
- static cl::opt<bool>
- DebugPM("debug-pass-manager", cl::Hidden,
- cl::desc("Print pass management debugging information"));
- bool llvm::runPassPipeline(StringRef Arg0, LLVMContext &Context, Module &M,
- TargetMachine *TM, tool_output_file *Out,
- StringRef PassPipeline, OutputKind OK,
- VerifierKind VK,
- bool ShouldPreserveAssemblyUseListOrder,
- bool ShouldPreserveBitcodeUseListOrder) {
- PassBuilder PB(TM);
- FunctionAnalysisManager FAM(DebugPM);
- CGSCCAnalysisManager CGAM(DebugPM);
- ModuleAnalysisManager MAM(DebugPM);
- // Register all the basic analyses with the managers.
- PB.registerModuleAnalyses(MAM);
- PB.registerCGSCCAnalyses(CGAM);
- PB.registerFunctionAnalyses(FAM);
- // Cross register the analysis managers through their proxies.
- MAM.registerPass(FunctionAnalysisManagerModuleProxy(FAM));
- MAM.registerPass(CGSCCAnalysisManagerModuleProxy(CGAM));
- CGAM.registerPass(FunctionAnalysisManagerCGSCCProxy(FAM));
- CGAM.registerPass(ModuleAnalysisManagerCGSCCProxy(MAM));
- FAM.registerPass(CGSCCAnalysisManagerFunctionProxy(CGAM));
- FAM.registerPass(ModuleAnalysisManagerFunctionProxy(MAM));
- ModulePassManager MPM(DebugPM);
- if (VK > VK_NoVerifier)
- MPM.addPass(VerifierPass());
- if (!PB.parsePassPipeline(MPM, PassPipeline, VK == VK_VerifyEachPass,
- DebugPM)) {
- errs() << Arg0 << ": unable to parse pass pipeline description.\n";
- return false;
- }
- if (VK > VK_NoVerifier)
- MPM.addPass(VerifierPass());
- // 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(), "", ShouldPreserveAssemblyUseListOrder));
- break;
- case OK_OutputBitcode:
- MPM.addPass(
- BitcodeWriterPass(Out->os(), ShouldPreserveBitcodeUseListOrder));
- break;
- }
- // 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, &MAM);
- // Declare success.
- if (OK != OK_NoOutput)
- Out->keep();
- return true;
- }
|