summaryrefslogtreecommitdiffstats
path: root/llvm/tools
diff options
context:
space:
mode:
authorMatthias Braun <matze@braunis.de>2016-05-10 01:32:44 +0000
committerMatthias Braun <matze@braunis.de>2016-05-10 01:32:44 +0000
commitfb94d8d56add935f31197ef7ee19d44b680cb456 (patch)
tree7f9288084b726405dd4cb4828281fcaea0e349cd /llvm/tools
parent47cf918e20a0d5a38fea51885db060a1cdcaa4fc (diff)
downloadbcm5719-llvm-fb94d8d56add935f31197ef7ee19d44b680cb456.tar.gz
bcm5719-llvm-fb94d8d56add935f31197ef7ee19d44b680cb456.zip
llc: Rework -run-pass option
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
Diffstat (limited to 'llvm/tools')
-rw-r--r--llvm/tools/llc/llc.cpp43
1 files changed, 35 insertions, 8 deletions
diff --git a/llvm/tools/llc/llc.cpp b/llvm/tools/llc/llc.cpp
index 5ad86e07469..3245f8d46f4 100644
--- a/llvm/tools/llc/llc.cpp
+++ b/llvm/tools/llc/llc.cpp
@@ -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"
@@ -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);
@@ -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.
OpenPOWER on IntegriCloud