Skip to content

Commit ccae485

Browse files
authored
TableGen: Go back to using range loop over runtime libcall sets (#162221)
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 bcdea60 commit ccae485

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)