136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===- NewPMDriver.cpp - Driver for opt with new PM -----------------------===// 236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// The LLVM Compiler Infrastructure 436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file is distributed under the University of Illinois Open Source 636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// License. See LICENSE.TXT for details. 736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// \file 1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// 1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// This file is just a split of the code that logically belongs in opt.cpp but 1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// that includes the new pass manager headers. 1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// 1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "NewPMDriver.h" 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/StringRef.h" 18dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Analysis/CGSCCPassManager.h" 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Bitcode/BitcodeWriterPass.h" 20ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/Dominators.h" 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/IRPrintingPasses.h" 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/LLVMContext.h" 2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Module.h" 2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/PassManager.h" 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Verifier.h" 264c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/Passes/PassBuilder.h" 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/CommandLine.h" 2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/ErrorHandling.h" 2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/ToolOutputFile.h" 30ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Target/TargetMachine.h" 3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesusing namespace llvm; 3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesusing namespace opt_tool; 3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 35ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstatic cl::opt<bool> 36ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines DebugPM("debug-pass-manager", cl::Hidden, 37ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines cl::desc("Print pass management debugging information")); 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 39ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool llvm::runPassPipeline(StringRef Arg0, LLVMContext &Context, Module &M, 40ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines TargetMachine *TM, tool_output_file *Out, 41ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines StringRef PassPipeline, OutputKind OK, 422c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar VerifierKind VK, 432c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar bool ShouldPreserveAssemblyUseListOrder, 442c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar bool ShouldPreserveBitcodeUseListOrder) { 454c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar PassBuilder PB(TM); 46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 47ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines FunctionAnalysisManager FAM(DebugPM); 48ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines CGSCCAnalysisManager CGAM(DebugPM); 49ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines ModuleAnalysisManager MAM(DebugPM); 50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 51ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // Register all the basic analyses with the managers. 524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar PB.registerModuleAnalyses(MAM); 534c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar PB.registerCGSCCAnalyses(CGAM); 544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar PB.registerFunctionAnalyses(FAM); 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Cross register the analysis managers through their proxies. 5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MAM.registerPass(FunctionAnalysisManagerModuleProxy(FAM)); 58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MAM.registerPass(CGSCCAnalysisManagerModuleProxy(CGAM)); 59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines CGAM.registerPass(FunctionAnalysisManagerCGSCCProxy(FAM)); 60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines CGAM.registerPass(ModuleAnalysisManagerCGSCCProxy(MAM)); 61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines FAM.registerPass(CGSCCAnalysisManagerFunctionProxy(CGAM)); 6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FAM.registerPass(ModuleAnalysisManagerFunctionProxy(MAM)); 6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 64ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines ModulePassManager MPM(DebugPM); 6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (VK > VK_NoVerifier) 6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MPM.addPass(VerifierPass()); 6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 684c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar if (!PB.parsePassPipeline(MPM, PassPipeline, VK == VK_VerifyEachPass, 694c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar DebugPM)) { 7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines errs() << Arg0 << ": unable to parse pass pipeline description.\n"; 7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (VK > VK_NoVerifier) 7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MPM.addPass(VerifierPass()); 7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Add any relevant output pass at the end of the pipeline. 7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines switch (OK) { 7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case OK_NoOutput: 8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; // No output pass needed. 8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case OK_OutputAssembly: 822c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar MPM.addPass( 832c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar PrintModulePass(Out->os(), "", ShouldPreserveAssemblyUseListOrder)); 8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case OK_OutputBitcode: 862c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar MPM.addPass( 872c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar BitcodeWriterPass(Out->os(), ShouldPreserveBitcodeUseListOrder)); 8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Before executing passes, print the final values of the LLVM options. 9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines cl::PrintOptionValues(); 9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Now that we have all of the passes ready, run them. 95ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines MPM.run(M, &MAM); 9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Declare success. 9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (OK != OK_NoOutput) 9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Out->keep(); 10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 102