[llvm] 9c361cc - [TableGen] Avoid duplicate variable names in RuntimeLibcallsEmitter (partial reland of #152505) (#153398)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 13 05:43:25 PDT 2025
Author: Benjamin Maxwell
Date: 2025-08-13T12:43:21Z
New Revision: 9c361cc0685a7b4c69994748b2ef159e5ce5e018
URL: https://github.com/llvm/llvm-project/commit/9c361cc0685a7b4c69994748b2ef159e5ce5e018
DIFF: https://github.com/llvm/llvm-project/commit/9c361cc0685a7b4c69994748b2ef159e5ce5e018.diff
LOG: [TableGen] Avoid duplicate variable names in RuntimeLibcallsEmitter (partial reland of #152505) (#153398)
Added:
Modified:
llvm/test/TableGen/RuntimeLibcallEmitter-calling-conv.td
llvm/test/TableGen/RuntimeLibcallEmitter-conflict-warning.td
llvm/test/TableGen/RuntimeLibcallEmitter.td
llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp
Removed:
################################################################################
diff --git a/llvm/test/TableGen/RuntimeLibcallEmitter-calling-conv.td b/llvm/test/TableGen/RuntimeLibcallEmitter-calling-conv.td
index 49d5ecaa0e5c5..feef07502eedb 100644
--- a/llvm/test/TableGen/RuntimeLibcallEmitter-calling-conv.td
+++ b/llvm/test/TableGen/RuntimeLibcallEmitter-calling-conv.td
@@ -48,79 +48,47 @@ def MSP430LibraryWithCondCC : SystemRuntimeLibrary<isMSP430,
// CHECK-NEXT: Entry = DefaultCC;
// CHECK-NEXT: }
// CHECK-EMPTY:
-// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
-// CHECK-NEXT: {RTLIB::MALLOC, RTLIB::malloc}, // malloc
-// CHECK-NEXT: };
-// CHECK-EMPTY:
-// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls) {
-// CHECK-NEXT: setLibcallImpl(Func, Impl);
-// CHECK-NEXT: }
+// CHECK-NEXT: setLibcallsImpl({
+// CHECK-NEXT: {RTLIB::MALLOC, RTLIB::malloc}, // malloc
+// CHECK-NEXT: });
// CHECK-EMPTY:
-// CHECK-NEXT: static const LibcallImplPair LibraryCalls_AlwaysAvailable[] = {
+// CHECK-NEXT: setLibcallsImpl({
// CHECK-NEXT: {RTLIB::SDIVREM_I8, RTLIB::__divmodqi4}, // __divmodqi4
// CHECK-NEXT: {RTLIB::UDIVREM_I16, RTLIB::__udivmodhi4}, // __udivmodhi4
-// CHECK-NEXT: };
-// CHECK-EMPTY:
-// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_AlwaysAvailable) {
-// CHECK-NEXT: setLibcallImpl(Func, Impl);
-// CHECK-NEXT: setLibcallImplCallingConv(Impl, CallingConv::AVR_BUILTIN);
-// CHECK-NEXT: }
+// CHECK-NEXT: }, CallingConv::AVR_BUILTIN);
// CHECK-EMPTY:
// CHECK-NEXT: return;
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: if (TT.getArch() == Triple::avr) {
-// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
+// CHECK-NEXT: setLibcallsImpl({
// CHECK-NEXT: {RTLIB::MALLOC, RTLIB::malloc}, // malloc
-// CHECK-NEXT: };
-// CHECK-EMPTY:
-// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls) {
-// CHECK-NEXT: setLibcallImpl(Func, Impl);
-// CHECK-NEXT: }
+// CHECK-NEXT: });
// CHECK-EMPTY:
-// CHECK-NEXT: static const LibcallImplPair LibraryCalls_AlwaysAvailable[] = {
+// CHECK-NEXT: setLibcallsImpl({
// CHECK-NEXT: {RTLIB::SDIVREM_I8, RTLIB::__divmodqi4}, // __divmodqi4
// CHECK-NEXT: {RTLIB::UDIVREM_I16, RTLIB::__udivmodhi4}, // __udivmodhi4
-// CHECK-NEXT: };
-// CHECK-EMPTY:
-// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_AlwaysAvailable) {
-// CHECK-NEXT: setLibcallImpl(Func, Impl);
-// CHECK-NEXT: setLibcallImplCallingConv(Impl, CallingConv::AVR_BUILTIN);
-// CHECK-NEXT: }
+// CHECK-NEXT: }, CallingConv::AVR_BUILTIN);
// CHECK-EMPTY:
// CHECK-NEXT: return;
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: if (TT.getArch() == Triple::msp430) {
-// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
+// CHECK-NEXT: setLibcallsImpl({
// CHECK-NEXT: {RTLIB::MALLOC, RTLIB::malloc}, // malloc
-// CHECK-NEXT: };
-// CHECK-EMPTY:
-// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls) {
-// CHECK-NEXT: setLibcallImpl(Func, Impl);
-// CHECK-NEXT: }
+// CHECK-NEXT: });
// CHECK-EMPTY:
// CHECK-NEXT: if ( isFoo() ) {
-// CHECK-NEXT: static const LibcallImplPair LibraryCalls_anonymous_3[] = {
-// CHECK-NEXT: {RTLIB::SDIVREM_I8, RTLIB::__divmodqi4}, // __divmodqi4
-// CHECK-NEXT: };
-// CHECK-EMPTY:
-// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_anonymous_3) {
-// CHECK-NEXT: setLibcallImpl(Func, Impl);
-// CHECK-NEXT: setLibcallImplCallingConv(Impl, CallingConv::AVR_BUILTIN);
-// CHECK-NEXT: }
+// CHECK-NEXT: setLibcallsImpl({
+// CHECK-NEXT: {RTLIB::SDIVREM_I8, RTLIB::__divmodqi4}, // __divmodqi4
+// CHECK-NEXT: }, CallingConv::AVR_BUILTIN);
// CHECK-EMPTY:
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: if ( isBar() ) {
-// CHECK-NEXT: static const LibcallImplPair LibraryCalls_anonymous_5[] = {
+// CHECK-NEXT: setLibcallsImpl({
// CHECK-NEXT: {RTLIB::UDIVREM_I16, RTLIB::__udivmodhi4}, // __udivmodhi4
-// CHECK-NEXT: };
-// CHECK-EMPTY:
-// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_anonymous_5) {
-// CHECK-NEXT: setLibcallImpl(Func, Impl);
-// CHECK-NEXT: setLibcallImplCallingConv(Impl, CallingConv::MSP430_BUILTIN);
-// CHECK-NEXT: }
+// CHECK-NEXT: }, CallingConv::MSP430_BUILTIN);
// CHECK-EMPTY:
// CHECK-NEXT: }
// CHECK-EMPTY:
diff --git a/llvm/test/TableGen/RuntimeLibcallEmitter-conflict-warning.td b/llvm/test/TableGen/RuntimeLibcallEmitter-conflict-warning.td
index 00c9d53846326..2608faf2f75f0 100644
--- a/llvm/test/TableGen/RuntimeLibcallEmitter-conflict-warning.td
+++ b/llvm/test/TableGen/RuntimeLibcallEmitter-conflict-warning.td
@@ -25,9 +25,9 @@ def dup1 : RuntimeLibcallImpl<ANOTHER_DUP>;
// func_a and func_b both provide SOME_FUNC.
// CHECK: if (isTargetArchA()) {
-// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
+// CHECK-NEXT: setLibcallsImpl({
// CHECK-NEXT: {RTLIB::SOME_FUNC, RTLIB::func_b}, // func_b
-// CHECK-NEXT: };
+// CHECK-NEXT: });
// ERR: :[[@LINE+1]]:5: warning: conflicting implementations for libcall SOME_FUNC: func_b, func_a
def TheSystemLibraryA : SystemRuntimeLibrary<isTargetArchA,
@@ -35,10 +35,10 @@ def TheSystemLibraryA : SystemRuntimeLibrary<isTargetArchA,
>;
// CHECK: if (isTargetArchB()) {
-// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
+// CHECK-NEXT: setLibcallsImpl({
// CHECK-NEXT: {RTLIB::OTHER_FUNC, RTLIB::other_func}, // other_func
-// CHECK-NEXT: {RTLIB::SOME_FUNC, RTLIB::func_a}, // func_a
-// CHECK-NEXT: };
+// CHECK-NEXT: {RTLIB::SOME_FUNC, RTLIB::func_a}, // func_a
+// CHECK-NEXT: });
// ERR: :[[@LINE+1]]:5: warning: conflicting implementations for libcall SOME_FUNC: func_a, func_b
def TheSystemLibraryB : SystemRuntimeLibrary<isTargetArchB,
@@ -46,11 +46,11 @@ def TheSystemLibraryB : SystemRuntimeLibrary<isTargetArchB,
>;
// CHECK: if (isTargetArchC()) {
-// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
+// CHECK-NEXT: setLibcallsImpl({
// CHECK-NEXT: {RTLIB::ANOTHER_DUP, RTLIB::dup1}, // dup1
// CHECK-NEXT: {RTLIB::OTHER_FUNC, RTLIB::other_func}, // other_func
// CHECK-NEXT: {RTLIB::SOME_FUNC, RTLIB::func_a}, // func_a
-// CHECK-NEXT: };
+// CHECK-NEXT: });
// ERR: :[[@LINE+3]]:5: warning: conflicting implementations for libcall ANOTHER_DUP: dup1, dup0
// ERR: :[[@LINE+2]]:5: warning: conflicting implementations for libcall SOME_FUNC: func_a, func_b
diff --git a/llvm/test/TableGen/RuntimeLibcallEmitter.td b/llvm/test/TableGen/RuntimeLibcallEmitter.td
index 642f8b85a89c6..59ccd2341c54c 100644
--- a/llvm/test/TableGen/RuntimeLibcallEmitter.td
+++ b/llvm/test/TableGen/RuntimeLibcallEmitter.td
@@ -155,38 +155,36 @@ def BlahLibrary : SystemRuntimeLibrary<isBlahArch, (add calloc, LibraryWithCondi
// CHECK-NEXT: RTLIB::Libcall Func;
// CHECK-NEXT: RTLIB::LibcallImpl Impl;
// CHECK-NEXT: };
+// CHECK-NEXT: auto setLibcallsImpl = [this](
+// CHECK-NEXT: ArrayRef<LibcallImplPair> Libcalls,
+// CHECK-NEXT: std::optional<llvm::CallingConv::ID> CC = {})
+// CHECK-NEXT: {
+// CHECK-NEXT: for (const auto [Func, Impl] : Libcalls) {
+// CHECK-NEXT: setLibcallImpl(Func, Impl);
+// CHECK-NEXT: if (CC)
+// CHECK-NEXT: setLibcallImplCallingConv(Impl, *CC);
+// CHECK-NEXT: }
+// CHECK-NEXT: };
// CHECK-EMPTY:
// CHECK-NEXT: if (TT.getArch() == Triple::blah) {
-// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
+// CHECK-NEXT: setLibcallsImpl({
// CHECK-NEXT: {RTLIB::BZERO, RTLIB::bzero}, // bzero
// CHECK-NEXT: {RTLIB::CALLOC, RTLIB::calloc}, // calloc
// CHECK-NEXT: {RTLIB::SQRT_F128, RTLIB::sqrtl_f128}, // sqrtl
-// CHECK-NEXT: };
-// CHECK-EMPTY:
-// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls) {
-// CHECK-NEXT: setLibcallImpl(Func, Impl);
-// CHECK-NEXT: }
+// CHECK-NEXT: });
// CHECK-EMPTY:
// CHECK-NEXT: if (TT.hasCompilerRT()) {
-// CHECK-NEXT: static const LibcallImplPair LibraryCalls_hasCompilerRT[] = {
+// CHECK-NEXT: setLibcallsImpl({
// CHECK-NEXT: {RTLIB::SHL_I32, RTLIB::__ashlsi3}, // __ashlsi3
// CHECK-NEXT: {RTLIB::SRL_I64, RTLIB::__lshrdi3}, // __lshrdi3
-// CHECK-NEXT: };
-// CHECK-EMPTY:
-// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_hasCompilerRT) {
-// CHECK-NEXT: setLibcallImpl(Func, Impl);
-// CHECK-NEXT: }
+// CHECK-NEXT: });
// CHECK-EMPTY:
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: if (TT.getOS() == Triple::bar) {
-// CHECK-NEXT: static const LibcallImplPair LibraryCalls_isBarOS[] = {
+// CHECK-NEXT: setLibcallsImpl({
// CHECK-NEXT: {RTLIB::MEMSET, RTLIB::___memset}, // ___memset
-// CHECK-NEXT: };
-// CHECK-EMPTY:
-// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_isBarOS) {
-// CHECK-NEXT: setLibcallImpl(Func, Impl);
-// CHECK-NEXT: }
+// CHECK-NEXT: });
// CHECK-EMPTY:
// CHECK-NEXT: }
// CHECK-EMPTY:
@@ -194,37 +192,25 @@ def BlahLibrary : SystemRuntimeLibrary<isBlahArch, (add calloc, LibraryWithCondi
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: if (TT.getArch() == Triple::buzz) {
-// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
+// CHECK-NEXT: setLibcallsImpl({
// CHECK-NEXT: {RTLIB::SHL_I32, RTLIB::__ashlsi3}, // __ashlsi3
// CHECK-NEXT: {RTLIB::SQRT_F80, RTLIB::sqrtl_f80}, // sqrtl
// CHECK-NEXT: {RTLIB::SRL_I64, RTLIB::__lshrdi3}, // __lshrdi3
-// CHECK-NEXT: };
-// CHECK-EMPTY:
-// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls) {
-// CHECK-NEXT: setLibcallImpl(Func, Impl);
-// CHECK-NEXT: }
+// CHECK-NEXT: });
// CHECK-EMPTY:
// CHECK-NEXT: return;
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: if (TT.getArch() == Triple::foo) {
-// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
+// CHECK-NEXT: setLibcallsImpl({
// CHECK-NEXT: {RTLIB::BZERO, RTLIB::bzero}, // bzero
// CHECK-NEXT: {RTLIB::SQRT_F128, RTLIB::sqrtl_f128}, // sqrtl
-// CHECK-NEXT: };
-// CHECK-EMPTY:
-// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls) {
-// CHECK-NEXT: setLibcallImpl(Func, Impl);
-// CHECK-NEXT: }
+// CHECK-NEXT: });
// CHECK-EMPTY:
// CHECK-NEXT: if (TT.getOS() == Triple::bar) {
-// CHECK-NEXT: static const LibcallImplPair LibraryCalls_isBarOS[] = {
+// CHECK-NEXT: setLibcallsImpl({
// CHECK-NEXT: {RTLIB::MEMSET, RTLIB::___memset}, // ___memset
-// CHECK-NEXT: };
-// CHECK-EMPTY:
-// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_isBarOS) {
-// CHECK-NEXT: setLibcallImpl(Func, Impl);
-// CHECK-NEXT: }
+// CHECK-NEXT: });
// CHECK-EMPTY:
// CHECK-NEXT: }
// CHECK-EMPTY:
@@ -232,16 +218,12 @@ def BlahLibrary : SystemRuntimeLibrary<isBlahArch, (add calloc, LibraryWithCondi
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK-NEXT: if (TT.getArch() == Triple::simple) {
-// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
+// CHECK-NEXT: setLibcallsImpl({
// CHECK-NEXT: {RTLIB::CALLOC, RTLIB::calloc}, // calloc
// CHECK-NEXT: {RTLIB::SHL_I32, RTLIB::__ashlsi3}, // __ashlsi3
// CHECK-NEXT: {RTLIB::SQRT_F80, RTLIB::sqrtl_f80}, // sqrtl
// CHECK-NEXT: {RTLIB::SRL_I64, RTLIB::__lshrdi3}, // __lshrdi3
-// CHECK-NEXT: };
-// CHECK-EMPTY:
-// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls) {
-// CHECK-NEXT: setLibcallImpl(Func, Impl);
-// CHECK-NEXT: }
+// CHECK-NEXT: });
// CHECK-EMPTY:
// CHECK-NEXT: return;
// CHECK-NEXT: }
diff --git a/llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp b/llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp
index 412431b96d030..6c35f60b07be7 100644
--- a/llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp
+++ b/llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp
@@ -360,6 +360,16 @@ void RuntimeLibcallEmitter::emitSystemRuntimeLibrarySetCalls(
" struct LibcallImplPair {\n"
" RTLIB::Libcall Func;\n"
" RTLIB::LibcallImpl Impl;\n"
+ " };\n"
+ " auto setLibcallsImpl = [this](\n"
+ " ArrayRef<LibcallImplPair> Libcalls,\n"
+ " std::optional<llvm::CallingConv::ID> CC = {})\n"
+ " {\n"
+ " for (const auto [Func, Impl] : Libcalls) {\n"
+ " setLibcallImpl(Func, Impl);\n"
+ " if (CC)\n"
+ " setLibcallImplCallingConv(Impl, *CC);\n"
+ " }\n"
" };\n";
ArrayRef<const Record *> AllLibs =
Records.getAllDerivedDefinitions("SystemRuntimeLibrary");
@@ -485,31 +495,18 @@ void RuntimeLibcallEmitter::emitSystemRuntimeLibrarySetCalls(
Funcs.erase(UniqueI, Funcs.end());
- OS << indent(IndentDepth + 2)
- << "static const LibcallImplPair LibraryCalls";
- SubsetPredicate.emitTableVariableNameSuffix(OS);
- OS << "[] = {\n";
+ OS << indent(IndentDepth + 2) << "setLibcallsImpl({\n";
for (const RuntimeLibcallImpl *LibCallImpl : Funcs) {
- OS << indent(IndentDepth + 6);
+ OS << indent(IndentDepth + 4);
LibCallImpl->emitTableEntry(OS);
}
-
- OS << indent(IndentDepth + 2) << "};\n\n"
- << indent(IndentDepth + 2)
- << "for (const auto [Func, Impl] : LibraryCalls";
- SubsetPredicate.emitTableVariableNameSuffix(OS);
- OS << ") {\n"
- << indent(IndentDepth + 4) << "setLibcallImpl(Func, Impl);\n";
-
+ OS << indent(IndentDepth + 2) << "}";
if (FuncsWithCC.CallingConv) {
StringRef CCEnum =
FuncsWithCC.CallingConv->getValueAsString("CallingConv");
- OS << indent(IndentDepth + 4) << "setLibcallImplCallingConv(Impl, "
- << CCEnum << ");\n";
+ OS << ", " << CCEnum;
}
-
- OS << indent(IndentDepth + 2) << "}\n";
- OS << '\n';
+ OS << ");\n\n";
if (!SubsetPredicate.isAlwaysAvailable()) {
OS << indent(IndentDepth);
More information about the llvm-commits
mailing list