Skip to content

Commit e41bcf5

Browse files
committed
TableGen: Go back to using range loop over runtime libcall sets
This reverts 9c361cc and replaces f490dbd. Instead of using the lambda to try avoid naming the variables, just disambiguate the different AlwaysAvailable sets with the calling convention name.
1 parent e706a30 commit e41bcf5

File tree

4 files changed

+159
-48
lines changed

4 files changed

+159
-48
lines changed

llvm/test/TableGen/RuntimeLibcallEmitter-calling-conv.td

Lines changed: 55 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -48,39 +48,79 @@ def MSP430LibraryWithCondCC : SystemRuntimeLibrary<isMSP430,
4848
// CHECK-NEXT: Entry = DefaultCC;
4949
// CHECK-NEXT: }
5050
// CHECK-EMPTY:
51-
// CHECK-NEXT: setLibcallImpl(RTLIB::MALLOC, RTLIB::impl_malloc); // malloc
51+
// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
52+
// CHECK-NEXT: {RTLIB::MALLOC, RTLIB::impl_malloc}, // malloc
53+
// CHECK-NEXT: };
5254
// CHECK-EMPTY:
53-
// CHECK-NEXT: setLibcallImpl(RTLIB::SDIVREM_I8, RTLIB::impl___divmodqi4); // __divmodqi4
54-
// CHECK-NEXT: setLibcallImplCallingConv(RTLIB::impl___divmodqi4, CallingConv::AVR_BUILTIN);
55-
// CHECK-NEXT: setLibcallImpl(RTLIB::UDIVREM_I16, RTLIB::impl___udivmodhi4); // __udivmodhi4
56-
// CHECK-NEXT: setLibcallImplCallingConv(RTLIB::impl___udivmodhi4, CallingConv::AVR_BUILTIN);
55+
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls) {
56+
// CHECK-NEXT: setLibcallImpl(Func, Impl);
57+
// CHECK-NEXT: }
58+
// CHECK-EMPTY:
59+
// CHECK-NEXT: static const LibcallImplPair LibraryCalls_AlwaysAvailable_AVR_BUILTIN[] = {
60+
// CHECK-NEXT: {RTLIB::SDIVREM_I8, RTLIB::impl___divmodqi4}, // __divmodqi4
61+
// CHECK-NEXT: {RTLIB::UDIVREM_I16, RTLIB::impl___udivmodhi4}, // __udivmodhi4
62+
// CHECK-NEXT: };
63+
// CHECK-EMPTY:
64+
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_AlwaysAvailable_AVR_BUILTIN) {
65+
// CHECK-NEXT: setLibcallImpl(Func, Impl);
66+
// CHECK-NEXT: setLibcallImplCallingConv(Impl, CallingConv::AVR_BUILTIN);
67+
// CHECK-NEXT: }
5768
// CHECK-EMPTY:
5869
// CHECK-NEXT: return;
5970
// CHECK-NEXT: }
6071
// CHECK-EMPTY:
6172
// CHECK-NEXT: if (TT.getArch() == Triple::avr) {
62-
// CHECK-NEXT: setLibcallImpl(RTLIB::MALLOC, RTLIB::impl_malloc); // malloc
73+
// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
74+
// CHECK-NEXT: {RTLIB::MALLOC, RTLIB::impl_malloc}, // malloc
75+
// CHECK-NEXT: };
76+
// CHECK-EMPTY:
77+
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls) {
78+
// CHECK-NEXT: setLibcallImpl(Func, Impl);
79+
// CHECK-NEXT: }
6380
// CHECK-EMPTY:
64-
// CHECK-NEXT: setLibcallImpl(RTLIB::SDIVREM_I8, RTLIB::impl___divmodqi4); // __divmodqi4
65-
// CHECK-NEXT: setLibcallImplCallingConv(RTLIB::impl___divmodqi4, CallingConv::AVR_BUILTIN);
66-
// CHECK-NEXT: setLibcallImpl(RTLIB::UDIVREM_I16, RTLIB::impl___udivmodhi4); // __udivmodhi4
67-
// CHECK-NEXT: setLibcallImplCallingConv(RTLIB::impl___udivmodhi4, CallingConv::AVR_BUILTIN);
81+
// CHECK-NEXT: static const LibcallImplPair LibraryCalls_AlwaysAvailable_AVR_BUILTIN[] = {
82+
// CHECK-NEXT: {RTLIB::SDIVREM_I8, RTLIB::impl___divmodqi4}, // __divmodqi4
83+
// CHECK-NEXT: {RTLIB::UDIVREM_I16, RTLIB::impl___udivmodhi4}, // __udivmodhi4
84+
// CHECK-NEXT: };
85+
// CHECK-EMPTY:
86+
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_AlwaysAvailable_AVR_BUILTIN) {
87+
// CHECK-NEXT: setLibcallImpl(Func, Impl);
88+
// CHECK-NEXT: setLibcallImplCallingConv(Impl, CallingConv::AVR_BUILTIN);
89+
// CHECK-NEXT: }
6890
// CHECK-EMPTY:
6991
// CHECK-NEXT: return;
7092
// CHECK-NEXT: }
7193
// CHECK-EMPTY:
7294
// CHECK-NEXT: if (TT.getArch() == Triple::msp430) {
73-
// CHECK-NEXT: setLibcallImpl(RTLIB::MALLOC, RTLIB::impl_malloc); // malloc
95+
// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
96+
// CHECK-NEXT: {RTLIB::MALLOC, RTLIB::impl_malloc}, // malloc
97+
// CHECK-NEXT: };
98+
// CHECK-EMPTY:
99+
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls) {
100+
// CHECK-NEXT: setLibcallImpl(Func, Impl);
101+
// CHECK-NEXT: }
74102
// CHECK-EMPTY:
75103
// CHECK-NEXT: if ( isFoo() ) {
76-
// CHECK-NEXT: setLibcallImpl(RTLIB::SDIVREM_I8, RTLIB::impl___divmodqi4); // __divmodqi4
77-
// CHECK-NEXT: setLibcallImplCallingConv(RTLIB::impl___divmodqi4, CallingConv::AVR_BUILTIN);
104+
// CHECK-NEXT: static const LibcallImplPair LibraryCalls_anonymous_3_AVR_BUILTIN[] = {
105+
// CHECK-NEXT: {RTLIB::SDIVREM_I8, RTLIB::impl___divmodqi4}, // __divmodqi4
106+
// CHECK-NEXT: };
107+
// CHECK-EMPTY:
108+
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_anonymous_3_AVR_BUILTIN) {
109+
// CHECK-NEXT: setLibcallImpl(Func, Impl);
110+
// CHECK-NEXT: setLibcallImplCallingConv(Impl, CallingConv::AVR_BUILTIN);
111+
// CHECK-NEXT: }
78112
// CHECK-EMPTY:
79113
// CHECK-NEXT: }
80114
// CHECK-EMPTY:
81115
// CHECK-NEXT: if ( isBar() ) {
82-
// CHECK-NEXT: setLibcallImpl(RTLIB::UDIVREM_I16, RTLIB::impl___udivmodhi4); // __udivmodhi4
83-
// CHECK-NEXT: setLibcallImplCallingConv(RTLIB::impl___udivmodhi4, CallingConv::MSP430_BUILTIN);
116+
// CHECK-NEXT: static const LibcallImplPair LibraryCalls_anonymous_5_MSP430_BUILTIN[] = {
117+
// CHECK-NEXT: {RTLIB::UDIVREM_I16, RTLIB::impl___udivmodhi4}, // __udivmodhi4
118+
// CHECK-NEXT: };
119+
// CHECK-EMPTY:
120+
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_anonymous_5_MSP430_BUILTIN) {
121+
// CHECK-NEXT: setLibcallImpl(Func, Impl);
122+
// CHECK-NEXT: setLibcallImplCallingConv(Impl, CallingConv::MSP430_BUILTIN);
123+
// CHECK-NEXT: }
84124
// CHECK-EMPTY:
85125
// CHECK-NEXT: }
86126
// CHECK-EMPTY:

llvm/test/TableGen/RuntimeLibcallEmitter-conflict-warning.td

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,26 +25,32 @@ def dup1 : RuntimeLibcallImpl<ANOTHER_DUP>;
2525
// func_a and func_b both provide SOME_FUNC.
2626

2727
// CHECK: if (isTargetArchA()) {
28-
// CHECK-NEXT: setLibcallImpl(RTLIB::SOME_FUNC, RTLIB::impl_func_b); // func_b
28+
// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
29+
// CHECK-NEXT: {RTLIB::SOME_FUNC, RTLIB::impl_func_b}, // func_b
30+
// CHECK-NEXT: };
2931

3032
// ERR: :[[@LINE+1]]:5: warning: conflicting implementations for libcall SOME_FUNC: func_b, func_a
3133
def TheSystemLibraryA : SystemRuntimeLibrary<isTargetArchA,
3234
(add func_b, func_a)
3335
>;
3436

3537
// CHECK: if (isTargetArchB()) {
36-
// CHECK-NEXT: setLibcallImpl(RTLIB::OTHER_FUNC, RTLIB::impl_other_func); // other_func
37-
// CHECK-NEXT: setLibcallImpl(RTLIB::SOME_FUNC, RTLIB::impl_func_a); // func_a
38+
// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
39+
// CHECK-NEXT: {RTLIB::OTHER_FUNC, RTLIB::impl_other_func}, // other_func
40+
// CHECK-NEXT: {RTLIB::SOME_FUNC, RTLIB::impl_func_a}, // func_a
41+
// CHECK-NEXT: };
3842

3943
// ERR: :[[@LINE+1]]:5: warning: conflicting implementations for libcall SOME_FUNC: func_a, func_b
4044
def TheSystemLibraryB : SystemRuntimeLibrary<isTargetArchB,
4145
(add func_a, other_func, func_b)
4246
>;
4347

4448
// CHECK: if (isTargetArchC()) {
45-
// CHECK-NEXT: setLibcallImpl(RTLIB::ANOTHER_DUP, RTLIB::impl_dup1); // dup1
46-
// CHECK-NEXT: setLibcallImpl(RTLIB::OTHER_FUNC, RTLIB::impl_other_func); // other_func
47-
// CHECK-NEXT: setLibcallImpl(RTLIB::SOME_FUNC, RTLIB::impl_func_a); // func_a
49+
// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
50+
// CHECK-NEXT: {RTLIB::ANOTHER_DUP, RTLIB::impl_dup1}, // dup1
51+
// CHECK-NEXT: {RTLIB::OTHER_FUNC, RTLIB::impl_other_func}, // other_func
52+
// CHECK-NEXT: {RTLIB::SOME_FUNC, RTLIB::impl_func_a}, // func_a
53+
// CHECK-NEXT: };
4854

4955
// ERR: :[[@LINE+3]]:5: warning: conflicting implementations for libcall ANOTHER_DUP: dup1, dup0
5056
// ERR: :[[@LINE+2]]:5: warning: conflicting implementations for libcall SOME_FUNC: func_a, func_b

llvm/test/TableGen/RuntimeLibcallEmitter.td

Lines changed: 62 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -190,51 +190,97 @@ def BlahLibrary : SystemRuntimeLibrary<isBlahArch, (add calloc, LibraryWithCondi
190190
// CHECK-NEXT: }
191191

192192
// CHECK: void llvm::RTLIB::RuntimeLibcallsInfo::setTargetRuntimeLibcallSets(const llvm::Triple &TT, ExceptionHandling ExceptionModel, FloatABI::ABIType FloatABI, EABI EABIVersion, StringRef ABIName) {
193+
// CHECK-NEXT: struct LibcallImplPair {
194+
// CHECK-NEXT: RTLIB::Libcall Func;
195+
// CHECK-NEXT: RTLIB::LibcallImpl Impl;
196+
// CHECK-NEXT: };
193197
// CHECK-EMPTY:
194198
// CHECK-NEXT: if (TT.getArch() == Triple::blah) {
195-
// CHECK-NEXT: setLibcallImpl(RTLIB::BZERO, RTLIB::impl_bzero); // bzero
196-
// CHECK-NEXT: setLibcallImpl(RTLIB::CALLOC, RTLIB::impl_calloc); // calloc
197-
// CHECK-NEXT: setLibcallImpl(RTLIB::SQRT_F128, RTLIB::impl_sqrtl_f128); // sqrtl
199+
// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
200+
// CHECK-NEXT: {RTLIB::BZERO, RTLIB::impl_bzero}, // bzero
201+
// CHECK-NEXT: {RTLIB::CALLOC, RTLIB::impl_calloc}, // calloc
202+
// CHECK-NEXT: {RTLIB::SQRT_F128, RTLIB::impl_sqrtl_f128}, // sqrtl
203+
// CHECK-NEXT: };
204+
// CHECK-EMPTY:
205+
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls) {
206+
// CHECK-NEXT: setLibcallImpl(Func, Impl);
207+
// CHECK-NEXT: }
198208
// CHECK-EMPTY:
199209
// CHECK-NEXT: if (TT.hasCompilerRT()) {
200-
// CHECK-NEXT: setLibcallImpl(RTLIB::SHL_I32, RTLIB::impl___ashlsi3); // __ashlsi3
201-
// CHECK-NEXT: setLibcallImpl(RTLIB::SRL_I64, RTLIB::impl___lshrdi3); // __lshrdi3
210+
// CHECK-NEXT: static const LibcallImplPair LibraryCalls_hasCompilerRT[] = {
211+
// CHECK-NEXT: {RTLIB::SHL_I32, RTLIB::impl___ashlsi3}, // __ashlsi3
212+
// CHECK-NEXT: {RTLIB::SRL_I64, RTLIB::impl___lshrdi3}, // __lshrdi3
213+
// CHECK-NEXT: };
214+
// CHECK-EMPTY:
215+
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_hasCompilerRT) {
216+
// CHECK-NEXT: setLibcallImpl(Func, Impl);
217+
// CHECK-NEXT: }
202218
// CHECK-EMPTY:
203219
// CHECK-NEXT: }
204220
// CHECK-EMPTY:
205221
// CHECK-NEXT: if (TT.getOS() == Triple::bar) {
206-
// CHECK-NEXT: setLibcallImpl(RTLIB::MEMSET, RTLIB::impl____memset); // ___memset
222+
// CHECK-NEXT: static const LibcallImplPair LibraryCalls_isBarOS[] = {
223+
// CHECK-NEXT: {RTLIB::MEMSET, RTLIB::impl____memset}, // ___memset
224+
// CHECK-NEXT: };
225+
// CHECK-EMPTY:
226+
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_isBarOS) {
227+
// CHECK-NEXT: setLibcallImpl(Func, Impl);
228+
// CHECK-NEXT: }
207229
// CHECK-EMPTY:
208230
// CHECK-NEXT: }
209231
// CHECK-EMPTY:
210232
// CHECK-NEXT: return;
211233
// CHECK-NEXT: }
212234
// CHECK-EMPTY:
213235
// CHECK-NEXT: if (TT.getArch() == Triple::buzz) {
214-
// CHECK-NEXT: setLibcallImpl(RTLIB::SHL_I32, RTLIB::impl___ashlsi3); // __ashlsi3
215-
// CHECK-NEXT: setLibcallImpl(RTLIB::SQRT_F80, RTLIB::impl_sqrtl_f80); // sqrtl
216-
// CHECK-NEXT: setLibcallImpl(RTLIB::SRL_I64, RTLIB::impl___lshrdi3); // __lshrdi3
236+
// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
237+
// CHECK-NEXT: {RTLIB::SHL_I32, RTLIB::impl___ashlsi3}, // __ashlsi3
238+
// CHECK-NEXT: {RTLIB::SQRT_F80, RTLIB::impl_sqrtl_f80}, // sqrtl
239+
// CHECK-NEXT: {RTLIB::SRL_I64, RTLIB::impl___lshrdi3}, // __lshrdi3
240+
// CHECK-NEXT: };
241+
// CHECK-EMPTY:
242+
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls) {
243+
// CHECK-NEXT: setLibcallImpl(Func, Impl);
244+
// CHECK-NEXT: }
217245
// CHECK-EMPTY:
218246
// CHECK-NEXT: return;
219247
// CHECK-NEXT: }
220248
// CHECK-EMPTY:
221249
// CHECK-NEXT: if (TT.getArch() == Triple::foo) {
222-
// CHECK-NEXT: setLibcallImpl(RTLIB::BZERO, RTLIB::impl_bzero); // bzero
223-
// CHECK-NEXT: setLibcallImpl(RTLIB::SQRT_F128, RTLIB::impl_sqrtl_f128); // sqrtl
250+
// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
251+
// CHECK-NEXT: {RTLIB::BZERO, RTLIB::impl_bzero}, // bzero
252+
// CHECK-NEXT: {RTLIB::SQRT_F128, RTLIB::impl_sqrtl_f128}, // sqrtl
253+
// CHECK-NEXT: };
254+
// CHECK-EMPTY:
255+
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls) {
256+
// CHECK-NEXT: setLibcallImpl(Func, Impl);
257+
// CHECK-NEXT: }
224258
// CHECK-EMPTY:
225259
// CHECK-NEXT: if (TT.getOS() == Triple::bar) {
226-
// CHECK-NEXT: setLibcallImpl(RTLIB::MEMSET, RTLIB::impl____memset); // ___memset
260+
// CHECK-NEXT: static const LibcallImplPair LibraryCalls_isBarOS[] = {
261+
// CHECK-NEXT: {RTLIB::MEMSET, RTLIB::impl____memset}, // ___memset
262+
// CHECK-NEXT: };
263+
// CHECK-EMPTY:
264+
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_isBarOS) {
265+
// CHECK-NEXT: setLibcallImpl(Func, Impl);
266+
// CHECK-NEXT: }
227267
// CHECK-EMPTY:
228268
// CHECK-NEXT: }
229269
// CHECK-EMPTY:
230270
// CHECK-NEXT: return;
231271
// CHECK-NEXT: }
232272
// CHECK-EMPTY:
233273
// CHECK-NEXT: if (TT.getArch() == Triple::simple) {
234-
// CHECK-NEXT: setLibcallImpl(RTLIB::CALLOC, RTLIB::impl_calloc); // calloc
235-
// CHECK-NEXT: setLibcallImpl(RTLIB::SHL_I32, RTLIB::impl___ashlsi3); // __ashlsi3
236-
// CHECK-NEXT: setLibcallImpl(RTLIB::SQRT_F80, RTLIB::impl_sqrtl_f80); // sqrtl
237-
// CHECK-NEXT: setLibcallImpl(RTLIB::SRL_I64, RTLIB::impl___lshrdi3); // __lshrdi3
274+
// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
275+
// CHECK-NEXT: {RTLIB::CALLOC, RTLIB::impl_calloc}, // calloc
276+
// CHECK-NEXT: {RTLIB::SHL_I32, RTLIB::impl___ashlsi3}, // __ashlsi3
277+
// CHECK-NEXT: {RTLIB::SQRT_F80, RTLIB::impl_sqrtl_f80}, // sqrtl
278+
// CHECK-NEXT: {RTLIB::SRL_I64, RTLIB::impl___lshrdi3}, // __lshrdi3
279+
// CHECK-NEXT: };
280+
// CHECK-EMPTY:
281+
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls) {
282+
// CHECK-NEXT: setLibcallImpl(Func, Impl);
283+
// CHECK-NEXT: }
238284
// CHECK-EMPTY:
239285
// CHECK-NEXT: return;
240286
// CHECK-NEXT: }

llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -543,8 +543,11 @@ void RuntimeLibcallEmitter::emitSystemRuntimeLibrarySetCalls(
543543
OS << "void llvm::RTLIB::RuntimeLibcallsInfo::setTargetRuntimeLibcallSets("
544544
"const llvm::Triple &TT, ExceptionHandling ExceptionModel, "
545545
"FloatABI::ABIType FloatABI, EABI EABIVersion, "
546-
"StringRef ABIName) {\n";
547-
546+
"StringRef ABIName) {\n"
547+
" struct LibcallImplPair {\n"
548+
" RTLIB::Libcall Func;\n"
549+
" RTLIB::LibcallImpl Impl;\n"
550+
" };\n";
548551
ArrayRef<const Record *> AllLibs =
549552
Records.getAllDerivedDefinitions("SystemRuntimeLibrary");
550553

@@ -669,20 +672,36 @@ void RuntimeLibcallEmitter::emitSystemRuntimeLibrarySetCalls(
669672

670673
Funcs.erase(UniqueI, Funcs.end());
671674

672-
StringRef CCEnum;
675+
OS << indent(IndentDepth + 2)
676+
<< "static const LibcallImplPair LibraryCalls";
677+
SubsetPredicate.emitTableVariableNameSuffix(OS);
673678
if (FuncsWithCC.CallingConv)
674-
CCEnum = FuncsWithCC.CallingConv->getValueAsString("CallingConv");
679+
OS << '_' << FuncsWithCC.CallingConv->getName();
675680

681+
OS << "[] = {\n";
676682
for (const RuntimeLibcallImpl *LibCallImpl : Funcs) {
677-
OS << indent(IndentDepth + 2);
678-
LibCallImpl->emitSetImplCall(OS);
683+
OS << indent(IndentDepth + 6);
684+
LibCallImpl->emitTableEntry(OS);
685+
}
679686

680-
if (FuncsWithCC.CallingConv) {
681-
OS << indent(IndentDepth + 2) << "setLibcallImplCallingConv(";
682-
LibCallImpl->emitEnumEntry(OS);
683-
OS << ", " << CCEnum << ");\n";
684-
}
687+
OS << indent(IndentDepth + 2) << "};\n\n"
688+
<< indent(IndentDepth + 2)
689+
<< "for (const auto [Func, Impl] : LibraryCalls";
690+
SubsetPredicate.emitTableVariableNameSuffix(OS);
691+
if (FuncsWithCC.CallingConv)
692+
OS << '_' << FuncsWithCC.CallingConv->getName();
693+
694+
OS << ") {\n"
695+
<< indent(IndentDepth + 4) << "setLibcallImpl(Func, Impl);\n";
696+
697+
if (FuncsWithCC.CallingConv) {
698+
StringRef CCEnum =
699+
FuncsWithCC.CallingConv->getValueAsString("CallingConv");
700+
OS << indent(IndentDepth + 4) << "setLibcallImplCallingConv(Impl, "
701+
<< CCEnum << ");\n";
685702
}
703+
704+
OS << indent(IndentDepth + 2) << "}\n";
686705
OS << '\n';
687706

688707
if (!SubsetPredicate.isAlwaysAvailable()) {

0 commit comments

Comments
 (0)