summaryrefslogtreecommitdiff
path: root/tools/llc
diff options
context:
space:
mode:
authorQuentin Colombet <qcolombet@apple.com>2016-06-10 00:52:10 +0000
committerQuentin Colombet <qcolombet@apple.com>2016-06-10 00:52:10 +0000
commitaef5f640f7803f6daaf550ec9d44b70e232decee (patch)
tree7f42d064ffa862313a1dfca9bee753fa17c89d45 /tools/llc
parent01724b2e650fb8d65d28d3c6debecf2f84a7962f (diff)
[llc] Add support for several run-pass options.
Previously we could run only one machine pass with the run-pass option. With that patch, we can now specify several passes with several run-pass options (or just one option with a list of comma separated passes) and llc will build the related pipeline. This is great to test the interaction of two passes that are not necessarily next to each other in the pipeline, or play with pass ordering. Now, we should be at parity with opt for the flexibility of running passes. Note: I also moved the run pass option from CommandFlags.h to llc.cpp because, really, this is needed only there! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272356 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llc')
-rw-r--r--tools/llc/llc.cpp77
1 files changed, 50 insertions, 27 deletions
diff --git a/tools/llc/llc.cpp b/tools/llc/llc.cpp
index 981a6c34de1..51ce3c0f2bf 100644
--- a/tools/llc/llc.cpp
+++ b/tools/llc/llc.cpp
@@ -118,6 +118,28 @@ static cl::opt<bool> ExitOnError(
cl::desc("Exit as soon as an error is encountered."),
cl::init(false), cl::Hidden);
+namespace {
+static ManagedStatic<std::vector<std::string>> RunPassNames;
+
+struct RunPassOption {
+ void operator=(const std::string &Val) const {
+ if (Val.empty())
+ return;
+ SmallVector<StringRef, 8> PassNames;
+ StringRef(Val).split(PassNames, ',', -1, false);
+ for (auto PassName : PassNames)
+ RunPassNames->push_back(PassName);
+ }
+};
+}
+
+static RunPassOption RunPassOpt;
+
+static cl::opt<RunPassOption, true, cl::parser<std::string>> RunPass(
+ "run-pass",
+ cl::desc("Run compiler only for specified passes (comma separated list)"),
+ cl::value_desc("pass-name"), cl::ZeroOrMore, cl::location(RunPassOpt));
+
static int compileModule(char **, LLVMContext &);
static std::unique_ptr<tool_output_file>
@@ -379,7 +401,7 @@ static int compileModule(char **argv, LLVMContext &Context) {
AnalysisID StartAfterID = nullptr;
AnalysisID StopAfterID = nullptr;
const PassRegistry *PR = PassRegistry::getPassRegistry();
- if (!RunPass.empty()) {
+ if (!RunPassNames->empty()) {
if (!StartAfter.empty() || !StopAfter.empty()) {
errs() << argv[0] << ": start-after and/or stop-after passes are "
"redundant when run-pass is specified.\n";
@@ -389,33 +411,34 @@ static int compileModule(char **argv, LLVMContext &Context) {
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;
- }
- LLVMTargetMachine &LLVMTM = static_cast<LLVMTargetMachine&>(*Target);
- TargetPassConfig *TPC = LLVMTM.createPassConfig(PM);
- PM.add(TPC);
- LLVMTM.addMachineModuleInfo(PM);
- LLVMTM.addMachineFunctionAnalysis(PM, MIR.get());
- TPC->printAndVerify("");
-
- 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;
+ for (std::string &RunPassName : *RunPassNames) {
+ const PassInfo *PI = PR->getPassInfo(RunPassName);
+ if (!PI) {
+ errs() << argv[0] << ": run-pass " << RunPassName << " is not registered.\n";
+ return 1;
+ }
+ LLVMTargetMachine &LLVMTM = static_cast<LLVMTargetMachine&>(*Target);
+ TargetPassConfig *TPC = LLVMTM.createPassConfig(PM);
+ PM.add(TPC);
+ LLVMTM.addMachineModuleInfo(PM);
+ LLVMTM.addMachineFunctionAnalysis(PM, MIR.get());
+ TPC->printAndVerify("");
+
+ 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);
}
- std::string Banner
- = std::string("After ") + std::string(P->getPassName());
- PM.add(P);
- TPC->printAndVerify(Banner);
-
PM.add(createPrintMIRPass(errs()));
} else {
if (!StartAfter.empty()) {