Skip to content

Commit

Permalink
llc: Rework -run-pass option
Browse files Browse the repository at this point in the history
We now construct a custom pass pipeline instead of injecting
start-before/stop-after into the default pipeline construction. This
allows to specify any pass known to the pass registry. Previously
specifying indirectly added analysis passes or passes not added to the
pipeline add all would not be added and we would silently do nothing.

This also restricts the -run-pass option to cases with .mir input.

llvm-svn: 269003
  • Loading branch information
MatzeB committed May 10, 2016
1 parent 47cf918 commit fb94d8d
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 27 deletions.
24 changes: 12 additions & 12 deletions llvm/include/llvm/CodeGen/Passes.h
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,18 @@ class TargetPassConfig : public ImmutablePass {
return nullptr;
}

/// printAndVerify - Add a pass to dump then verify the machine function, if
/// those steps are enabled.
///
void printAndVerify(const std::string &Banner);

/// Add a pass to print the machine function if printing is enabled.
void addPrintPass(const std::string &Banner);

/// Add a pass to perform basic verification of the machine function if
/// verification is enabled.
void addVerifyPass(const std::string &Banner);

protected:
// Helper to verify the analysis is really immutable.
void setOpt(bool &Opt, bool Val);
Expand Down Expand Up @@ -360,18 +372,6 @@ class TargetPassConfig : public ImmutablePass {
/// addMachinePasses helper to create the target-selected or overriden
/// regalloc pass.
FunctionPass *createRegAllocPass(bool Optimized);

/// printAndVerify - Add a pass to dump then verify the machine function, if
/// those steps are enabled.
///
void printAndVerify(const std::string &Banner);

/// Add a pass to print the machine function if printing is enabled.
void addPrintPass(const std::string &Banner);

/// Add a pass to perform basic verification of the machine function if
/// verification is enabled.
void addVerifyPass(const std::string &Banner);
};
} // namespace llvm

Expand Down
7 changes: 0 additions & 7 deletions llvm/test/CodeGen/Generic/run-pass.ll

This file was deleted.

43 changes: 35 additions & 8 deletions llvm/tools/llc/llc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "llvm/CodeGen/LinkAllAsmWriterComponents.h"
#include "llvm/CodeGen/LinkAllCodegenComponents.h"
#include "llvm/CodeGen/MIRParser/MIRParser.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/IRPrintingPasses.h"
#include "llvm/IR/LLVMContext.h"
Expand Down Expand Up @@ -361,12 +362,37 @@ static int compileModule(char **argv, LLVMContext &Context) {
"redundant when run-pass is specified.\n";
return 1;
}
if (!MIR) {
errs() << argv[0] << ": run-pass needs a .mir input.\n";
return 1;
}
const PassInfo *PI = PR->getPassInfo(RunPass);
if (!PI) {
errs() << argv[0] << ": run-pass pass is not registered.\n";
return 1;
}
StopAfterID = StartBeforeID = PI->getTypeInfo();
LLVMTargetMachine &LLVMTM = static_cast<LLVMTargetMachine&>(*Target);
TargetPassConfig *TPC = LLVMTM.createPassConfig(PM);
PM.add(TPC);
LLVMTM.addMachineModuleInfo(PM);
LLVMTM.addMachineFunctionAnalysis(PM, MIR.get());

Pass *P;
if (PI->getTargetMachineCtor())
P = PI->getTargetMachineCtor()(Target.get());
else if (PI->getNormalCtor())
P = PI->getNormalCtor()();
else {
errs() << argv[0] << ": cannot create pass: "
<< PI->getPassName() << "\n";
return 1;
}
std::string Banner
= std::string("After ") + std::string(P->getPassName());
PM.add(P);
TPC->printAndVerify(Banner);

PM.add(createPrintMIRPass(errs()));
} else {
if (!StartAfter.empty()) {
const PassInfo *PI = PR->getPassInfo(StartAfter);
Expand All @@ -384,14 +410,15 @@ static int compileModule(char **argv, LLVMContext &Context) {
}
StopAfterID = PI->getTypeInfo();
}
}

// Ask the target to add backend passes as necessary.
if (Target->addPassesToEmitFile(PM, *OS, FileType, NoVerify, StartBeforeID,
StartAfterID, StopAfterID, MIR.get())) {
errs() << argv[0] << ": target does not support generation of this"
<< " file type!\n";
return 1;
// Ask the target to add backend passes as necessary.
if (Target->addPassesToEmitFile(PM, *OS, FileType, NoVerify,
StartBeforeID, StartAfterID, StopAfterID,
MIR.get())) {
errs() << argv[0] << ": target does not support generation of this"
<< " file type!\n";
return 1;
}
}

// Before executing passes, print the final values of the LLVM options.
Expand Down

0 comments on commit fb94d8d

Please sign in to comment.