From: Matthias Braun Date: Tue, 6 Jun 2017 00:26:24 +0000 (+0000) Subject: llc: Create custom pass pipeline for .mir files; NFCI X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e6c9b7e113bf4235624c8587fab695212be7d78b;p=llvm llc: Create custom pass pipeline for .mir files; NFCI Create a custom pass pipeline when loading .mir files even in --start-after/--start-before cases. This streamlines the mir handling code and prepares for an upcoming commit. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@304755 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/llc/llc.cpp b/tools/llc/llc.cpp index e10d112dcf9..9c42f66b893 100644 --- a/tools/llc/llc.cpp +++ b/tools/llc/llc.cpp @@ -518,54 +518,66 @@ static int compileModule(char **argv, LLVMContext &Context) { OS = BOS.get(); } - if (!RunPassNames->empty()) { - if (!StartAfter.empty() || !StopAfter.empty() || !StartBefore.empty() || - !StopBefore.empty()) { - errs() << argv[0] << ": start-after and/or stop-after passes are " - "redundant when run-pass is specified.\n"; - return 1; - } - if (!MIR) { - errs() << argv[0] << ": run-pass needs a .mir input.\n"; - return 1; - } + const char *argv0 = argv[0]; + AnalysisID StartBeforeID = getPassID(argv0, "start-before", StartBefore); + AnalysisID StartAfterID = getPassID(argv0, "start-after", StartAfter); + AnalysisID StopAfterID = getPassID(argv0, "stop-after", StopAfter); + AnalysisID StopBeforeID = getPassID(argv0, "stop-before", StopBefore); + if (StartBeforeID && StartAfterID) { + errs() << argv0 << ": -start-before and -start-after specified!\n"; + return 1; + } + if (StopBeforeID && StopAfterID) { + errs() << argv0 << ": -stop-before and -stop-after specified!\n"; + return 1; + } + + if (MIR) { + // Construct a custom pass pipeline that starts after instruction + // selection. LLVMTargetMachine &LLVMTM = static_cast(*Target); TargetPassConfig &TPC = *LLVMTM.createPassConfig(PM); + TPC.setDisableVerify(NoVerify); PM.add(&TPC); MachineModuleInfo *MMI = new MachineModuleInfo(&LLVMTM); MMI->setMachineFunctionInitializer(MIR.get()); PM.add(MMI); TPC.printAndVerify(""); - for (const std::string &RunPassName : *RunPassNames) { - if (addPass(PM, argv[0], RunPassName, TPC)) + if (!RunPassNames->empty()) { + if (!StartAfter.empty() || !StopAfter.empty() || !StartBefore.empty() || + !StopBefore.empty()) { + errs() << argv0 << ": start-after and/or stop-after passes are " + "redundant when run-pass is specified.\n"; return 1; + } + + for (const std::string &RunPassName : *RunPassNames) { + if (addPass(PM, argv0, RunPassName, TPC)) + return 1; + } + } else { + TPC.setStartStopPasses(StartBeforeID, StartAfterID, StopBeforeID, + StopAfterID); + TPC.addISelPasses(); + TPC.addMachinePasses(); } - PM.add(createPrintMIRPass(*OS)); - } else { - const char *argv0 = argv[0]; - AnalysisID StartBeforeID = getPassID(argv0, "start-before", StartBefore); - AnalysisID StartAfterID = getPassID(argv0, "start-after", StartAfter); - AnalysisID StopAfterID = getPassID(argv0, "stop-after", StopAfter); - AnalysisID StopBeforeID = getPassID(argv0, "stop-before", StopBefore); - - if (StartBeforeID && StartAfterID) { - errs() << argv[0] << ": -start-before and -start-after specified!\n"; - return 1; - } - if (StopBeforeID && StopAfterID) { - errs() << argv[0] << ": -stop-before and -stop-after specified!\n"; - return 1; - } + TPC.setInitialized(); - // Ask the target to add backend passes as necessary. - if (Target->addPassesToEmitFile(PM, *OS, FileType, NoVerify, - StartBeforeID, StartAfterID, StopBeforeID, - StopAfterID, MIR.get())) { - errs() << argv[0] << ": target does not support generation of this" + if (!StopBefore.empty() || !StopAfter.empty() || !RunPassNames->empty()) { + PM.add(createPrintMIRPass(*OS)); + } else if (LLVMTM.addAsmPrinter(PM, *OS, FileType, MMI->getContext())) { + errs() << argv0 << ": target does not support generation of this" << " file type!\n"; return 1; } + PM.add(createFreeMachineFunctionPass()); + } else if (Target->addPassesToEmitFile(PM, *OS, FileType, NoVerify, + StartBeforeID, StartAfterID, + StopBeforeID, StopAfterID)) { + errs() << argv0 << ": target does not support generation of this" + << " file type!\n"; + return 1; } // Before executing passes, print the final values of the LLVM options.