From eba981b4f515010f8f6e9602c563d2074d8bd915 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Thu, 22 Oct 2026 03:41:04 +0000 Subject: refactor(driver): move PATH-mode lli runner into PathRunner PathRunner.cc holds the lli lookup, LLVM 23 version check and lli execution, and is built only with CPSC_RUN_MODE=PATH like EmbeddedRunner.cc is for EMBEDDED. Co-Authored-By: Claude Opus 5.5 --- tools/driver/main.cc | 84 ++-------------------------------------------------- 1 file changed, 3 insertions(+), 81 deletions(-) (limited to 'tools/driver/main.cc') diff --git a/tools/driver/main.cc b/tools/driver/main.cc index 6893a63..d1dda81 100644 --- a/tools/driver/main.cc +++ b/tools/driver/main.cc @@ -7,16 +7,14 @@ #ifdef CPSC_RUN_EMBEDDED #include "EmbeddedRunner.h" #endif +#ifdef CPSC_RUN_PATH +#include "PathRunner.h" +#endif #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringSet.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/FileUtilities.h" -#ifdef CPSC_RUN_PATH -#include "llvm/Support/MemoryBuffer.h" -#include "llvm/Support/Regex.h" -#endif #include "llvm/Support/Path.h" -#include "llvm/Support/Program.h" #include "llvm/Support/raw_ostream.h" #include #include @@ -74,82 +72,6 @@ llvm::SmallString<256> relativeToUnit(llvm::StringRef UnitPath, llvm::StringRef return Result; } -#ifdef CPSC_RUN_PATH -bool checkLliVersion(llvm::StringRef LliPath) { - llvm::SmallString<256> VersionPath; - if (auto EC = llvm::sys::fs::createTemporaryFile("cpsc-lli-version", "txt", VersionPath)) { - llvm::errs() << cps::diagnosticPrefix(cps::Severity::Fatal) << "cannot check lli version: " << EC.message() << "\n"; - return false; - } - llvm::FileRemover TemporaryVersion(VersionPath); - std::string ExecutionError; - int Result = llvm::sys::ExecuteAndWait(LliPath, {LliPath, "--version"}, - std::nullopt, {llvm::StringRef(""), llvm::StringRef(VersionPath), llvm::StringRef("")}, - 5, 0, &ExecutionError); - if (Result != 0) { - llvm::errs() << cps::diagnosticPrefix(cps::Severity::Fatal) << "cannot check lli version at '" << LliPath - << "' (status " << Result << ")"; - if (!ExecutionError.empty()) llvm::errs() << ": " << ExecutionError; - llvm::errs() << "\n"; - return false; - } - auto Version = llvm::MemoryBuffer::getFile(VersionPath); - if (!Version) { - llvm::errs() << cps::diagnosticPrefix(cps::Severity::Fatal) << "cannot read lli version: " - << Version.getError().message() << "\n"; - return false; - } - llvm::SmallVector Matches; - if (!llvm::Regex("LLVM version ([0-9]+)\\.").match((*Version)->getBuffer(), &Matches)) { - llvm::errs() << cps::diagnosticPrefix(cps::Severity::Fatal) << "cannot identify LLVM version of lli at '" - << LliPath << "'; LLVM 23 is required\n"; - return false; - } - if (Matches[1] != "23") { - llvm::errs() << cps::diagnosticPrefix(cps::Severity::Fatal) << "-r requires lli from LLVM 23; found LLVM " - << Matches[1] << " at '" << LliPath << "'\n"; - return false; - } - return true; -} -#endif - -#ifdef CPSC_RUN_PATH -// Finds PATH's lli for -r and checks that it is from LLVM 23. -bool findLli(std::string &LliPath) { - auto Lli = llvm::sys::findProgramByName("lli"); - if (!Lli) { - llvm::errs() << cps::diagnosticPrefix(cps::Severity::Fatal) << "-r requires lli from LLVM 23 in PATH: " << Lli.getError().message() << "\n"; - return false; - } - LliPath = *Lli; - return checkLliVersion(LliPath); -} - -// Executes the IR at IRPath with lli and returns the program's status. -int runLli(const std::string &LliPath, const std::string &IRPath, - const std::vector &Objects) { - llvm::SmallString<256> RunPath(IRPath); - if (auto PathError = llvm::sys::fs::make_absolute(RunPath)) { - llvm::errs() << cps::diagnosticPrefix(cps::Severity::Error) << "cannot resolve IR path: " << PathError.message() << "\n"; - return 1; - } - std::string ExecutionError; - std::vector LliArgs = {LliPath}; - for (const auto &Object : Objects) LliArgs.push_back("-extra-object=" + Object); - LliArgs.push_back(std::string(RunPath)); - std::vector LliArgv(LliArgs.begin(), LliArgs.end()); - int Result = llvm::sys::ExecuteAndWait(LliPath, LliArgv, - std::nullopt, {}, 0, 0, &ExecutionError); - if (Result < 0) { - llvm::errs() << cps::diagnosticPrefix(cps::Severity::Error) << "lli execution failed (status " << Result << "): " - << ExecutionError << "\n"; - return 1; - } - return Result; -} -#endif - // -h anywhere prints a documentation pointer instead of compiling. bool printHelp(int argc, char **argv) { for (int I = 1; I < argc; ++I) { -- cgit v1.3.1-4-g156e