From 9d1485c0dd4d071e590c18fb8aa02095de3cc830 Mon Sep 17 00:00:00 2001 From: Richard-Qin-X Date: Thu, 13 Aug 2026 19:17:09 +0800 Subject: [MIRTool] Parse LLVM code generation options --- backend/tools/MIRTool/MIRToolMain.cpp | 85 +++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) (limited to 'backend/tools/MIRTool') diff --git a/backend/tools/MIRTool/MIRToolMain.cpp b/backend/tools/MIRTool/MIRToolMain.cpp index 500eeb2..ccc0de0 100644 --- a/backend/tools/MIRTool/MIRToolMain.cpp +++ b/backend/tools/MIRTool/MIRToolMain.cpp @@ -144,6 +144,34 @@ void printUsage(std::ostream &Output) { return std::nullopt; } +[[nodiscard]] Expected> parseBooleanOption(std::string_view Argument, + std::string_view Name) { + const std::string LongName = + Name.starts_with('-') && !Name.starts_with("--") ? "-" + std::string(Name) : std::string(); + if (Argument == Name || (!LongName.empty() && Argument == LongName)) + return true; + const auto ParseValue = [Name](std::string_view Value) -> Expected> { + if (Value == "true" || Value == "1") + return std::optional{true}; + if (Value == "false" || Value == "0") + return std::optional{false}; + return rcc::makeUnexpected(ErrorCode::InvalidInvocation, "command-line option '" + + std::string(Name) + + "' requires true or false"); + }; + std::string Prefix(Name); + Prefix.push_back('='); + if (Argument.starts_with(Prefix)) + return ParseValue(Argument.substr(Prefix.size())); + if (!LongName.empty()) { + std::string LongPrefix(LongName); + LongPrefix.push_back('='); + if (Argument.starts_with(LongPrefix)) + return ParseValue(Argument.substr(LongPrefix.size())); + } + return std::nullopt; +} + template [[nodiscard]] Expected parseInteger(std::string_view Text, std::string_view Description) { IntegerT Value = 0; @@ -203,6 +231,15 @@ void applyFeatureOverrides(std::vector Overrides, std::vector &Options, std::string Name, + std::string Value) { + const auto Existing = std::ranges::find(Options, Name, &rcc::tooling::BackendOption::Name); + if (Existing == Options.end()) + Options.push_back({std::move(Name), std::move(Value)}); + else + Existing->Value = std::move(Value); +} + [[nodiscard]] Expected setOperation(CommandLine &Command, Operation Action) { if (Command.Action != Operation::Run && Command.Action != Action) { return rcc::makeUnexpected(ErrorCode::InvalidInvocation, @@ -306,6 +343,54 @@ void applyFeatureOverrides(std::vector Overrides, std::vector