mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-05 13:26:55 +00:00
Extend TargetPassConfig to allow running only a subset of the normal passes.
This is still a work in progress but I believe it is currently good enough to fix PR13122 "Need unit test driver for codegen IR passes". For example, you can run llc with -stop-after=loop-reduce to have it dump out the IR after running LSR. Serializing machine-level IR is not yet supported but we have some patches in progress for that. The plan is to serialize the IR to a YAML file, containing separate sections for the LLVM IR, machine-level IR, and whatever other info is needed. Chad suggested that we stash the stop-after pass in the YAML file and use that instead of the start-after option to figure out where to restart the compilation. I think that's a great idea, but since it's not implemented yet I put the -start-after option into this patch for testing purposes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@159570 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
|
||||
#include "llvm/Transforms/Scalar.h"
|
||||
#include "llvm/PassManager.h"
|
||||
#include "llvm/Assembly/PrintModulePass.h"
|
||||
#include "llvm/CodeGen/AsmPrinter.h"
|
||||
#include "llvm/CodeGen/Passes.h"
|
||||
#include "llvm/CodeGen/MachineFunctionAnalysis.h"
|
||||
@@ -81,9 +82,12 @@ LLVMTargetMachine::LLVMTargetMachine(const Target &T, StringRef Triple,
|
||||
/// addPassesToX helper drives creation and initialization of TargetPassConfig.
|
||||
static MCContext *addPassesToGenerateCode(LLVMTargetMachine *TM,
|
||||
PassManagerBase &PM,
|
||||
bool DisableVerify) {
|
||||
bool DisableVerify,
|
||||
AnalysisID StartAfter,
|
||||
AnalysisID StopAfter) {
|
||||
// Targets may override createPassConfig to provide a target-specific sublass.
|
||||
TargetPassConfig *PassConfig = TM->createPassConfig(PM);
|
||||
PassConfig->setStartStopPasses(StartAfter, StopAfter);
|
||||
|
||||
// Set PassConfig options provided by TargetMachine.
|
||||
PassConfig->setDisableVerify(DisableVerify);
|
||||
@@ -127,12 +131,25 @@ static MCContext *addPassesToGenerateCode(LLVMTargetMachine *TM,
|
||||
bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
|
||||
formatted_raw_ostream &Out,
|
||||
CodeGenFileType FileType,
|
||||
bool DisableVerify) {
|
||||
bool DisableVerify,
|
||||
AnalysisID StartAfter,
|
||||
AnalysisID StopAfter) {
|
||||
// Add common CodeGen passes.
|
||||
MCContext *Context = addPassesToGenerateCode(this, PM, DisableVerify);
|
||||
MCContext *Context = addPassesToGenerateCode(this, PM, DisableVerify,
|
||||
StartAfter, StopAfter);
|
||||
if (!Context)
|
||||
return true;
|
||||
|
||||
if (StopAfter) {
|
||||
// FIXME: The intent is that this should eventually write out a YAML file,
|
||||
// containing the LLVM IR, the machine-level IR (when stopping after a
|
||||
// machine-level pass), and whatever other information is needed to
|
||||
// deserialize the code and resume compilation. For now, just write the
|
||||
// LLVM IR.
|
||||
PM.add(createPrintModulePass(&Out));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (hasMCSaveTempLabels())
|
||||
Context->setAllowTemporaryLabels(false);
|
||||
|
||||
@@ -216,7 +233,7 @@ bool LLVMTargetMachine::addPassesToEmitMachineCode(PassManagerBase &PM,
|
||||
JITCodeEmitter &JCE,
|
||||
bool DisableVerify) {
|
||||
// Add common CodeGen passes.
|
||||
MCContext *Context = addPassesToGenerateCode(this, PM, DisableVerify);
|
||||
MCContext *Context = addPassesToGenerateCode(this, PM, DisableVerify, 0, 0);
|
||||
if (!Context)
|
||||
return true;
|
||||
|
||||
@@ -236,7 +253,7 @@ bool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM,
|
||||
raw_ostream &Out,
|
||||
bool DisableVerify) {
|
||||
// Add common CodeGen passes.
|
||||
Ctx = addPassesToGenerateCode(this, PM, DisableVerify);
|
||||
Ctx = addPassesToGenerateCode(this, PM, DisableVerify, 0, 0);
|
||||
if (!Ctx)
|
||||
return true;
|
||||
|
||||
|
@@ -213,7 +213,8 @@ TargetPassConfig::~TargetPassConfig() {
|
||||
// Out of line constructor provides default values for pass options and
|
||||
// registers all common codegen passes.
|
||||
TargetPassConfig::TargetPassConfig(TargetMachine *tm, PassManagerBase &pm)
|
||||
: ImmutablePass(ID), PM(&pm), TM(tm), Impl(0), Initialized(false),
|
||||
: ImmutablePass(ID), PM(&pm), StartAfter(0), StopAfter(0),
|
||||
Started(true), Stopped(false), TM(tm), Impl(0), Initialized(false),
|
||||
DisableVerify(false),
|
||||
EnableTailMerge(true) {
|
||||
|
||||
@@ -271,11 +272,22 @@ AnalysisID TargetPassConfig::getPassSubstitution(AnalysisID ID) const {
|
||||
return I->second;
|
||||
}
|
||||
|
||||
/// Add a pass to the PassManager.
|
||||
/// Add a pass to the PassManager if that pass is supposed to be run. If the
|
||||
/// Started/Stopped flags indicate either that the compilation should start at
|
||||
/// a later pass or that it should stop after an earlier pass, then do not add
|
||||
/// the pass. Finally, compare the current pass against the StartAfter
|
||||
/// and StopAfter options and change the Started/Stopped flags accordingly.
|
||||
void TargetPassConfig::addPass(Pass *P) {
|
||||
assert(!Initialized && "PassConfig is immutable");
|
||||
|
||||
PM->add(P);
|
||||
if (Started && !Stopped)
|
||||
PM->add(P);
|
||||
if (StopAfter == P->getPassID())
|
||||
Stopped = true;
|
||||
if (StartAfter == P->getPassID())
|
||||
Started = true;
|
||||
if (Stopped && !Started)
|
||||
report_fatal_error("Cannot stop compilation after pass that is not run");
|
||||
}
|
||||
|
||||
/// Add a CodeGen pass at this point in the pipeline after checking for target
|
||||
|
Reference in New Issue
Block a user