mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
31acdea7b2
It seems nicer to list passes given a flag rather than displaying all passes in opt --help. This is awkwardly structured because a PassBuilder is required, but reusing the PassBuilder in runPassPipeline() doesn't work because we read the input IR before getting to runPassPipeline(). So printing the list of passes needs to happen before reading the input IR. If we remove the legacy PM code in main() and move everything from NewPMDriver.cpp into opt.cpp, we can create the PassBuilder before reading IR and check if we should print the list of passes and exit. But until then this hack seems fine. Compared to the legacy PM, the new PM passes are lacking descriptions. We'll need to figure out a way to add descriptions if we think this is important. Also, this only works for passes specified in PassRegistry.def. If we want to print other custom registered passes, we'll need a different mechanism. Reviewed By: asbirlea Differential Revision: https://reviews.llvm.org/D96101
80 lines
2.5 KiB
C++
80 lines
2.5 KiB
C++
//===- NewPMDriver.h - Function to drive opt with the new PM ----*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
/// \file
|
|
///
|
|
/// A single function which is called to drive the opt behavior for the new
|
|
/// PassManager.
|
|
///
|
|
/// This is only in a separate TU with a header to avoid including all of the
|
|
/// old pass manager headers and the new pass manager headers into the same
|
|
/// file. Eventually all of the routines here will get folded back into
|
|
/// opt.cpp.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_TOOLS_OPT_NEWPMDRIVER_H
|
|
#define LLVM_TOOLS_OPT_NEWPMDRIVER_H
|
|
|
|
#include "llvm/ADT/ArrayRef.h"
|
|
#include "llvm/Support/CommandLine.h"
|
|
|
|
namespace llvm {
|
|
class StringRef;
|
|
class Module;
|
|
class TargetMachine;
|
|
class ToolOutputFile;
|
|
class TargetLibraryInfoImpl;
|
|
|
|
extern cl::opt<bool> DebugifyEach;
|
|
extern cl::opt<std::string> DebugifyExport;
|
|
|
|
namespace opt_tool {
|
|
enum OutputKind {
|
|
OK_NoOutput,
|
|
OK_OutputAssembly,
|
|
OK_OutputBitcode,
|
|
OK_OutputThinLTOBitcode,
|
|
};
|
|
enum VerifierKind {
|
|
VK_NoVerifier,
|
|
VK_VerifyInAndOut,
|
|
VK_VerifyEachPass
|
|
};
|
|
enum PGOKind {
|
|
NoPGO,
|
|
InstrGen,
|
|
InstrUse,
|
|
SampleUse
|
|
};
|
|
enum CSPGOKind { NoCSPGO, CSInstrGen, CSInstrUse };
|
|
}
|
|
|
|
void printPasses(raw_ostream &OS);
|
|
|
|
/// Driver function to run the new pass manager over a module.
|
|
///
|
|
/// This function only exists factored away from opt.cpp in order to prevent
|
|
/// inclusion of the new pass manager headers and the old headers into the same
|
|
/// file. It's interface is consequentially somewhat ad-hoc, but will go away
|
|
/// when the transition finishes.
|
|
///
|
|
/// ThinLTOLinkOut is only used when OK is OK_OutputThinLTOBitcode, and can be
|
|
/// nullptr.
|
|
bool runPassPipeline(StringRef Arg0, Module &M, TargetMachine *TM,
|
|
TargetLibraryInfoImpl *TLII, ToolOutputFile *Out,
|
|
ToolOutputFile *ThinLinkOut, ToolOutputFile *OptRemarkFile,
|
|
StringRef PassPipeline, ArrayRef<StringRef> PassInfos,
|
|
opt_tool::OutputKind OK, opt_tool::VerifierKind VK,
|
|
bool ShouldPreserveAssemblyUseListOrder,
|
|
bool ShouldPreserveBitcodeUseListOrder,
|
|
bool EmitSummaryIndex, bool EmitModuleHash,
|
|
bool EnableDebugify, bool Coroutines);
|
|
} // namespace llvm
|
|
|
|
#endif
|