Skip to content

Commit

Permalink
LLVMTargetMachine/TargetPassConfig: Simplify handling of start/stop o…
Browse files Browse the repository at this point in the history
…ptions; NFC

- Make some TargetPassConfig methods that just check whether options have
  been set static.
- Shuffle code in LLVMTargetMachine around so addPassesToGenerateCode
  only deals with TargetPassConfig now (but not with MCContext or the
  creation of MachineModuleInfo)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@345918 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
MatzeB committed Nov 2, 2018
1 parent 2495823 commit 94f7fc2
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 41 deletions.
21 changes: 7 additions & 14 deletions include/llvm/CodeGen/TargetPassConfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,27 +145,20 @@ class TargetPassConfig : public ImmutablePass {

CodeGenOpt::Level getOptLevel() const;

/// Describe the status of the codegen
/// pipeline set by this target pass config.
/// Having a limited codegen pipeline means that options
/// have been used to restrict what codegen is doing.
/// In particular, that means that codegen won't emit
/// assembly code.
bool hasLimitedCodeGenPipeline() const;
/// Returns true if one of the `-start-after`, `-start-before`, `-stop-after`
/// or `-stop-before` options is set.
static bool hasLimitedCodeGenPipeline();

/// Returns true if none of the `-stop-before` and `-stop-after` options is
/// set.
static bool willCompleteCodeGenPipeline();

/// If hasLimitedCodeGenPipeline is true, this method
/// returns a string with the name of the options, separated
/// by \p Separator that caused this pipeline to be limited.
std::string
getLimitedCodeGenPipelineReason(const char *Separator = "/") const;

/// Check if the codegen pipeline is limited in such a way that it
/// won't be complete. When the codegen pipeline is not complete,
/// this means it may not be possible to generate assembly from it.
bool willCompleteCodeGenPipeline() const {
return !hasLimitedCodeGenPipeline() || (!StopAfter && !StopBefore);
}

void setDisableVerify(bool Disable) { setOpt(DisableVerify, Disable); }

bool getEnableTailMerge() const { return EnableTailMerge; }
Expand Down
46 changes: 21 additions & 25 deletions lib/CodeGen/LLVMTargetMachine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,29 +95,22 @@ LLVMTargetMachine::getTargetTransformInfo(const Function &F) {
}

/// addPassesToX helper drives creation and initialization of TargetPassConfig.
static MCContext *
addPassesToGenerateCode(LLVMTargetMachine *TM, PassManagerBase &PM,
bool DisableVerify, bool &WillCompleteCodeGenPipeline,
raw_pwrite_stream &Out, MachineModuleInfo *MMI) {
static TargetPassConfig *
addPassesToGenerateCode(LLVMTargetMachine &TM, PassManagerBase &PM,
bool DisableVerify, MachineModuleInfo &MMI) {
// Targets may override createPassConfig to provide a target-specific
// subclass.
TargetPassConfig *PassConfig = TM->createPassConfig(PM);
TargetPassConfig *PassConfig = TM.createPassConfig(PM);
// Set PassConfig options provided by TargetMachine.
PassConfig->setDisableVerify(DisableVerify);
WillCompleteCodeGenPipeline = PassConfig->willCompleteCodeGenPipeline();
PM.add(PassConfig);
if (!MMI)
MMI = new MachineModuleInfo(TM);
PM.add(MMI);
PM.add(&MMI);

if (PassConfig->addISelPasses())
return nullptr;
PassConfig->addMachinePasses();
PassConfig->setInitialized();
if (!WillCompleteCodeGenPipeline)
PM.add(createPrintMIRPass(Out));

return &MMI->getContext();
return PassConfig;
}

bool LLVMTargetMachine::addAsmPrinter(PassManagerBase &PM,
Expand Down Expand Up @@ -201,14 +194,16 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
bool DisableVerify,
MachineModuleInfo *MMI) {
// Add common CodeGen passes.
bool WillCompleteCodeGenPipeline = true;
MCContext *Context = addPassesToGenerateCode(
this, PM, DisableVerify, WillCompleteCodeGenPipeline, Out, MMI);
if (!Context)
if (!MMI)
MMI = new MachineModuleInfo(this);
TargetPassConfig *PassConfig =
addPassesToGenerateCode(*this, PM, DisableVerify, *MMI);
if (!PassConfig)
return true;

if (WillCompleteCodeGenPipeline &&
addAsmPrinter(PM, Out, DwoOut, FileType, *Context))
if (!TargetPassConfig::willCompleteCodeGenPipeline()) {
PM.add(createPrintMIRPass(Out));
} else if (addAsmPrinter(PM, Out, DwoOut, FileType, MMI->getContext()))
return true;

PM.add(createFreeMachineFunctionPass());
Expand All @@ -224,14 +219,15 @@ bool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM, MCContext *&Ctx,
raw_pwrite_stream &Out,
bool DisableVerify) {
// Add common CodeGen passes.
bool WillCompleteCodeGenPipeline = true;
Ctx = addPassesToGenerateCode(this, PM, DisableVerify,
WillCompleteCodeGenPipeline, Out,
/*MachineModuleInfo*/ nullptr);
if (!Ctx)
MachineModuleInfo *MMI = new MachineModuleInfo(this);
TargetPassConfig *PassConfig =
addPassesToGenerateCode(*this, PM, DisableVerify, *MMI);
if (!PassConfig)
return true;
assert(WillCompleteCodeGenPipeline && "CodeGen pipeline has been altered");
assert(TargetPassConfig::willCompleteCodeGenPipeline() &&
"Cannot emit MC with limited codegen pipeline");

Ctx = &MMI->getContext();
if (Options.MCOptions.MCSaveTempLabels)
Ctx->setAllowTemporaryLabels(false);

Expand Down
9 changes: 7 additions & 2 deletions lib/CodeGen/TargetPassConfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -419,8 +419,13 @@ TargetPassConfig::TargetPassConfig()
"triple set?");
}

bool TargetPassConfig::hasLimitedCodeGenPipeline() const {
return StartBefore || StartAfter || StopBefore || StopAfter;
bool TargetPassConfig::willCompleteCodeGenPipeline() {
return StopBeforeOpt.empty() && StopAfterOpt.empty();
}

bool TargetPassConfig::hasLimitedCodeGenPipeline() {
return !StartBeforeOpt.empty() || !StartAfterOpt.empty() ||
!willCompleteCodeGenPipeline();
}

std::string
Expand Down

0 comments on commit 94f7fc2

Please sign in to comment.