Skip to content

Commit 212ecb9

Browse files
committed
[StrTable] Teach main builtin TableGen to use direct enums, strings, and info
This moves the main builtins and several targets to use nice generated string tables and info structures rather than X-macros. Even without obvious prefixes factored out, the resulting tables are significantly smaller and much cheaper to compile with out all the X-macro overhead. This leaves the X-macros in place for atomic builtins which have a wide range of uses that don't seem reasonable to fold into TableGen. As future work, these should move to their own file (whether as X-macros or just generated patterns) so the AST headers don't have to include all the data for other builtins.
1 parent 64ea3f5 commit 212ecb9

File tree

15 files changed

+313
-239
lines changed

15 files changed

+313
-239
lines changed

clang/include/clang/AST/Expr.h

-2
Original file line numberDiff line numberDiff line change
@@ -6678,7 +6678,6 @@ class PseudoObjectExpr final
66786678
class AtomicExpr : public Expr {
66796679
public:
66806680
enum AtomicOp {
6681-
#define BUILTIN(ID, TYPE, ATTRS)
66826681
#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) AO ## ID,
66836682
#include "clang/Basic/Builtins.inc"
66846683
// Avoid trailing comma
@@ -6742,7 +6741,6 @@ class AtomicExpr : public Expr {
67426741
AtomicOp getOp() const { return Op; }
67436742
StringRef getOpAsString() const {
67446743
switch (Op) {
6745-
#define BUILTIN(ID, TYPE, ATTRS)
67466744
#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \
67476745
case AO##ID: \
67486746
return #ID;

clang/include/clang/Basic/Builtins.h

+6-5
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,10 @@ struct HeaderDesc {
6464

6565
namespace Builtin {
6666
enum ID {
67-
NotBuiltin = 0, // This is not a builtin function.
68-
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
67+
NotBuiltin = 0, // This is not a builtin function.
68+
#define GET_BUILTIN_ENUMERATORS
6969
#include "clang/Basic/Builtins.inc"
70+
#undef GET_BUILTIN_ENUMERATORS
7071
FirstTSBuiltin
7172
};
7273

@@ -77,9 +78,9 @@ struct Info {
7778
// Rather than store pointers to the string literals describing these four
7879
// aspects of builtins, we store offsets into a common string table.
7980
struct StrOffsets {
80-
llvm::StringTable::Offset Name;
81-
llvm::StringTable::Offset Type;
82-
llvm::StringTable::Offset Attributes;
81+
llvm::StringTable::Offset Name = {};
82+
llvm::StringTable::Offset Type = {};
83+
llvm::StringTable::Offset Attributes = {};
8384

8485
// Defaults to the empty string offset.
8586
llvm::StringTable::Offset Features = {};

clang/include/clang/Basic/IdentifierTable.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,9 @@ enum class InterestingIdentifier {
101101
NUM_OBJC_KEYWORDS_AND_NOTABLE_IDENTIFIERS,
102102

103103
NotBuiltin,
104-
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
104+
#define GET_BUILTIN_ENUMERATORS
105105
#include "clang/Basic/Builtins.inc"
106+
#undef GET_BUILTIN_ENUMERATORS
106107
FirstTSBuiltin,
107108

108109
NotInterestingIdentifier = 65534

clang/include/clang/Basic/TargetBuiltins.h

+15-8
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,9 @@ namespace clang {
103103
namespace BPF {
104104
enum {
105105
LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
106-
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
107-
#include "clang/Basic/BuiltinsBPF.inc"
106+
#define GET_BUILTIN_ENUMERATORS
107+
#include "clang/Basic/BuiltinsBPF.inc"
108+
#undef GET_BUILTIN_ENUMERATORS
108109
LastTSBuiltin
109110
};
110111
}
@@ -123,8 +124,9 @@ namespace clang {
123124
namespace NVPTX {
124125
enum {
125126
LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
126-
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
127+
#define GET_BUILTIN_ENUMERATORS
127128
#include "clang/Basic/BuiltinsNVPTX.inc"
129+
#undef GET_BUILTIN_ENUMERATORS
128130
LastTSBuiltin
129131
};
130132
}
@@ -143,8 +145,9 @@ namespace clang {
143145
namespace SPIRV {
144146
enum {
145147
LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
146-
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
148+
#define GET_BUILTIN_ENUMERATORS
147149
#include "clang/Basic/BuiltinsSPIRV.inc"
150+
#undef GET_BUILTIN_ENUMERATORS
148151
LastTSBuiltin
149152
};
150153
} // namespace SPIRV
@@ -153,12 +156,14 @@ namespace clang {
153156
namespace X86 {
154157
enum {
155158
LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
156-
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
159+
#define GET_BUILTIN_ENUMERATORS
157160
#include "clang/Basic/BuiltinsX86.inc"
161+
#undef GET_BUILTIN_ENUMERATORS
158162
FirstX86_64Builtin,
159163
LastX86CommonBuiltin = FirstX86_64Builtin - 1,
160-
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
164+
#define GET_BUILTIN_ENUMERATORS
161165
#include "clang/Basic/BuiltinsX86_64.inc"
166+
#undef GET_BUILTIN_ENUMERATORS
162167
LastTSBuiltin
163168
};
164169
}
@@ -192,8 +197,9 @@ namespace clang {
192197
LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
193198
FirstRVVBuiltin = clang::Builtin::FirstTSBuiltin,
194199
LastRVVBuiltin = RISCVVector::FirstTSBuiltin - 1,
195-
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
200+
#define GET_BUILTIN_ENUMERATORS
196201
#include "clang/Basic/BuiltinsRISCV.inc"
202+
#undef GET_BUILTIN_ENUMERATORS
197203
LastTSBuiltin
198204
};
199205
} // namespace RISCV
@@ -388,8 +394,9 @@ namespace clang {
388394
namespace Hexagon {
389395
enum {
390396
LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
391-
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
397+
#define GET_BUILTIN_ENUMERATORS
392398
#include "clang/Basic/BuiltinsHexagon.inc"
399+
#undef GET_BUILTIN_ENUMERATORS
393400
LastTSBuiltin
394401
};
395402
}

clang/lib/AST/StmtPrinter.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -1977,7 +1977,6 @@ void StmtPrinter::VisitPseudoObjectExpr(PseudoObjectExpr *Node) {
19771977
void StmtPrinter::VisitAtomicExpr(AtomicExpr *Node) {
19781978
const char *Name = nullptr;
19791979
switch (Node->getOp()) {
1980-
#define BUILTIN(ID, TYPE, ATTRS)
19811980
#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \
19821981
case AtomicExpr::AO ## ID: \
19831982
Name = #ID "("; \

clang/lib/Basic/Builtins.cpp

+11-15
Original file line numberDiff line numberDiff line change
@@ -29,23 +29,19 @@ const char *HeaderDesc::getName() const {
2929
llvm_unreachable("Unknown HeaderDesc::HeaderID enum");
3030
}
3131

32-
static constexpr llvm::StringTable BuiltinStrings =
33-
CLANG_BUILTIN_STR_TABLE_START
34-
// We inject a non-builtin string into the table.
35-
CLANG_BUILTIN_STR_TABLE("not a builtin function", "", "")
36-
#define BUILTIN CLANG_BUILTIN_STR_TABLE
32+
static constexpr unsigned NumBuiltins = Builtin::FirstTSBuiltin;
33+
34+
#define GET_BUILTIN_STR_TABLE
3735
#include "clang/Basic/Builtins.inc"
38-
;
39-
static_assert(BuiltinStrings.size() < 100'000);
40-
41-
static constexpr auto BuiltinInfos =
42-
Builtin::MakeInfos<Builtin::FirstTSBuiltin>(
43-
{CLANG_BUILTIN_ENTRY("not a builtin function", "", "")
44-
#define BUILTIN CLANG_BUILTIN_ENTRY
45-
#define LANGBUILTIN CLANG_LANGBUILTIN_ENTRY
46-
#define LIBBUILTIN CLANG_LIBBUILTIN_ENTRY
36+
#undef GET_BUILTIN_STR_TABLE
37+
38+
static constexpr Builtin::Info BuiltinInfos[] = {
39+
Builtin::Info{}, // No-builtin info entry.
40+
#define GET_BUILTIN_INFOS
4741
#include "clang/Basic/Builtins.inc"
48-
});
42+
#undef GET_BUILTIN_INFOS
43+
};
44+
static_assert(std::size(BuiltinInfos) == NumBuiltins);
4945

5046
std::pair<const Builtin::InfosShard &, const Builtin::Info &>
5147
Builtin::Context::getShardAndInfo(unsigned ID) const {

clang/lib/Basic/Targets/BPF.cpp

+7-7
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,16 @@ using namespace clang::targets;
2222
static constexpr int NumBuiltins =
2323
clang::BPF::LastTSBuiltin - Builtin::FirstTSBuiltin;
2424

25-
static constexpr llvm::StringTable BuiltinStrings =
26-
CLANG_BUILTIN_STR_TABLE_START
27-
#define BUILTIN CLANG_BUILTIN_STR_TABLE
25+
#define GET_BUILTIN_STR_TABLE
2826
#include "clang/Basic/BuiltinsBPF.inc"
29-
;
27+
#undef GET_BUILTIN_STR_TABLE
3028

31-
static constexpr auto BuiltinInfos = Builtin::MakeInfos<NumBuiltins>({
32-
#define BUILTIN CLANG_BUILTIN_ENTRY
29+
static constexpr Builtin::Info BuiltinInfos[] = {
30+
#define GET_BUILTIN_INFOS
3331
#include "clang/Basic/BuiltinsBPF.inc"
34-
});
32+
#undef GET_BUILTIN_INFOS
33+
};
34+
static_assert(std::size(BuiltinInfos) == NumBuiltins);
3535

3636
void BPFTargetInfo::getTargetDefines(const LangOptions &Opts,
3737
MacroBuilder &Builder) const {

clang/lib/Basic/Targets/Hexagon.cpp

+7-10
Original file line numberDiff line numberDiff line change
@@ -207,19 +207,16 @@ ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
207207
static constexpr int NumBuiltins =
208208
clang::Hexagon::LastTSBuiltin - Builtin::FirstTSBuiltin;
209209

210-
static constexpr llvm::StringTable BuiltinStrings =
211-
CLANG_BUILTIN_STR_TABLE_START
212-
#define BUILTIN CLANG_BUILTIN_STR_TABLE
213-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
210+
#define GET_BUILTIN_STR_TABLE
214211
#include "clang/Basic/BuiltinsHexagon.inc"
215-
;
212+
#undef GET_BUILTIN_STR_TABLE
216213

217-
static constexpr auto BuiltinInfos = Builtin::MakeInfos<NumBuiltins>({
218-
#define BUILTIN CLANG_BUILTIN_ENTRY
219-
#define LIBBUILTIN CLANG_LIBBUILTIN_ENTRY
220-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
214+
static constexpr Builtin::Info BuiltinInfos[] = {
215+
#define GET_BUILTIN_INFOS
221216
#include "clang/Basic/BuiltinsHexagon.inc"
222-
});
217+
#undef GET_BUILTIN_INFOS
218+
};
219+
static_assert(std::size(BuiltinInfos) == NumBuiltins);
223220

224221
bool HexagonTargetInfo::hasFeature(StringRef Feature) const {
225222
std::string VS = "hvxv" + HVXVersion;

clang/lib/Basic/Targets/NVPTX.cpp

+7-7
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,16 @@ using namespace clang::targets;
2323
static constexpr int NumBuiltins =
2424
clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin;
2525

26-
static constexpr llvm::StringTable BuiltinStrings =
27-
CLANG_BUILTIN_STR_TABLE_START
28-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
26+
#define GET_BUILTIN_STR_TABLE
2927
#include "clang/Basic/BuiltinsNVPTX.inc"
30-
;
28+
#undef GET_BUILTIN_STR_TABLE
3129

32-
static constexpr auto BuiltinInfos = Builtin::MakeInfos<NumBuiltins>({
33-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
30+
static constexpr Builtin::Info BuiltinInfos[] = {
31+
#define GET_BUILTIN_INFOS
3432
#include "clang/Basic/BuiltinsNVPTX.inc"
35-
});
33+
#undef GET_BUILTIN_INFOS
34+
};
35+
static_assert(std::size(BuiltinInfos) == NumBuiltins);
3636

3737
const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
3838

clang/lib/Basic/Targets/RISCV.cpp

+7-9
Original file line numberDiff line numberDiff line change
@@ -277,18 +277,16 @@ static constexpr std::array<Builtin::Info, NumRVVSiFiveBuiltins> BuiltinInfos =
277277
};
278278
} // namespace RVVSiFive
279279

280-
static constexpr llvm::StringTable BuiltinStrings =
281-
CLANG_BUILTIN_STR_TABLE_START
282-
#define BUILTIN CLANG_BUILTIN_STR_TABLE
283-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
280+
#define GET_BUILTIN_STR_TABLE
284281
#include "clang/Basic/BuiltinsRISCV.inc"
285-
;
282+
#undef GET_BUILTIN_STR_TABLE
286283

287-
static constexpr auto BuiltinInfos = Builtin::MakeInfos<NumRISCVBuiltins>({
288-
#define BUILTIN CLANG_BUILTIN_ENTRY
289-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
284+
static constexpr Builtin::Info BuiltinInfos[] = {
285+
#define GET_BUILTIN_INFOS
290286
#include "clang/Basic/BuiltinsRISCV.inc"
291-
});
287+
#undef GET_BUILTIN_INFOS
288+
};
289+
static_assert(std::size(BuiltinInfos) == NumRISCVBuiltins);
292290

293291
llvm::SmallVector<Builtin::InfosShard>
294292
RISCVTargetInfo::getTargetBuiltins() const {

clang/lib/Basic/Targets/SPIR.cpp

+7-7
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,16 @@ using namespace clang::targets;
2323
static constexpr int NumBuiltins =
2424
clang::SPIRV::LastTSBuiltin - Builtin::FirstTSBuiltin;
2525

26-
static constexpr llvm::StringTable BuiltinStrings =
27-
CLANG_BUILTIN_STR_TABLE_START
28-
#define BUILTIN CLANG_BUILTIN_STR_TABLE
26+
#define GET_BUILTIN_STR_TABLE
2927
#include "clang/Basic/BuiltinsSPIRV.inc"
30-
;
28+
#undef GET_BUILTIN_STR_TABLE
3129

32-
static constexpr auto BuiltinInfos = Builtin::MakeInfos<NumBuiltins>({
33-
#define BUILTIN CLANG_BUILTIN_ENTRY
30+
static constexpr Builtin::Info BuiltinInfos[] = {
31+
#define GET_BUILTIN_INFOS
3432
#include "clang/Basic/BuiltinsSPIRV.inc"
35-
});
33+
#undef GET_BUILTIN_INFOS
34+
};
35+
static_assert(std::size(BuiltinInfos) == NumBuiltins);
3636

3737
llvm::SmallVector<Builtin::InfosShard>
3838
SPIRVTargetInfo::getTargetBuiltins() const {

clang/lib/Basic/Targets/X86.cpp

+23-28
Original file line numberDiff line numberDiff line change
@@ -31,36 +31,31 @@ static constexpr int NumX86_64Builtins =
3131
static constexpr int NumBuiltins = X86::LastTSBuiltin - Builtin::FirstTSBuiltin;
3232
static_assert(NumBuiltins == (NumX86Builtins + NumX86_64Builtins));
3333

34-
static constexpr llvm::StringTable BuiltinX86Strings =
35-
CLANG_BUILTIN_STR_TABLE_START
36-
#define BUILTIN CLANG_BUILTIN_STR_TABLE
37-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
38-
#define TARGET_HEADER_BUILTIN CLANG_TARGET_HEADER_BUILTIN_STR_TABLE
34+
namespace X86 {
35+
#define GET_BUILTIN_STR_TABLE
3936
#include "clang/Basic/BuiltinsX86.inc"
40-
;
37+
#undef GET_BUILTIN_STR_TABLE
4138

42-
static constexpr llvm::StringTable BuiltinX86_64Strings =
43-
CLANG_BUILTIN_STR_TABLE_START
44-
#define BUILTIN CLANG_BUILTIN_STR_TABLE
45-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
46-
#define TARGET_HEADER_BUILTIN CLANG_TARGET_HEADER_BUILTIN_STR_TABLE
47-
#include "clang/Basic/BuiltinsX86_64.inc"
48-
;
49-
50-
static constexpr auto BuiltinX86Infos = Builtin::MakeInfos<NumX86Builtins>({
51-
#define BUILTIN CLANG_BUILTIN_ENTRY
52-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
53-
#define TARGET_HEADER_BUILTIN CLANG_TARGET_HEADER_BUILTIN_ENTRY
39+
static constexpr Builtin::Info BuiltinInfos[] = {
40+
#define GET_BUILTIN_INFOS
5441
#include "clang/Basic/BuiltinsX86.inc"
55-
});
42+
#undef GET_BUILTIN_INFOS
43+
};
44+
static_assert(std::size(BuiltinInfos) == NumX86Builtins);
45+
} // namespace X86
5646

57-
static constexpr auto BuiltinX86_64Infos =
58-
Builtin::MakeInfos<NumX86_64Builtins>({
59-
#define BUILTIN CLANG_BUILTIN_ENTRY
60-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
61-
#define TARGET_HEADER_BUILTIN CLANG_TARGET_HEADER_BUILTIN_ENTRY
47+
namespace X86_64 {
48+
#define GET_BUILTIN_STR_TABLE
6249
#include "clang/Basic/BuiltinsX86_64.inc"
63-
});
50+
#undef GET_BUILTIN_STR_TABLE
51+
52+
static constexpr Builtin::Info BuiltinInfos[] = {
53+
#define GET_BUILTIN_INFOS
54+
#include "clang/Basic/BuiltinsX86_64.inc"
55+
#undef GET_BUILTIN_INFOS
56+
};
57+
static_assert(std::size(BuiltinInfos) == NumX86_64Builtins);
58+
} // namespace X86_64
6459

6560
static const char *const GCCRegNames[] = {
6661
"ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
@@ -1879,13 +1874,13 @@ ArrayRef<TargetInfo::AddlRegName> X86TargetInfo::getGCCAddlRegNames() const {
18791874

18801875
llvm::SmallVector<Builtin::InfosShard>
18811876
X86_32TargetInfo::getTargetBuiltins() const {
1882-
return {{&BuiltinX86Strings, BuiltinX86Infos}};
1877+
return {{&X86::BuiltinStrings, X86::BuiltinInfos}};
18831878
}
18841879

18851880
llvm::SmallVector<Builtin::InfosShard>
18861881
X86_64TargetInfo::getTargetBuiltins() const {
18871882
return {
1888-
{&BuiltinX86Strings, BuiltinX86Infos},
1889-
{&BuiltinX86_64Strings, BuiltinX86_64Infos},
1883+
{&X86::BuiltinStrings, X86::BuiltinInfos},
1884+
{&X86_64::BuiltinStrings, X86_64::BuiltinInfos},
18901885
};
18911886
}

clang/lib/Sema/SemaChecking.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -2451,7 +2451,6 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
24512451
CheckNonNullArgument(*this, TheCall->getArg(0), TheCall->getExprLoc());
24522452
break;
24532453
}
2454-
#define BUILTIN(ID, TYPE, ATTRS)
24552454
#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \
24562455
case Builtin::BI##ID: \
24572456
return AtomicOpsOverloaded(TheCallResult, AtomicExpr::AO##ID);

0 commit comments

Comments
 (0)