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