[llvm] [TableGen] Generate library option structs with llvm-min-tblgen (PR #228338)

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 1 23:02:55 PDT 2026


https://github.com/MaskRay created https://github.com/llvm/llvm-project/pull/228338

-gen-opt-parser-defs lives in llvm-tblgen, so a library whose options
are declared in TableGen (CGData, InstCombine, MC) waits for llvm-tblgen
to build before any of its sources compile, while it otherwise needs
only llvm-min-tblgen.

Move OptionParserEmitter and OptEmitter into TableGen/Basic, which
llvm-min-tblgen consists of, and generate those structs with
llvm-min-tblgen.

Aided by Opus 5.5

>From 11fe2a1254a0e9acffcf619de4dcaed7c915ca40 Mon Sep 17 00:00:00 2001
From: Fangrui Song <i at maskray.me>
Date: Thu, 1 Oct 2026 22:52:08 -0700
Subject: [PATCH] [TableGen] Generate library option structs with
 llvm-min-tblgen

-gen-opt-parser-defs lives in llvm-tblgen, so a library whose options
are declared in TableGen (CGData, InstCombine, MC) waits for llvm-tblgen
to build before any of its sources compile, while it otherwise needs
only llvm-min-tblgen.

Move OptionParserEmitter and OptEmitter into TableGen/Basic, which
llvm-min-tblgen consists of, and generate those structs with
llvm-min-tblgen.

Aided by Opus 5.5
---
 llvm/docs/CommandLine.md                                    | 1 +
 llvm/lib/CGData/CMakeLists.txt                              | 1 +
 llvm/lib/MC/CMakeLists.txt                                  | 1 +
 llvm/lib/Transforms/InstCombine/CMakeLists.txt              | 1 +
 llvm/utils/TableGen/Basic/CMakeLists.txt                    | 2 ++
 llvm/utils/TableGen/{Common => Basic}/OptEmitter.cpp        | 0
 llvm/utils/TableGen/{Common => Basic}/OptEmitter.h          | 0
 llvm/utils/TableGen/{ => Basic}/OptionParserEmitter.cpp     | 3 +--
 llvm/utils/TableGen/CMakeLists.txt                          | 1 -
 llvm/utils/TableGen/Common/CMakeLists.txt                   | 1 -
 llvm/utils/TableGen/OptionRSTEmitter.cpp                    | 2 +-
 llvm/utils/gn/secondary/llvm/utils/TableGen/BUILD.gn        | 1 -
 llvm/utils/gn/secondary/llvm/utils/TableGen/Basic/BUILD.gn  | 2 ++
 llvm/utils/gn/secondary/llvm/utils/TableGen/Common/BUILD.gn | 1 -
 utils/bazel/llvm-project-overlay/llvm/BUILD.bazel           | 2 ++
 15 files changed, 12 insertions(+), 7 deletions(-)
 rename llvm/utils/TableGen/{Common => Basic}/OptEmitter.cpp (100%)
 rename llvm/utils/TableGen/{Common => Basic}/OptEmitter.h (100%)
 rename llvm/utils/TableGen/{ => Basic}/OptionParserEmitter.cpp (99%)

diff --git a/llvm/docs/CommandLine.md b/llvm/docs/CommandLine.md
index 2411b4cf9460b..a6d6429439453 100644
--- a/llvm/docs/CommandLine.md
+++ b/llvm/docs/CommandLine.md
@@ -1597,5 +1597,6 @@ A `std::optional` member defaulting to `std::nullopt` tells whether the option w
 The header declares the struct after including what the member defaults need, and one source file defines it and registers it with `cl::`.
 
 The library then lists `FooOptionsTableGen` under `DEPENDS` and `Option` under `LINK_COMPONENTS`.
+A library that otherwise needs only `llvm-min-tblgen` sets `LLVM_TABLEGEN_PROJECT` to `LLVM_HEADERS` before its `tablegen()` call, so that its sources need not wait for `llvm-tblgen`.
 Code reads `FooOptions::Global.enable_foo`, the instance the command line sets.
 Keep the header in `lib/`, as private as the `static cl::opt` it replaces; another library that needs a value calls a function or takes a parameter.
diff --git a/llvm/lib/CGData/CMakeLists.txt b/llvm/lib/CGData/CMakeLists.txt
index 6c31d76331f6f..e01c2c7f2391d 100644
--- a/llvm/lib/CGData/CMakeLists.txt
+++ b/llvm/lib/CGData/CMakeLists.txt
@@ -1,3 +1,4 @@
+set(LLVM_TABLEGEN_PROJECT LLVM_HEADERS)
 set(LLVM_TARGET_DEFINITIONS CGDataOptions.td)
 tablegen(LLVM CGDataOptions.inc -gen-opt-parser-defs)
 add_public_tablegen_target(CGDataOptionsTableGen)
diff --git a/llvm/lib/MC/CMakeLists.txt b/llvm/lib/MC/CMakeLists.txt
index c93fad8a6a3e2..2ef414d62bc50 100644
--- a/llvm/lib/MC/CMakeLists.txt
+++ b/llvm/lib/MC/CMakeLists.txt
@@ -1,3 +1,4 @@
+set(LLVM_TABLEGEN_PROJECT LLVM_HEADERS)
 set(LLVM_TARGET_DEFINITIONS MCCLOptions.td)
 tablegen(LLVM MCCLOptions.inc -gen-opt-parser-defs)
 add_public_tablegen_target(MCCLOptionsTableGen)
diff --git a/llvm/lib/Transforms/InstCombine/CMakeLists.txt b/llvm/lib/Transforms/InstCombine/CMakeLists.txt
index 399e15320a39a..23d4552919c16 100644
--- a/llvm/lib/Transforms/InstCombine/CMakeLists.txt
+++ b/llvm/lib/Transforms/InstCombine/CMakeLists.txt
@@ -1,3 +1,4 @@
+set(LLVM_TABLEGEN_PROJECT LLVM_HEADERS)
 set(LLVM_TARGET_DEFINITIONS InstCombineCLOptions.td)
 tablegen(LLVM InstCombineCLOptions.inc -gen-opt-parser-defs)
 add_public_tablegen_target(InstCombineCLOptionsTableGen)
diff --git a/llvm/utils/TableGen/Basic/CMakeLists.txt b/llvm/utils/TableGen/Basic/CMakeLists.txt
index fb2510e8bcc39..0eb8026e2af53 100644
--- a/llvm/utils/TableGen/Basic/CMakeLists.txt
+++ b/llvm/utils/TableGen/Basic/CMakeLists.txt
@@ -15,6 +15,8 @@ add_llvm_library(LLVMTableGenBasic OBJECT EXCLUDE_FROM_ALL DISABLE_LLVM_LINK_LLV
   CodeGenIntrinsics.cpp
   DirectiveEmitter.cpp
   IntrinsicEmitter.cpp
+  OptEmitter.cpp
+  OptionParserEmitter.cpp
   PredicateExpanderDag.cpp
   RISCVTargetDefEmitter.cpp
   RuntimeLibcallsEmitter.cpp
diff --git a/llvm/utils/TableGen/Common/OptEmitter.cpp b/llvm/utils/TableGen/Basic/OptEmitter.cpp
similarity index 100%
rename from llvm/utils/TableGen/Common/OptEmitter.cpp
rename to llvm/utils/TableGen/Basic/OptEmitter.cpp
diff --git a/llvm/utils/TableGen/Common/OptEmitter.h b/llvm/utils/TableGen/Basic/OptEmitter.h
similarity index 100%
rename from llvm/utils/TableGen/Common/OptEmitter.h
rename to llvm/utils/TableGen/Basic/OptEmitter.h
diff --git a/llvm/utils/TableGen/OptionParserEmitter.cpp b/llvm/utils/TableGen/Basic/OptionParserEmitter.cpp
similarity index 99%
rename from llvm/utils/TableGen/OptionParserEmitter.cpp
rename to llvm/utils/TableGen/Basic/OptionParserEmitter.cpp
index 8a66270f56223..b4487c47edacb 100644
--- a/llvm/utils/TableGen/OptionParserEmitter.cpp
+++ b/llvm/utils/TableGen/Basic/OptionParserEmitter.cpp
@@ -6,14 +6,13 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "Common/OptEmitter.h"
+#include "OptEmitter.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringMap.h"
 #include "llvm/ADT/Twine.h"
-#include "llvm/Option/OptTable.h"
 #include "llvm/Support/raw_ostream.h"
 #include "llvm/TableGen/Error.h"
 #include "llvm/TableGen/Record.h"
diff --git a/llvm/utils/TableGen/CMakeLists.txt b/llvm/utils/TableGen/CMakeLists.txt
index e18279cffa74c..c2f8df1f961b4 100644
--- a/llvm/utils/TableGen/CMakeLists.txt
+++ b/llvm/utils/TableGen/CMakeLists.txt
@@ -58,7 +58,6 @@ add_tablegen(llvm-tblgen LLVM
   InstrInfoEmitter.cpp
   llvm-tblgen.cpp
   MacroFusionPredicatorEmitter.cpp
-  OptionParserEmitter.cpp
   OptionRSTEmitter.cpp
   PseudoLoweringEmitter.cpp
   RegisterBankEmitter.cpp
diff --git a/llvm/utils/TableGen/Common/CMakeLists.txt b/llvm/utils/TableGen/Common/CMakeLists.txt
index 84e5e53f9fade..b1e89a33bb50a 100644
--- a/llvm/utils/TableGen/Common/CMakeLists.txt
+++ b/llvm/utils/TableGen/Common/CMakeLists.txt
@@ -31,7 +31,6 @@ add_llvm_library(LLVMTableGenCommon STATIC OBJECT EXCLUDE_FROM_ALL DISABLE_LLVM_
   CodeGenTarget.cpp
   InfoByHwMode.cpp
   InstructionEncoding.cpp
-  OptEmitter.cpp
   PredicateExpander.cpp
   SubtargetFeatureInfo.cpp
   Types.cpp
diff --git a/llvm/utils/TableGen/OptionRSTEmitter.cpp b/llvm/utils/TableGen/OptionRSTEmitter.cpp
index 6eac10e1831f0..4888e460bc674 100644
--- a/llvm/utils/TableGen/OptionRSTEmitter.cpp
+++ b/llvm/utils/TableGen/OptionRSTEmitter.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "Common/OptEmitter.h"
+#include "Basic/OptEmitter.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/StringMap.h"
 #include "llvm/TableGen/Record.h"
diff --git a/llvm/utils/gn/secondary/llvm/utils/TableGen/BUILD.gn b/llvm/utils/gn/secondary/llvm/utils/TableGen/BUILD.gn
index 0ad39c3336801..6638d7805c646 100644
--- a/llvm/utils/gn/secondary/llvm/utils/TableGen/BUILD.gn
+++ b/llvm/utils/gn/secondary/llvm/utils/TableGen/BUILD.gn
@@ -43,7 +43,6 @@ executable("llvm-tblgen") {
     "InstrDocsEmitter.cpp",
     "InstrInfoEmitter.cpp",
     "MacroFusionPredicatorEmitter.cpp",
-    "OptionParserEmitter.cpp",
     "OptionRSTEmitter.cpp",
     "PseudoLoweringEmitter.cpp",
     "RegisterBankEmitter.cpp",
diff --git a/llvm/utils/gn/secondary/llvm/utils/TableGen/Basic/BUILD.gn b/llvm/utils/gn/secondary/llvm/utils/TableGen/Basic/BUILD.gn
index 2da886c5469c3..5fad35d3a1a26 100644
--- a/llvm/utils/gn/secondary/llvm/utils/TableGen/Basic/BUILD.gn
+++ b/llvm/utils/gn/secondary/llvm/utils/TableGen/Basic/BUILD.gn
@@ -10,6 +10,8 @@ source_set("Basic") {
     "CodeGenIntrinsics.cpp",
     "DirectiveEmitter.cpp",
     "IntrinsicEmitter.cpp",
+    "OptEmitter.cpp",
+    "OptionParserEmitter.cpp",
     "PredicateExpanderDag.cpp",
     "RISCVTargetDefEmitter.cpp",
     "RuntimeLibcalls.cpp",
diff --git a/llvm/utils/gn/secondary/llvm/utils/TableGen/Common/BUILD.gn b/llvm/utils/gn/secondary/llvm/utils/TableGen/Common/BUILD.gn
index 4c2f587c4395a..d6ea0a310bd47 100644
--- a/llvm/utils/gn/secondary/llvm/utils/TableGen/Common/BUILD.gn
+++ b/llvm/utils/gn/secondary/llvm/utils/TableGen/Common/BUILD.gn
@@ -27,7 +27,6 @@ static_library("Common") {
     "GlobalISel/Patterns.cpp",
     "InfoByHwMode.cpp",
     "InstructionEncoding.cpp",
-    "OptEmitter.cpp",
     "PredicateExpander.cpp",
     "SubtargetFeatureInfo.cpp",
     "Types.cpp",
diff --git a/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel b/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel
index b5132afbe8b06..79f35060a3044 100644
--- a/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel
@@ -935,6 +935,8 @@ cc_binary(
         "utils/TableGen/Basic/CodeGenIntrinsics.cpp",
         "utils/TableGen/Basic/DirectiveEmitter.cpp",
         "utils/TableGen/Basic/IntrinsicEmitter.cpp",
+        "utils/TableGen/Basic/OptEmitter.cpp",
+        "utils/TableGen/Basic/OptionParserEmitter.cpp",
         "utils/TableGen/Basic/PredicateExpanderDag.cpp",
         "utils/TableGen/Basic/RISCVTargetDefEmitter.cpp",
         "utils/TableGen/Basic/RuntimeLibcalls.cpp",



More information about the llvm-commits mailing list