1 //===- NewPMDriver.h - Function to drive opt with the new PM ----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 /// \file
9 ///
10 /// A single function which is called to drive the opt behavior for the new
11 /// PassManager.
12 ///
13 /// This is only in a separate TU with a header to avoid including all of the
14 /// old pass manager headers and the new pass manager headers into the same
15 /// file. Eventually all of the routines here will get folded back into
16 /// opt.cpp.
17 ///
18 //===----------------------------------------------------------------------===//
19 
20 #ifndef LLVM_TOOLS_OPT_NEWPMDRIVER_H
21 #define LLVM_TOOLS_OPT_NEWPMDRIVER_H
22 
23 #include "llvm/Support/CommandLine.h"
24 
25 namespace llvm {
26 class StringRef;
27 class Module;
28 class PassPlugin;
29 class TargetMachine;
30 class ToolOutputFile;
31 class TargetLibraryInfoImpl;
32 
33 extern cl::opt<bool> DebugifyEach;
34 extern cl::opt<std::string> DebugifyExport;
35 
36 extern cl::opt<bool> VerifyEachDebugInfoPreserve;
37 extern cl::opt<std::string> VerifyDIPreserveExport;
38 
39 namespace opt_tool {
40 enum OutputKind {
41   OK_NoOutput,
42   OK_OutputAssembly,
43   OK_OutputBitcode,
44   OK_OutputThinLTOBitcode,
45 };
46 enum VerifierKind { VK_NoVerifier, VK_VerifyOut, VK_VerifyEachPass };
47 enum PGOKind {
48   NoPGO,
49   InstrGen,
50   InstrUse,
51   SampleUse
52 };
53 enum CSPGOKind { NoCSPGO, CSInstrGen, CSInstrUse };
54 }
55 
56 void printPasses(raw_ostream &OS);
57 
58 /// Driver function to run the new pass manager over a module.
59 ///
60 /// This function only exists factored away from opt.cpp in order to prevent
61 /// inclusion of the new pass manager headers and the old headers into the same
62 /// file. It's interface is consequentially somewhat ad-hoc, but will go away
63 /// when the transition finishes.
64 ///
65 /// ThinLTOLinkOut is only used when OK is OK_OutputThinLTOBitcode, and can be
66 /// nullptr.
67 bool runPassPipeline(StringRef Arg0, Module &M, TargetMachine *TM,
68                      TargetLibraryInfoImpl *TLII, ToolOutputFile *Out,
69                      ToolOutputFile *ThinLinkOut, ToolOutputFile *OptRemarkFile,
70                      StringRef PassPipeline,
71                      ArrayRef<PassPlugin> PassPlugins, opt_tool::OutputKind OK,
72                      opt_tool::VerifierKind VK,
73                      bool ShouldPreserveAssemblyUseListOrder,
74                      bool ShouldPreserveBitcodeUseListOrder,
75                      bool EmitSummaryIndex, bool EmitModuleHash,
76                      bool EnableDebugify, bool VerifyDIPreserve);
77 } // namespace llvm
78 
79 #endif
80