[llvm] [llvm] Refactor llc to use OptTable (PR #187901)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Mar 28 13:23:34 PDT 2026
================
@@ -70,206 +71,156 @@ static codegen::RegisterCodeGenFlags CGF;
static codegen::RegisterMTuneFlag MTF;
static codegen::RegisterSaveStatsFlag SSF;
+#include "Opts.inc"
+#include "llvm/Option/ArgList.h"
+#include "llvm/Option/OptTable.h"
+#include "llvm/Option/Option.h"
+
+using namespace llvm;
+using namespace llvm::opt;
+
+namespace {
+enum ID {
+ OPT_INVALID = 0, // This is not an option ID.
+#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__),
+#include "Opts.inc"
+#undef OPTION
+};
+
+#define OPTTABLE_STR_TABLE_CODE
+#include "Opts.inc"
+#undef OPTTABLE_STR_TABLE_CODE
+
+#define OPTTABLE_PREFIXES_TABLE_CODE
+#include "Opts.inc"
+#undef OPTTABLE_PREFIXES_TABLE_CODE
+
+static constexpr OptTable::Info InfoTable[] = {
+#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__),
+#include "Opts.inc"
+#undef OPTION
+};
+
+class LlcOptTable : public GenericOptTable {
+public:
+ LlcOptTable()
+ : GenericOptTable(OptionStrTable, OptionPrefixesTable, InfoTable) {}
+};
+
+} // end anonymous namespace
+
// General options for llc. Other pass-specific options are specified
// within the corresponding llc passes, and target-specific options
// and back-end code generation options are specified with the target machine.
//
-static cl::opt<std::string>
- InputFilename(cl::Positional, cl::desc("<input bitcode>"), cl::init("-"));
-
-static cl::list<std::string>
- InstPrinterOptions("M", cl::desc("InstPrinter options"));
-
-static cl::opt<std::string>
- InputLanguage("x", cl::desc("Input language ('ir' or 'mir')"));
-
-static cl::opt<std::string> OutputFilename("o", cl::desc("Output filename"),
- cl::value_desc("filename"));
-
-static cl::opt<std::string>
- SplitDwarfOutputFile("split-dwarf-output", cl::desc(".dwo output filename"),
- cl::value_desc("filename"));
-
-static cl::opt<unsigned>
- TimeCompilations("time-compilations", cl::Hidden, cl::init(1u),
- cl::value_desc("N"),
- cl::desc("Repeat compilation N times for timing"));
-
-static cl::opt<bool> TimeTrace("time-trace", cl::desc("Record time trace"));
-
-static cl::opt<unsigned> TimeTraceGranularity(
- "time-trace-granularity",
- cl::desc(
- "Minimum time granularity (in microseconds) traced by time profiler"),
- cl::init(500), cl::Hidden);
-
-static cl::opt<std::string>
- TimeTraceFile("time-trace-file",
- cl::desc("Specify time trace file destination"),
- cl::value_desc("filename"));
-
-static cl::opt<std::string>
- BinutilsVersion("binutils-version", cl::Hidden,
- cl::desc("Produced object files can use all ELF features "
- "supported by this binutils version and newer."
- "If -no-integrated-as is specified, the generated "
- "assembly will consider GNU as support."
- "'none' means that all ELF features can be used, "
- "regardless of binutils support"));
-
-static cl::opt<bool>
- PreserveComments("preserve-as-comments", cl::Hidden,
- cl::desc("Preserve Comments in outputted assembly"),
- cl::init(true));
-
-// Determine optimization level.
-static cl::opt<char>
- OptLevel("O",
- cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] "
- "(default = '-O2')"),
- cl::Prefix, cl::init('2'));
-
-static cl::opt<std::string>
- TargetTriple("mtriple", cl::desc("Override target triple for module"));
-
-static cl::opt<std::string> SplitDwarfFile(
- "split-dwarf-file",
- cl::desc(
- "Specify the name of the .dwo file to encode in the DWARF output"));
-
-static cl::opt<bool> NoVerify("disable-verify", cl::Hidden,
- cl::desc("Do not verify input module"));
-
-static cl::opt<bool> VerifyEach("verify-each",
- cl::desc("Verify after each transform"));
-
-static cl::opt<bool>
- DisableSimplifyLibCalls("disable-simplify-libcalls",
- cl::desc("Disable simplify-libcalls"));
-
-static cl::opt<bool> ShowMCEncoding("show-mc-encoding", cl::Hidden,
- cl::desc("Show encoding in .s output"));
-
-static cl::opt<unsigned>
- OutputAsmVariant("output-asm-variant",
- cl::desc("Syntax variant to use for output printing"));
-
-static cl::opt<bool>
- DwarfDirectory("dwarf-directory", cl::Hidden,
- cl::desc("Use .file directives with an explicit directory"),
- cl::init(true));
-
-static cl::opt<bool> AsmVerbose("asm-verbose",
- cl::desc("Add comments to directives."),
- cl::init(true));
-
-static cl::opt<bool>
- CompileTwice("compile-twice", cl::Hidden,
- cl::desc("Run everything twice, re-using the same pass "
- "manager and verify the result is the same."),
- cl::init(false));
-
-static cl::opt<bool> DiscardValueNames(
- "discard-value-names",
- cl::desc("Discard names from Value (other than GlobalValue)."),
- cl::init(false), cl::Hidden);
-
-static cl::opt<bool>
- PrintMIR2VecVocab("print-mir2vec-vocab", cl::Hidden,
- cl::desc("Print MIR2Vec vocabulary contents"),
- cl::init(false));
-
-static cl::opt<bool>
- PrintMIR2Vec("print-mir2vec", cl::Hidden,
- cl::desc("Print MIR2Vec embeddings for functions"),
- cl::init(false));
-
-static cl::list<std::string> IncludeDirs("I", cl::desc("include search path"));
-
-static cl::opt<bool> RemarksWithHotness(
- "pass-remarks-with-hotness",
- cl::desc("With PGO, include profile count in optimization remarks"),
- cl::Hidden);
-
-static cl::opt<std::optional<uint64_t>, false, remarks::HotnessThresholdParser>
- RemarksHotnessThreshold(
- "pass-remarks-hotness-threshold",
- cl::desc("Minimum profile count required for "
- "an optimization remark to be output. "
- "Use 'auto' to apply the threshold from profile summary."),
- cl::value_desc("N or 'auto'"), cl::init(0), cl::Hidden);
-
-static cl::opt<std::string>
- RemarksFilename("pass-remarks-output",
- cl::desc("Output filename for pass remarks"),
- cl::value_desc("filename"));
-
-static cl::opt<std::string>
- RemarksPasses("pass-remarks-filter",
- cl::desc("Only record optimization remarks from passes whose "
- "names match the given regular expression"),
- cl::value_desc("regex"));
-
-static cl::opt<std::string> RemarksFormat(
- "pass-remarks-format",
- cl::desc("The format used for serializing remarks (default: YAML)"),
- cl::value_desc("format"), cl::init("yaml"));
-
-static cl::list<std::string> PassPlugins("load-pass-plugin",
- cl::desc("Load plugin library"));
-
-static cl::opt<bool> EnableNewPassManager(
- "enable-new-pm", cl::desc("Enable the new pass manager"), cl::init(false));
-
-// This flag specifies a textual description of the optimization pass pipeline
-// to run over the module. This flag switches opt to use the new pass manager
-// infrastructure, completely disabling all of the flags specific to the old
-// pass management.
-static cl::opt<std::string> PassPipeline(
- "passes",
- cl::desc(
- "A textual description of the pass pipeline. To have analysis passes "
- "available before a certain pass, add 'require<foo-analysis>'."));
-static cl::alias PassPipeline2("p", cl::aliasopt(PassPipeline),
- cl::desc("Alias for -passes"));
+// TODO: These are static because the prior implementation using cl::opt
+// defined these as static globals. It's probably neater to instead have these
+// in some Config struct that gets passed around, but that can be done after
+// the migration to using OptTable.
+static std::string InputFilename = "-";
+static std::vector<std::string> InstPrinterOptions;
+static std::string InputLanguage = "";
+static std::string OutputFilename = "";
+static std::string SplitDwarfOutputFile = "";
+static unsigned TimeCompilations = 1u;
+static bool TimeTrace = false;
+static unsigned TimeTraceGranularity = 500;
+static std::string TimeTraceFile = "";
+static std::string BinutilsVersion = "";
+static bool PreserveComments = true;
+static char OptLevel = '2';
+static std::string TargetTriple = "";
+static std::string SplitDwarfFile = "";
+static bool NoVerify = false;
+static bool VerifyEach = false;
+static bool DisableSimplifyLibCalls = false;
+static bool ShowMCEncoding = false;
+static std::optional<unsigned> OutputAsmVariant;
+static std::optional<bool> DwarfDirectory;
+static bool AsmVerbose = true;
+static bool CompileTwice = false;
+static bool DiscardValueNames = false;
+static bool PrintMIR2VecVocab = false;
+static bool PrintMIR2Vec = false;
+static std::vector<std::string> IncludeDirs;
+static bool RemarksWithHotness = false;
+static uint64_t RemarksHotnessThreshold = 0;
+static std::string RemarksFilename = "";
+static std::string RemarksPasses = "";
+static std::string RemarksFormat = "yaml";
+static bool EnableNewPassManager = false;
+static std::string PassPipeline = "";
+
+// These are the options that are consumed by llc and not passed to the backend.
+// When passing arguments to the backend via cl::ParseCommandBundles, we need to
+// filter out these options.
+const std::set<unsigned> kLocallyConsumed{
----------------
PiJoules wrote:
Updated using OptionFlags which I didn't know about before and help remove this.
https://github.com/llvm/llvm-project/pull/187901
More information about the llvm-commits
mailing list