diff options
| -rw-r--r-- | llvm/include/llvm/CodeGen/Passes.h | 24 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Generic/run-pass.ll | 7 | ||||
| -rw-r--r-- | llvm/tools/llc/llc.cpp | 43 |
3 files changed, 47 insertions, 27 deletions
diff --git a/llvm/include/llvm/CodeGen/Passes.h b/llvm/include/llvm/CodeGen/Passes.h index 9b41bcbb3ac..5a4ac430208 100644 --- a/llvm/include/llvm/CodeGen/Passes.h +++ b/llvm/include/llvm/CodeGen/Passes.h @@ -254,6 +254,18 @@ public: 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); @@ -360,18 +372,6 @@ protected: /// 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 diff --git a/llvm/test/CodeGen/Generic/run-pass.ll b/llvm/test/CodeGen/Generic/run-pass.ll deleted file mode 100644 index 55d62ec1864..00000000000 --- a/llvm/test/CodeGen/Generic/run-pass.ll +++ /dev/null @@ -1,7 +0,0 @@ -; RUN: llc < %s -debug-pass=Structure -run-pass=gc-lowering -o /dev/null 2>&1 | FileCheck %s - -; CHECK: -gc-lowering -; CHECK: FunctionPass Manager -; CHECK-NEXT: Lower Garbage Collection Instructions -; CHECK-NEXT: Machine Function Analysis -; CHECK-NEXT: MIR Printing Pass 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. |

