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/Analysis/LazyCallGraph.h"
21#include "llvm/Bitcode/BitcodeWriterPass.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
31using namespace llvm;
32using namespace opt_tool;
33
34bool llvm::runPassPipeline(StringRef Arg0, LLVMContext &Context, Module &M,
35                           tool_output_file *Out, StringRef PassPipeline,
36                           OutputKind OK, VerifierKind VK) {
37  FunctionAnalysisManager FAM;
38  CGSCCAnalysisManager CGAM;
39  ModuleAnalysisManager MAM;
40
41#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
42  MAM.registerPass(CREATE_PASS);
43#include "PassRegistry.def"
44
45#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
46  CGAM.registerPass(CREATE_PASS);
47#include "PassRegistry.def"
48
49#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
50  FAM.registerPass(CREATE_PASS);
51#include "PassRegistry.def"
52
53  // Cross register the analysis managers through their proxies.
54  MAM.registerPass(FunctionAnalysisManagerModuleProxy(FAM));
55  MAM.registerPass(CGSCCAnalysisManagerModuleProxy(CGAM));
56  CGAM.registerPass(FunctionAnalysisManagerCGSCCProxy(FAM));
57  CGAM.registerPass(ModuleAnalysisManagerCGSCCProxy(MAM));
58  FAM.registerPass(CGSCCAnalysisManagerFunctionProxy(CGAM));
59  FAM.registerPass(ModuleAnalysisManagerFunctionProxy(MAM));
60
61  ModulePassManager MPM;
62  if (VK > VK_NoVerifier)
63    MPM.addPass(VerifierPass());
64
65  if (!parsePassPipeline(MPM, PassPipeline, VK == VK_VerifyEachPass)) {
66    errs() << Arg0 << ": unable to parse pass pipeline description.\n";
67    return false;
68  }
69
70  if (VK > VK_NoVerifier)
71    MPM.addPass(VerifierPass());
72
73  // Add any relevant output pass at the end of the pipeline.
74  switch (OK) {
75  case OK_NoOutput:
76    break; // No output pass needed.
77  case OK_OutputAssembly:
78    MPM.addPass(PrintModulePass(Out->os()));
79    break;
80  case OK_OutputBitcode:
81    MPM.addPass(BitcodeWriterPass(Out->os()));
82    break;
83  }
84
85  // Before executing passes, print the final values of the LLVM options.
86  cl::PrintOptionValues();
87
88  // Now that we have all of the passes ready, run them.
89  MPM.run(&M, &MAM);
90
91  // Declare success.
92  if (OK != OK_NoOutput)
93    Out->keep();
94  return true;
95}
96