[llvm] TableGen: Use IfDefEmitter (PR #164209)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 20 02:58:47 PDT 2025
https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/164209
>From 195c7dd2d0a816212c8ad2ba4c17b9c484e280d0 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Tue, 14 Oct 2025 06:49:18 +0900
Subject: [PATCH] TableGen: Use IfDefEmitter
---
llvm/include/llvm/IR/RuntimeLibcalls.h | 2 -
llvm/lib/IR/RuntimeLibcalls.cpp | 3 -
llvm/test/TableGen/RuntimeLibcallEmitter.td | 14 ++-
.../TableGen/Basic/RuntimeLibcallsEmitter.cpp | 102 +++++++++---------
4 files changed, 64 insertions(+), 57 deletions(-)
diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.h b/llvm/include/llvm/IR/RuntimeLibcalls.h
index 307cc662d2022..ada3523333e56 100644
--- a/llvm/include/llvm/IR/RuntimeLibcalls.h
+++ b/llvm/include/llvm/IR/RuntimeLibcalls.h
@@ -31,7 +31,6 @@
/// implementation, which includes a name and type signature.
#define GET_RUNTIME_LIBCALL_ENUM
#include "llvm/IR/RuntimeLibcalls.inc"
-#undef GET_RUNTIME_LIBCALL_ENUM
namespace llvm {
@@ -170,7 +169,6 @@ struct RuntimeLibcallsInfo {
// querying a real set of symbols
#define GET_LOOKUP_LIBCALL_IMPL_NAME_BODY
#include "llvm/IR/RuntimeLibcalls.inc"
-#undef GET_LOOKUP_LIBCALL_IMPL_NAME_BODY
}
/// Check if this is valid libcall for the current module, otherwise
diff --git a/llvm/lib/IR/RuntimeLibcalls.cpp b/llvm/lib/IR/RuntimeLibcalls.cpp
index 7ea2e46a54183..77af29b9d70f6 100644
--- a/llvm/lib/IR/RuntimeLibcalls.cpp
+++ b/llvm/lib/IR/RuntimeLibcalls.cpp
@@ -21,9 +21,6 @@ using namespace RTLIB;
#define GET_SET_TARGET_RUNTIME_LIBCALL_SETS
#define DEFINE_GET_LOOKUP_LIBCALL_IMPL_NAME
#include "llvm/IR/RuntimeLibcalls.inc"
-#undef GET_INIT_RUNTIME_LIBCALL_NAMES
-#undef GET_SET_TARGET_RUNTIME_LIBCALL_SETS
-#undef DEFINE_GET_LOOKUP_LIBCALL_IMPL_NAME
/// Set default libcall names. If a target wants to opt-out of a libcall it
/// should be placed here.
diff --git a/llvm/test/TableGen/RuntimeLibcallEmitter.td b/llvm/test/TableGen/RuntimeLibcallEmitter.td
index 0c23e3bac195e..7aaf3a0e8e1cf 100644
--- a/llvm/test/TableGen/RuntimeLibcallEmitter.td
+++ b/llvm/test/TableGen/RuntimeLibcallEmitter.td
@@ -73,6 +73,8 @@ def BlahLibrary : SystemRuntimeLibrary<isBlahArch, (add calloc, LibraryWithCondi
// All entries should be emitted in Libcall enum.
// CHECK: #ifdef GET_RUNTIME_LIBCALL_ENUM
+// CHECK-NEXT: #undef GET_RUNTIME_LIBCALL_ENUM
+// CHECK-EMPTY:
// CHECK-NEXT: namespace llvm {
// CHECK-NEXT: namespace RTLIB {
// CHECK-NEXT: enum Libcall : unsigned short {
@@ -101,9 +103,12 @@ def BlahLibrary : SystemRuntimeLibrary<isBlahArch, (add calloc, LibraryWithCondi
// CHECK-NEXT: constexpr size_t NumLibcallImpls = 9;
// CHECK-NEXT: } // End namespace RTLIB
// CHECK-NEXT: } // End namespace llvm
-// CHECK-NEXT: #endif
+// CHECK-EMPTY:
+// CHECK-NEXT: #endif // GET_RUNTIME_LIBCALL_ENUM
// CHECK: #ifdef GET_INIT_RUNTIME_LIBCALL_NAMES
+// CHECK-NEXT: #undef GET_INIT_RUNTIME_LIBCALL_NAMES
+// CHECK-EMPTY:
// CHECK-EMPTY:
// CHECK-NEXT: #ifdef __GNUC__
// CHECK-NEXT: #pragma GCC diagnostic push
@@ -163,13 +168,18 @@ def BlahLibrary : SystemRuntimeLibrary<isBlahArch, (add calloc, LibraryWithCondi
// CHECK-NEXT: };
// CHECK: #ifdef GET_LOOKUP_LIBCALL_IMPL_NAME_BODY
+// CHECK-NEXT: #undef GET_LOOKUP_LIBCALL_IMPL_NAME_BODY
+// CHECK-EMPTY:
// CHECK-NEXT: size_t Size = Name.size();
// CHECK-NEXT: if (Size == 0 || Size > 9)
// CHECK-NEXT: return enum_seq(RTLIB::Unsupported, RTLIB::Unsupported);
// CHECK-NEXT: return lookupLibcallImplNameImpl(Name);
-// CHECK-NEXT: #endif
+// CHECK-EMPTY:
+// CHECK-NEXT: #endif // GET_LOOKUP_LIBCALL_IMPL_NAME_BODY
// CHECK: #ifdef DEFINE_GET_LOOKUP_LIBCALL_IMPL_NAME
+// CHECK-NEXT: #undef DEFINE_GET_LOOKUP_LIBCALL_IMPL_NAME
+// CHECK-EMPTY:
// CHECK-NEXT: static inline uint64_t hash(StringRef Str) {
// CHECK-NEXT: return static_cast<uint32_t>(xxh3_64bits(Str));
// CHECK-NEXT: }
diff --git a/llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp b/llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp
index 3938d3910f62a..ed802e20477d3 100644
--- a/llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp
+++ b/llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp
@@ -15,6 +15,7 @@
#include "llvm/Support/FormatVariadic.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/xxhash.h"
+#include "llvm/TableGen/CodeGenHelpers.h"
#include "llvm/TableGen/Error.h"
#include "llvm/TableGen/Record.h"
#include "llvm/TableGen/SetTheory.h"
@@ -290,8 +291,9 @@ class RuntimeLibcallEmitter {
} // End anonymous namespace.
void RuntimeLibcallEmitter::emitGetRuntimeLibcallEnum(raw_ostream &OS) const {
- OS << "#ifdef GET_RUNTIME_LIBCALL_ENUM\n"
- "namespace llvm {\n"
+ IfDefEmitter IfDef(OS, "GET_RUNTIME_LIBCALL_ENUM");
+
+ OS << "namespace llvm {\n"
"namespace RTLIB {\n"
"enum Libcall : unsigned short {\n";
@@ -315,8 +317,7 @@ void RuntimeLibcallEmitter::emitGetRuntimeLibcallEnum(raw_ostream &OS) const {
<< RuntimeLibcallImplDefList.size() + 1
<< ";\n"
"} // End namespace RTLIB\n"
- "} // End namespace llvm\n"
- "#endif\n\n";
+ "} // End namespace llvm\n";
}
// StringMap uses xxh3_64bits, truncated to uint32_t.
@@ -432,14 +433,16 @@ void RuntimeLibcallEmitter::emitNameMatchHashTable(
//
// TODO: It may make more sense to split the search by string size more. There
// are a few outliers, most call names are small.
- OS << "#ifdef GET_LOOKUP_LIBCALL_IMPL_NAME_BODY\n"
- " size_t Size = Name.size();\n"
- " if (Size == 0 || Size > "
- << MaxFuncNameSize
- << ")\n"
- " return enum_seq(RTLIB::Unsupported, RTLIB::Unsupported);\n"
- " return lookupLibcallImplNameImpl(Name);\n"
- "#endif\n";
+ {
+ IfDefEmitter IfDef(OS, "GET_LOOKUP_LIBCALL_IMPL_NAME_BODY");
+
+ OS << " size_t Size = Name.size();\n"
+ " if (Size == 0 || Size > "
+ << MaxFuncNameSize
+ << ")\n"
+ " return enum_seq(RTLIB::Unsupported, RTLIB::Unsupported);\n"
+ " return lookupLibcallImplNameImpl(Name);\n";
+ }
auto [Size, Collisions] = computePerfectHashParameters(Hashes);
std::vector<unsigned> Lookup =
@@ -449,7 +452,7 @@ void RuntimeLibcallEmitter::emitNameMatchHashTable(
LLVM_DEBUG(dbgs() << "Runtime libcall perfect hashing parameters: Size = "
<< Size << ", maximum collisions = " << Collisions << '\n');
- OS << "#ifdef DEFINE_GET_LOOKUP_LIBCALL_IMPL_NAME\n";
+ IfDefEmitter IfDef(OS, "DEFINE_GET_LOOKUP_LIBCALL_IMPL_NAME");
emitHashFunction(OS);
OS << "iota_range<RTLIB::LibcallImpl> RTLIB::RuntimeLibcallsInfo::"
@@ -481,59 +484,57 @@ void RuntimeLibcallEmitter::emitNameMatchHashTable(
return enum_seq(RTLIB::Unsupported, RTLIB::Unsupported);
}
)";
-
- OS << "#endif\n\n";
}
void RuntimeLibcallEmitter::emitGetInitRuntimeLibcallNames(
raw_ostream &OS) const {
- OS << "#ifdef GET_INIT_RUNTIME_LIBCALL_NAMES\n";
-
// Emit the implementation names
StringToOffsetTable Table(/*AppendZero=*/true,
"RTLIB::RuntimeLibcallsInfo::");
- for (const RuntimeLibcallImpl &LibCallImpl : RuntimeLibcallImplDefList)
- Table.GetOrAddStringOffset(LibCallImpl.getLibcallFuncName());
+ {
+ IfDefEmitter IfDef(OS, "GET_INIT_RUNTIME_LIBCALL_NAMES");
+
+ for (const RuntimeLibcallImpl &LibCallImpl : RuntimeLibcallImplDefList)
+ Table.GetOrAddStringOffset(LibCallImpl.getLibcallFuncName());
- Table.EmitStringTableDef(OS, "RuntimeLibcallImplNameTable");
- OS << R"(
+ Table.EmitStringTableDef(OS, "RuntimeLibcallImplNameTable");
+ OS << R"(
const uint16_t RTLIB::RuntimeLibcallsInfo::RuntimeLibcallNameOffsetTable[] = {
)";
- OS << formatv(" {}, // {}\n", Table.GetStringOffset(""),
- ""); // Unsupported entry
- for (const RuntimeLibcallImpl &LibCallImpl : RuntimeLibcallImplDefList) {
- StringRef ImplName = LibCallImpl.getLibcallFuncName();
- OS << formatv(" {}, // {}\n", Table.GetStringOffset(ImplName), ImplName);
- }
- OS << "};\n";
+ OS << formatv(" {}, // {}\n", Table.GetStringOffset(""),
+ ""); // Unsupported entry
+ for (const RuntimeLibcallImpl &LibCallImpl : RuntimeLibcallImplDefList) {
+ StringRef ImplName = LibCallImpl.getLibcallFuncName();
+ OS << formatv(" {}, // {}\n", Table.GetStringOffset(ImplName), ImplName);
+ }
+ OS << "};\n";
- OS << R"(
+ OS << R"(
const uint8_t RTLIB::RuntimeLibcallsInfo::RuntimeLibcallNameSizeTable[] = {
)";
- OS << " 0,\n";
- for (const RuntimeLibcallImpl &LibCallImpl : RuntimeLibcallImplDefList)
- OS << " " << LibCallImpl.getLibcallFuncName().size() << ",\n";
- OS << "};\n\n";
+ OS << " 0,\n";
+ for (const RuntimeLibcallImpl &LibCallImpl : RuntimeLibcallImplDefList)
+ OS << " " << LibCallImpl.getLibcallFuncName().size() << ",\n";
+ OS << "};\n\n";
- // Emit the reverse mapping from implementation libraries to RTLIB::Libcall
- OS << "const RTLIB::Libcall llvm::RTLIB::RuntimeLibcallsInfo::"
- "ImplToLibcall[RTLIB::NumLibcallImpls] = {\n"
- " RTLIB::UNKNOWN_LIBCALL, // RTLIB::Unsupported\n";
+ // Emit the reverse mapping from implementation libraries to RTLIB::Libcall
+ OS << "const RTLIB::Libcall llvm::RTLIB::RuntimeLibcallsInfo::"
+ "ImplToLibcall[RTLIB::NumLibcallImpls] = {\n"
+ " RTLIB::UNKNOWN_LIBCALL, // RTLIB::Unsupported\n";
- for (const RuntimeLibcallImpl &LibCallImpl : RuntimeLibcallImplDefList) {
- const RuntimeLibcall *Provides = LibCallImpl.getProvides();
- OS << " ";
- Provides->emitEnumEntry(OS);
- OS << ", // ";
- LibCallImpl.emitEnumEntry(OS);
- OS << '\n';
+ for (const RuntimeLibcallImpl &LibCallImpl : RuntimeLibcallImplDefList) {
+ const RuntimeLibcall *Provides = LibCallImpl.getProvides();
+ OS << " ";
+ Provides->emitEnumEntry(OS);
+ OS << ", // ";
+ LibCallImpl.emitEnumEntry(OS);
+ OS << '\n';
+ }
+ OS << "};\n\n";
}
- OS << "};\n\n";
-
- OS << "#endif\n\n";
emitNameMatchHashTable(OS, Table);
}
@@ -757,9 +758,10 @@ void RuntimeLibcallEmitter::run(raw_ostream &OS) {
emitGetInitRuntimeLibcallNames(OS);
- OS << "#ifdef GET_SET_TARGET_RUNTIME_LIBCALL_SETS\n";
- emitSystemRuntimeLibrarySetCalls(OS);
- OS << "#endif\n\n";
+ {
+ IfDefEmitter IfDef(OS, "GET_SET_TARGET_RUNTIME_LIBCALL_SETS");
+ emitSystemRuntimeLibrarySetCalls(OS);
+ }
}
void LibcallPredicateExpander::expand(SetTheory &ST, const Record *Def,
More information about the llvm-commits
mailing list