Skip to content

Commit 9c361cc

Browse files
authored
[TableGen] Avoid duplicate variable names in RuntimeLibcallsEmitter (partial reland of #152505) (#153398)
1 parent 11ef62f commit 9c361cc

File tree

4 files changed

+62
-115
lines changed

4 files changed

+62
-115
lines changed

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

Lines changed: 16 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -48,79 +48,47 @@ def MSP430LibraryWithCondCC : SystemRuntimeLibrary<isMSP430,
4848
// CHECK-NEXT: Entry = DefaultCC;
4949
// CHECK-NEXT: }
5050
// CHECK-EMPTY:
51-
// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
52-
// CHECK-NEXT: {RTLIB::MALLOC, RTLIB::malloc}, // malloc
53-
// CHECK-NEXT: };
54-
// CHECK-EMPTY:
55-
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls) {
56-
// CHECK-NEXT: setLibcallImpl(Func, Impl);
57-
// CHECK-NEXT: }
51+
// CHECK-NEXT: setLibcallsImpl({
52+
// CHECK-NEXT: {RTLIB::MALLOC, RTLIB::malloc}, // malloc
53+
// CHECK-NEXT: });
5854
// CHECK-EMPTY:
59-
// CHECK-NEXT: static const LibcallImplPair LibraryCalls_AlwaysAvailable[] = {
55+
// CHECK-NEXT: setLibcallsImpl({
6056
// CHECK-NEXT: {RTLIB::SDIVREM_I8, RTLIB::__divmodqi4}, // __divmodqi4
6157
// CHECK-NEXT: {RTLIB::UDIVREM_I16, RTLIB::__udivmodhi4}, // __udivmodhi4
62-
// CHECK-NEXT: };
63-
// CHECK-EMPTY:
64-
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_AlwaysAvailable) {
65-
// CHECK-NEXT: setLibcallImpl(Func, Impl);
66-
// CHECK-NEXT: setLibcallImplCallingConv(Impl, CallingConv::AVR_BUILTIN);
67-
// CHECK-NEXT: }
58+
// CHECK-NEXT: }, CallingConv::AVR_BUILTIN);
6859
// CHECK-EMPTY:
6960
// CHECK-NEXT: return;
7061
// CHECK-NEXT: }
7162
// CHECK-EMPTY:
7263
// CHECK-NEXT: if (TT.getArch() == Triple::avr) {
73-
// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
64+
// CHECK-NEXT: setLibcallsImpl({
7465
// CHECK-NEXT: {RTLIB::MALLOC, RTLIB::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: }
66+
// CHECK-NEXT: });
8067
// CHECK-EMPTY:
81-
// CHECK-NEXT: static const LibcallImplPair LibraryCalls_AlwaysAvailable[] = {
68+
// CHECK-NEXT: setLibcallsImpl({
8269
// CHECK-NEXT: {RTLIB::SDIVREM_I8, RTLIB::__divmodqi4}, // __divmodqi4
8370
// CHECK-NEXT: {RTLIB::UDIVREM_I16, RTLIB::__udivmodhi4}, // __udivmodhi4
84-
// CHECK-NEXT: };
85-
// CHECK-EMPTY:
86-
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_AlwaysAvailable) {
87-
// CHECK-NEXT: setLibcallImpl(Func, Impl);
88-
// CHECK-NEXT: setLibcallImplCallingConv(Impl, CallingConv::AVR_BUILTIN);
89-
// CHECK-NEXT: }
71+
// CHECK-NEXT: }, CallingConv::AVR_BUILTIN);
9072
// CHECK-EMPTY:
9173
// CHECK-NEXT: return;
9274
// CHECK-NEXT: }
9375
// CHECK-EMPTY:
9476
// CHECK-NEXT: if (TT.getArch() == Triple::msp430) {
95-
// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
77+
// CHECK-NEXT: setLibcallsImpl({
9678
// CHECK-NEXT: {RTLIB::MALLOC, RTLIB::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: }
79+
// CHECK-NEXT: });
10280
// CHECK-EMPTY:
10381
// CHECK-NEXT: if ( isFoo() ) {
104-
// CHECK-NEXT: static const LibcallImplPair LibraryCalls_anonymous_3[] = {
105-
// CHECK-NEXT: {RTLIB::SDIVREM_I8, RTLIB::__divmodqi4}, // __divmodqi4
106-
// CHECK-NEXT: };
107-
// CHECK-EMPTY:
108-
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_anonymous_3) {
109-
// CHECK-NEXT: setLibcallImpl(Func, Impl);
110-
// CHECK-NEXT: setLibcallImplCallingConv(Impl, CallingConv::AVR_BUILTIN);
111-
// CHECK-NEXT: }
82+
// CHECK-NEXT: setLibcallsImpl({
83+
// CHECK-NEXT: {RTLIB::SDIVREM_I8, RTLIB::__divmodqi4}, // __divmodqi4
84+
// CHECK-NEXT: }, CallingConv::AVR_BUILTIN);
11285
// CHECK-EMPTY:
11386
// CHECK-NEXT: }
11487
// CHECK-EMPTY:
11588
// CHECK-NEXT: if ( isBar() ) {
116-
// CHECK-NEXT: static const LibcallImplPair LibraryCalls_anonymous_5[] = {
89+
// CHECK-NEXT: setLibcallsImpl({
11790
// CHECK-NEXT: {RTLIB::UDIVREM_I16, RTLIB::__udivmodhi4}, // __udivmodhi4
118-
// CHECK-NEXT: };
119-
// CHECK-EMPTY:
120-
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_anonymous_5) {
121-
// CHECK-NEXT: setLibcallImpl(Func, Impl);
122-
// CHECK-NEXT: setLibcallImplCallingConv(Impl, CallingConv::MSP430_BUILTIN);
123-
// CHECK-NEXT: }
91+
// CHECK-NEXT: }, CallingConv::MSP430_BUILTIN);
12492
// CHECK-EMPTY:
12593
// CHECK-NEXT: }
12694
// CHECK-EMPTY:

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,32 +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: static const LibcallImplPair LibraryCalls[] = {
28+
// CHECK-NEXT: setLibcallsImpl({
2929
// CHECK-NEXT: {RTLIB::SOME_FUNC, RTLIB::func_b}, // func_b
30-
// CHECK-NEXT: };
30+
// CHECK-NEXT: });
3131

3232
// ERR: :[[@LINE+1]]:5: warning: conflicting implementations for libcall SOME_FUNC: func_b, func_a
3333
def TheSystemLibraryA : SystemRuntimeLibrary<isTargetArchA,
3434
(add func_b, func_a)
3535
>;
3636

3737
// CHECK: if (isTargetArchB()) {
38-
// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
38+
// CHECK-NEXT: setLibcallsImpl({
3939
// CHECK-NEXT: {RTLIB::OTHER_FUNC, RTLIB::other_func}, // other_func
40-
// CHECK-NEXT: {RTLIB::SOME_FUNC, RTLIB::func_a}, // func_a
41-
// CHECK-NEXT: };
40+
// CHECK-NEXT: {RTLIB::SOME_FUNC, RTLIB::func_a}, // func_a
41+
// CHECK-NEXT: });
4242

4343
// ERR: :[[@LINE+1]]:5: warning: conflicting implementations for libcall SOME_FUNC: func_a, func_b
4444
def TheSystemLibraryB : SystemRuntimeLibrary<isTargetArchB,
4545
(add func_a, other_func, func_b)
4646
>;
4747

4848
// CHECK: if (isTargetArchC()) {
49-
// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
49+
// CHECK-NEXT: setLibcallsImpl({
5050
// CHECK-NEXT: {RTLIB::ANOTHER_DUP, RTLIB::dup1}, // dup1
5151
// CHECK-NEXT: {RTLIB::OTHER_FUNC, RTLIB::other_func}, // other_func
5252
// CHECK-NEXT: {RTLIB::SOME_FUNC, RTLIB::func_a}, // func_a
53-
// CHECK-NEXT: };
53+
// CHECK-NEXT: });
5454

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

llvm/test/TableGen/RuntimeLibcallEmitter.td

Lines changed: 24 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -155,93 +155,75 @@ def BlahLibrary : SystemRuntimeLibrary<isBlahArch, (add calloc, LibraryWithCondi
155155
// CHECK-NEXT: RTLIB::Libcall Func;
156156
// CHECK-NEXT: RTLIB::LibcallImpl Impl;
157157
// CHECK-NEXT: };
158+
// CHECK-NEXT: auto setLibcallsImpl = [this](
159+
// CHECK-NEXT: ArrayRef<LibcallImplPair> Libcalls,
160+
// CHECK-NEXT: std::optional<llvm::CallingConv::ID> CC = {})
161+
// CHECK-NEXT: {
162+
// CHECK-NEXT: for (const auto [Func, Impl] : Libcalls) {
163+
// CHECK-NEXT: setLibcallImpl(Func, Impl);
164+
// CHECK-NEXT: if (CC)
165+
// CHECK-NEXT: setLibcallImplCallingConv(Impl, *CC);
166+
// CHECK-NEXT: }
167+
// CHECK-NEXT: };
158168
// CHECK-EMPTY:
159169
// CHECK-NEXT: if (TT.getArch() == Triple::blah) {
160-
// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
170+
// CHECK-NEXT: setLibcallsImpl({
161171
// CHECK-NEXT: {RTLIB::BZERO, RTLIB::bzero}, // bzero
162172
// CHECK-NEXT: {RTLIB::CALLOC, RTLIB::calloc}, // calloc
163173
// CHECK-NEXT: {RTLIB::SQRT_F128, RTLIB::sqrtl_f128}, // sqrtl
164-
// CHECK-NEXT: };
165-
// CHECK-EMPTY:
166-
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls) {
167-
// CHECK-NEXT: setLibcallImpl(Func, Impl);
168-
// CHECK-NEXT: }
174+
// CHECK-NEXT: });
169175
// CHECK-EMPTY:
170176
// CHECK-NEXT: if (TT.hasCompilerRT()) {
171-
// CHECK-NEXT: static const LibcallImplPair LibraryCalls_hasCompilerRT[] = {
177+
// CHECK-NEXT: setLibcallsImpl({
172178
// CHECK-NEXT: {RTLIB::SHL_I32, RTLIB::__ashlsi3}, // __ashlsi3
173179
// CHECK-NEXT: {RTLIB::SRL_I64, RTLIB::__lshrdi3}, // __lshrdi3
174-
// CHECK-NEXT: };
175-
// CHECK-EMPTY:
176-
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_hasCompilerRT) {
177-
// CHECK-NEXT: setLibcallImpl(Func, Impl);
178-
// CHECK-NEXT: }
180+
// CHECK-NEXT: });
179181
// CHECK-EMPTY:
180182
// CHECK-NEXT: }
181183
// CHECK-EMPTY:
182184
// CHECK-NEXT: if (TT.getOS() == Triple::bar) {
183-
// CHECK-NEXT: static const LibcallImplPair LibraryCalls_isBarOS[] = {
185+
// CHECK-NEXT: setLibcallsImpl({
184186
// CHECK-NEXT: {RTLIB::MEMSET, RTLIB::___memset}, // ___memset
185-
// CHECK-NEXT: };
186-
// CHECK-EMPTY:
187-
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_isBarOS) {
188-
// CHECK-NEXT: setLibcallImpl(Func, Impl);
189-
// CHECK-NEXT: }
187+
// CHECK-NEXT: });
190188
// CHECK-EMPTY:
191189
// CHECK-NEXT: }
192190
// CHECK-EMPTY:
193191
// CHECK-NEXT: return;
194192
// CHECK-NEXT: }
195193
// CHECK-EMPTY:
196194
// CHECK-NEXT: if (TT.getArch() == Triple::buzz) {
197-
// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
195+
// CHECK-NEXT: setLibcallsImpl({
198196
// CHECK-NEXT: {RTLIB::SHL_I32, RTLIB::__ashlsi3}, // __ashlsi3
199197
// CHECK-NEXT: {RTLIB::SQRT_F80, RTLIB::sqrtl_f80}, // sqrtl
200198
// CHECK-NEXT: {RTLIB::SRL_I64, RTLIB::__lshrdi3}, // __lshrdi3
201-
// CHECK-NEXT: };
202-
// CHECK-EMPTY:
203-
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls) {
204-
// CHECK-NEXT: setLibcallImpl(Func, Impl);
205-
// CHECK-NEXT: }
199+
// CHECK-NEXT: });
206200
// CHECK-EMPTY:
207201
// CHECK-NEXT: return;
208202
// CHECK-NEXT: }
209203
// CHECK-EMPTY:
210204
// CHECK-NEXT: if (TT.getArch() == Triple::foo) {
211-
// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
205+
// CHECK-NEXT: setLibcallsImpl({
212206
// CHECK-NEXT: {RTLIB::BZERO, RTLIB::bzero}, // bzero
213207
// CHECK-NEXT: {RTLIB::SQRT_F128, RTLIB::sqrtl_f128}, // sqrtl
214-
// CHECK-NEXT: };
215-
// CHECK-EMPTY:
216-
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls) {
217-
// CHECK-NEXT: setLibcallImpl(Func, Impl);
218-
// CHECK-NEXT: }
208+
// CHECK-NEXT: });
219209
// CHECK-EMPTY:
220210
// CHECK-NEXT: if (TT.getOS() == Triple::bar) {
221-
// CHECK-NEXT: static const LibcallImplPair LibraryCalls_isBarOS[] = {
211+
// CHECK-NEXT: setLibcallsImpl({
222212
// CHECK-NEXT: {RTLIB::MEMSET, RTLIB::___memset}, // ___memset
223-
// CHECK-NEXT: };
224-
// CHECK-EMPTY:
225-
// CHECK-NEXT: for (const auto [Func, Impl] : LibraryCalls_isBarOS) {
226-
// CHECK-NEXT: setLibcallImpl(Func, Impl);
227-
// CHECK-NEXT: }
213+
// CHECK-NEXT: });
228214
// CHECK-EMPTY:
229215
// CHECK-NEXT: }
230216
// CHECK-EMPTY:
231217
// CHECK-NEXT: return;
232218
// CHECK-NEXT: }
233219
// CHECK-EMPTY:
234220
// CHECK-NEXT: if (TT.getArch() == Triple::simple) {
235-
// CHECK-NEXT: static const LibcallImplPair LibraryCalls[] = {
221+
// CHECK-NEXT: setLibcallsImpl({
236222
// CHECK-NEXT: {RTLIB::CALLOC, RTLIB::calloc}, // calloc
237223
// CHECK-NEXT: {RTLIB::SHL_I32, RTLIB::__ashlsi3}, // __ashlsi3
238224
// CHECK-NEXT: {RTLIB::SQRT_F80, RTLIB::sqrtl_f80}, // sqrtl
239225
// CHECK-NEXT: {RTLIB::SRL_I64, RTLIB::__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: }
226+
// CHECK-NEXT: });
245227
// CHECK-EMPTY:
246228
// CHECK-NEXT: return;
247229
// CHECK-NEXT: }

llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,16 @@ void RuntimeLibcallEmitter::emitSystemRuntimeLibrarySetCalls(
360360
" struct LibcallImplPair {\n"
361361
" RTLIB::Libcall Func;\n"
362362
" RTLIB::LibcallImpl Impl;\n"
363+
" };\n"
364+
" auto setLibcallsImpl = [this](\n"
365+
" ArrayRef<LibcallImplPair> Libcalls,\n"
366+
" std::optional<llvm::CallingConv::ID> CC = {})\n"
367+
" {\n"
368+
" for (const auto [Func, Impl] : Libcalls) {\n"
369+
" setLibcallImpl(Func, Impl);\n"
370+
" if (CC)\n"
371+
" setLibcallImplCallingConv(Impl, *CC);\n"
372+
" }\n"
363373
" };\n";
364374
ArrayRef<const Record *> AllLibs =
365375
Records.getAllDerivedDefinitions("SystemRuntimeLibrary");
@@ -485,31 +495,18 @@ void RuntimeLibcallEmitter::emitSystemRuntimeLibrarySetCalls(
485495

486496
Funcs.erase(UniqueI, Funcs.end());
487497

488-
OS << indent(IndentDepth + 2)
489-
<< "static const LibcallImplPair LibraryCalls";
490-
SubsetPredicate.emitTableVariableNameSuffix(OS);
491-
OS << "[] = {\n";
498+
OS << indent(IndentDepth + 2) << "setLibcallsImpl({\n";
492499
for (const RuntimeLibcallImpl *LibCallImpl : Funcs) {
493-
OS << indent(IndentDepth + 6);
500+
OS << indent(IndentDepth + 4);
494501
LibCallImpl->emitTableEntry(OS);
495502
}
496-
497-
OS << indent(IndentDepth + 2) << "};\n\n"
498-
<< indent(IndentDepth + 2)
499-
<< "for (const auto [Func, Impl] : LibraryCalls";
500-
SubsetPredicate.emitTableVariableNameSuffix(OS);
501-
OS << ") {\n"
502-
<< indent(IndentDepth + 4) << "setLibcallImpl(Func, Impl);\n";
503-
503+
OS << indent(IndentDepth + 2) << "}";
504504
if (FuncsWithCC.CallingConv) {
505505
StringRef CCEnum =
506506
FuncsWithCC.CallingConv->getValueAsString("CallingConv");
507-
OS << indent(IndentDepth + 4) << "setLibcallImplCallingConv(Impl, "
508-
<< CCEnum << ");\n";
507+
OS << ", " << CCEnum;
509508
}
510-
511-
OS << indent(IndentDepth + 2) << "}\n";
512-
OS << '\n';
509+
OS << ");\n\n";
513510

514511
if (!SubsetPredicate.isAlwaysAvailable()) {
515512
OS << indent(IndentDepth);

0 commit comments

Comments
 (0)