Skip to content

Commit 64ea3f5

Browse files
committed
[StrTable] Switch AArch64 and ARM to use directly TableGen-ed builtin tables
This leverages the sharded structure of the builtins to make it easy to directly tablegen most of the AArch64 and ARM builtins while still using X-macros for a few edge cases. It also extracts common prefixes as part of that. This makes the string tables for these targets dramatically smaller. This is especially important as the SVE builtins represent (by far) the largest string table and largest builtin table across all the targets in Clang.
1 parent 1cb979f commit 64ea3f5

File tree

9 files changed

+387
-170
lines changed

9 files changed

+387
-170
lines changed

clang/include/clang/Basic/BuiltinsARM.def

-7
Original file line numberDiff line numberDiff line change
@@ -206,13 +206,6 @@ BUILTIN(__builtin_arm_wsrp, "vcC*vC*", "nc")
206206
// Misc
207207
BUILTIN(__builtin_sponentry, "v*", "c")
208208

209-
// Builtins for implementing ACLE MVE intrinsics. (Unlike NEON, these
210-
// don't need to live in a separate BuiltinsMVE.def, because they
211-
// aren't included from both here and BuiltinsAArch64.def.)
212-
#include "clang/Basic/arm_mve_builtins.inc"
213-
214-
#include "clang/Basic/arm_cde_builtins.inc"
215-
216209
// MSVC
217210
LANGBUILTIN(__emit, "vIUiC", "", ALL_MS_LANGUAGES)
218211

clang/include/clang/Basic/BuiltinsNEON.def

-22
This file was deleted.

clang/include/clang/Basic/TargetBuiltins.h

+33-13
Original file line numberDiff line numberDiff line change
@@ -26,40 +26,60 @@ namespace clang {
2626
namespace NEON {
2727
enum {
2828
LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
29-
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
30-
#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID,
31-
#include "clang/Basic/BuiltinsNEON.def"
29+
#define GET_NEON_BUILTIN_ENUMERATORS
30+
#include "clang/Basic/arm_neon.inc"
31+
FirstFp16Builtin,
32+
LastNeonBuiltin = FirstFp16Builtin - 1,
33+
#include "clang/Basic/arm_fp16.inc"
34+
#undef GET_NEON_BUILTIN_ENUMERATORS
3235
FirstTSBuiltin
3336
};
3437
}
3538

3639
/// ARM builtins
3740
namespace ARM {
38-
enum {
39-
LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
40-
LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
41+
enum {
42+
LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
43+
LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
44+
#define GET_MVE_BUILTIN_ENUMERATORS
45+
#include "clang/Basic/arm_mve_builtins.inc"
46+
#undef GET_MVE_BUILTIN_ENUMERATORS
47+
FirstCDEBuiltin,
48+
LastMVEBuiltin = FirstCDEBuiltin - 1,
49+
#define GET_CDE_BUILTIN_ENUMERATORS
50+
#include "clang/Basic/arm_cde_builtins.inc"
51+
#undef GET_CDE_BUILTIN_ENUMERATORS
52+
FirstARMBuiltin,
53+
LastCDEBuiltin = FirstARMBuiltin - 1,
4154
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
4255
#include "clang/Basic/BuiltinsARM.def"
43-
LastTSBuiltin
44-
};
56+
LastTSBuiltin
57+
};
4558
}
4659

4760
namespace SVE {
4861
enum {
4962
LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
50-
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
63+
#define GET_SVE_BUILTIN_ENUMERATORS
64+
#include "clang/Basic/arm_sve_builtins.inc"
65+
#undef GET_SVE_BUILTIN_ENUMERATORS
66+
FirstNeonBridgeBuiltin,
67+
LastSveBuiltin = FirstNeonBridgeBuiltin - 1,
68+
#define GET_SVE_BUILTINS
5169
#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID,
52-
#include "clang/Basic/BuiltinsSVE.def"
70+
#include "clang/Basic/BuiltinsAArch64NeonSVEBridge.def"
71+
#undef TARGET_BUILTIN
72+
#undef GET_SVE_BUILTINS
5373
FirstTSBuiltin,
5474
};
5575
}
5676

5777
namespace SME {
5878
enum {
5979
LastSVEBuiltin = SVE::FirstTSBuiltin - 1,
60-
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
61-
#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID,
62-
#include "clang/Basic/BuiltinsSME.def"
80+
#define GET_SME_BUILTIN_ENUMERATORS
81+
#include "clang/Basic/arm_sme_builtins.inc"
82+
#undef GET_SME_BUILTIN_ENUMERATORS
6383
FirstTSBuiltin,
6484
};
6585
}

clang/lib/Basic/Targets/AArch64.cpp

+78-37
Original file line numberDiff line numberDiff line change
@@ -26,35 +26,80 @@
2626
using namespace clang;
2727
using namespace clang::targets;
2828

29-
static constexpr int NumNEONBuiltins =
30-
NEON::FirstTSBuiltin - Builtin::FirstTSBuiltin;
29+
static constexpr int NumNeonBuiltins =
30+
NEON::FirstFp16Builtin - Builtin::FirstTSBuiltin;
31+
static constexpr int NumFp16Builtins =
32+
NEON::FirstTSBuiltin - NEON::FirstFp16Builtin;
3133
static constexpr int NumSVEBuiltins =
32-
SVE::FirstTSBuiltin - NEON::FirstTSBuiltin;
34+
SVE::FirstNeonBridgeBuiltin - NEON::FirstTSBuiltin;
35+
static constexpr int NumSVENeonBridgeBuiltins =
36+
SVE::FirstTSBuiltin - SVE::FirstNeonBridgeBuiltin;
3337
static constexpr int NumSMEBuiltins = SME::FirstTSBuiltin - SVE::FirstTSBuiltin;
3438
static constexpr int NumAArch64Builtins =
3539
AArch64::LastTSBuiltin - SME::FirstTSBuiltin;
3640
static constexpr int NumBuiltins =
3741
AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
38-
static_assert(NumBuiltins == (NumNEONBuiltins + NumSVEBuiltins +
39-
NumSMEBuiltins + NumAArch64Builtins));
42+
static_assert(NumBuiltins ==
43+
(NumNeonBuiltins + NumFp16Builtins + NumSVEBuiltins +
44+
NumSVENeonBridgeBuiltins + NumSMEBuiltins + NumAArch64Builtins));
45+
46+
namespace clang {
47+
namespace NEON {
48+
#define GET_NEON_BUILTIN_STR_TABLE
49+
#include "clang/Basic/arm_neon.inc"
50+
#undef GET_NEON_BUILTIN_STR_TABLE
51+
52+
static constexpr std::array<Builtin::Info, NumNeonBuiltins> BuiltinInfos = {
53+
#define GET_NEON_BUILTIN_INFOS
54+
#include "clang/Basic/arm_neon.inc"
55+
#undef GET_NEON_BUILTIN_INFOS
56+
};
4057

41-
static constexpr llvm::StringTable BuiltinNEONStrings =
42-
CLANG_BUILTIN_STR_TABLE_START
43-
#define BUILTIN CLANG_BUILTIN_STR_TABLE
44-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
45-
#include "clang/Basic/BuiltinsNEON.def"
46-
;
47-
static constexpr llvm::StringTable BuiltinSVEStrings =
48-
CLANG_BUILTIN_STR_TABLE_START
49-
#define BUILTIN CLANG_BUILTIN_STR_TABLE
50-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
51-
#include "clang/Basic/BuiltinsSVE.def"
52-
;
53-
static constexpr llvm::StringTable BuiltinSMEStrings =
58+
namespace FP16 {
59+
#define GET_NEON_BUILTIN_STR_TABLE
60+
#include "clang/Basic/arm_fp16.inc"
61+
#undef GET_NEON_BUILTIN_STR_TABLE
62+
63+
static constexpr std::array<Builtin::Info, NumFp16Builtins> BuiltinInfos = {
64+
#define GET_NEON_BUILTIN_INFOS
65+
#include "clang/Basic/arm_fp16.inc"
66+
#undef GET_NEON_BUILTIN_INFOS
67+
};
68+
} // namespace FP16
69+
} // namespace NEON
70+
71+
namespace SVE {
72+
#define GET_SVE_BUILTIN_STR_TABLE
73+
#include "clang/Basic/arm_sve_builtins.inc"
74+
#undef GET_SVE_BUILTIN_STR_TABLE
75+
76+
static constexpr std::array<Builtin::Info, NumSVEBuiltins> BuiltinInfos = {
77+
#define GET_SVE_BUILTIN_INFOS
78+
#include "clang/Basic/arm_sve_builtins.inc"
79+
#undef GET_SVE_BUILTIN_INFOS
80+
};
81+
} // namespace SVE
82+
83+
namespace SME {
84+
#define GET_SME_BUILTIN_STR_TABLE
85+
#include "clang/Basic/arm_sme_builtins.inc"
86+
#undef GET_SME_BUILTIN_STR_TABLE
87+
88+
static constexpr std::array<Builtin::Info, NumSMEBuiltins> BuiltinInfos = {
89+
#define GET_SME_BUILTIN_INFOS
90+
#include "clang/Basic/arm_sme_builtins.inc"
91+
#undef GET_SME_BUILTIN_INFOS
92+
};
93+
} // namespace SME
94+
} // namespace clang
95+
96+
static constexpr llvm::StringTable BuiltinSVENeonBridgeStrings =
5497
CLANG_BUILTIN_STR_TABLE_START
55-
#define BUILTIN CLANG_BUILTIN_STR_TABLE
5698
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
57-
#include "clang/Basic/BuiltinsSME.def"
99+
#define GET_SVE_BUILTINS
100+
#include "clang/Basic/BuiltinsAArch64NeonSVEBridge.def"
101+
#undef GET_SVE_BUILTINS
102+
#undef TARGET_BUILTIN
58103
;
59104
static constexpr llvm::StringTable BuiltinAArch64Strings =
60105
CLANG_BUILTIN_STR_TABLE_START
@@ -64,21 +109,14 @@ static constexpr llvm::StringTable BuiltinAArch64Strings =
64109
#include "clang/Basic/BuiltinsAArch64.def"
65110
;
66111

67-
static constexpr auto BuiltinNEONInfos = Builtin::MakeInfos<NumNEONBuiltins>({
68-
#define BUILTIN CLANG_BUILTIN_ENTRY
112+
static constexpr auto BuiltinSVENeonBridgeInfos =
113+
Builtin::MakeInfos<NumSVENeonBridgeBuiltins>({
69114
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
70-
#include "clang/Basic/BuiltinsNEON.def"
71-
});
72-
static constexpr auto BuiltinSVEInfos = Builtin::MakeInfos<NumSVEBuiltins>({
73-
#define BUILTIN CLANG_BUILTIN_ENTRY
74-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
75-
#include "clang/Basic/BuiltinsSVE.def"
76-
});
77-
static constexpr auto BuiltinSMEInfos = Builtin::MakeInfos<NumSMEBuiltins>({
78-
#define BUILTIN CLANG_BUILTIN_ENTRY
79-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
80-
#include "clang/Basic/BuiltinsSME.def"
81-
});
115+
#define GET_SVE_BUILTINS
116+
#include "clang/Basic/BuiltinsAArch64NeonSVEBridge.def"
117+
#undef GET_SVE_BUILTINS
118+
#undef TARGET_BUILTIN
119+
});
82120
static constexpr auto BuiltinAArch64Infos =
83121
Builtin::MakeInfos<NumAArch64Builtins>({
84122
#define BUILTIN CLANG_BUILTIN_ENTRY
@@ -732,9 +770,12 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts,
732770
llvm::SmallVector<Builtin::InfosShard>
733771
AArch64TargetInfo::getTargetBuiltins() const {
734772
return {
735-
{&BuiltinNEONStrings, BuiltinNEONInfos},
736-
{&BuiltinSVEStrings, BuiltinSVEInfos},
737-
{&BuiltinSMEStrings, BuiltinSMEInfos},
773+
{&NEON::BuiltinStrings, NEON::BuiltinInfos, "__builtin_neon_"},
774+
{&NEON::FP16::BuiltinStrings, NEON::FP16::BuiltinInfos,
775+
"__builtin_neon_"},
776+
{&SVE::BuiltinStrings, SVE::BuiltinInfos, "__builtin_sve_"},
777+
{&BuiltinSVENeonBridgeStrings, BuiltinSVENeonBridgeInfos},
778+
{&SME::BuiltinStrings, SME::BuiltinInfos, "__builtin_sme_"},
738779
{&BuiltinAArch64Strings, BuiltinAArch64Infos},
739780
};
740781
}

clang/lib/Basic/Targets/ARM.cpp

+75-13
Original file line numberDiff line numberDiff line change
@@ -1074,26 +1074,81 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts,
10741074
}
10751075
}
10761076

1077-
static constexpr int NumBuiltins =
1078-
clang::ARM::LastTSBuiltin - Builtin::FirstTSBuiltin;
1077+
static constexpr int NumBuiltins = ARM::LastTSBuiltin - Builtin::FirstTSBuiltin;
1078+
static constexpr int NumNeonBuiltins =
1079+
NEON::FirstFp16Builtin - Builtin::FirstTSBuiltin;
1080+
static constexpr int NumFp16Builtins =
1081+
NEON::FirstTSBuiltin - NEON::FirstFp16Builtin;
1082+
static constexpr int NumMVEBuiltins =
1083+
ARM::FirstCDEBuiltin - NEON::FirstTSBuiltin;
1084+
static constexpr int NumCDEBuiltins =
1085+
ARM::FirstARMBuiltin - ARM::FirstCDEBuiltin;
1086+
static constexpr int NumARMBuiltins = ARM::LastTSBuiltin - ARM::FirstARMBuiltin;
1087+
static_assert(NumBuiltins ==
1088+
(NumNeonBuiltins + NumFp16Builtins + NumMVEBuiltins +
1089+
NumCDEBuiltins + NumARMBuiltins));
1090+
1091+
namespace clang {
1092+
namespace NEON {
1093+
#define GET_NEON_BUILTIN_STR_TABLE
1094+
#include "clang/Basic/arm_neon.inc"
1095+
#undef GET_NEON_BUILTIN_STR_TABLE
1096+
1097+
static constexpr std::array<Builtin::Info, NumNeonBuiltins> BuiltinInfos = {
1098+
#define GET_NEON_BUILTIN_INFOS
1099+
#include "clang/Basic/arm_neon.inc"
1100+
#undef GET_NEON_BUILTIN_INFOS
1101+
};
1102+
1103+
namespace FP16 {
1104+
#define GET_NEON_BUILTIN_STR_TABLE
1105+
#include "clang/Basic/arm_fp16.inc"
1106+
#undef GET_NEON_BUILTIN_STR_TABLE
1107+
1108+
static constexpr std::array<Builtin::Info, NumFp16Builtins> BuiltinInfos = {
1109+
#define GET_NEON_BUILTIN_INFOS
1110+
#include "clang/Basic/arm_fp16.inc"
1111+
#undef GET_NEON_BUILTIN_INFOS
1112+
};
1113+
} // namespace FP16
1114+
} // namespace NEON
1115+
} // namespace clang
1116+
1117+
namespace {
1118+
namespace MVE {
1119+
#define GET_MVE_BUILTIN_STR_TABLE
1120+
#include "clang/Basic/arm_mve_builtins.inc"
1121+
#undef GET_MVE_BUILTIN_STR_TABLE
1122+
1123+
static constexpr std::array<Builtin::Info, NumMVEBuiltins> BuiltinInfos = {
1124+
#define GET_MVE_BUILTIN_INFOS
1125+
#include "clang/Basic/arm_mve_builtins.inc"
1126+
#undef GET_MVE_BUILTIN_INFOS
1127+
};
1128+
} // namespace MVE
1129+
1130+
namespace CDE {
1131+
#define GET_CDE_BUILTIN_STR_TABLE
1132+
#include "clang/Basic/arm_cde_builtins.inc"
1133+
#undef GET_CDE_BUILTIN_STR_TABLE
1134+
1135+
static constexpr std::array<Builtin::Info, NumCDEBuiltins> BuiltinInfos = {
1136+
#define GET_CDE_BUILTIN_INFOS
1137+
#include "clang/Basic/arm_cde_builtins.inc"
1138+
#undef GET_CDE_BUILTIN_INFOS
1139+
};
1140+
} // namespace CDE
1141+
} // namespace
10791142

10801143
static constexpr llvm::StringTable BuiltinStrings =
10811144
CLANG_BUILTIN_STR_TABLE_START
1082-
#define BUILTIN CLANG_BUILTIN_STR_TABLE
1083-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
1084-
#include "clang/Basic/BuiltinsNEON.def"
1085-
10861145
#define BUILTIN CLANG_BUILTIN_STR_TABLE
10871146
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
10881147
#define TARGET_HEADER_BUILTIN CLANG_TARGET_HEADER_BUILTIN_STR_TABLE
10891148
#include "clang/Basic/BuiltinsARM.def"
1090-
;
1149+
; // namespace clang
10911150

1092-
static constexpr auto BuiltinInfos = Builtin::MakeInfos<NumBuiltins>({
1093-
#define BUILTIN CLANG_BUILTIN_ENTRY
1094-
#define LIBBUILTIN CLANG_LIBBUILTIN_ENTRY
1095-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
1096-
#include "clang/Basic/BuiltinsNEON.def"
1151+
static constexpr auto BuiltinInfos = Builtin::MakeInfos<NumARMBuiltins>({
10971152
#define BUILTIN CLANG_BUILTIN_ENTRY
10981153
#define LANGBUILTIN CLANG_LANGBUILTIN_ENTRY
10991154
#define LIBBUILTIN CLANG_LIBBUILTIN_ENTRY
@@ -1104,7 +1159,14 @@ static constexpr auto BuiltinInfos = Builtin::MakeInfos<NumBuiltins>({
11041159

11051160
llvm::SmallVector<Builtin::InfosShard>
11061161
ARMTargetInfo::getTargetBuiltins() const {
1107-
return {{&BuiltinStrings, BuiltinInfos}};
1162+
return {
1163+
{&NEON::BuiltinStrings, NEON::BuiltinInfos, "__builtin_neon_"},
1164+
{&NEON::FP16::BuiltinStrings, NEON::FP16::BuiltinInfos,
1165+
"__builtin_neon_"},
1166+
{&MVE::BuiltinStrings, MVE::BuiltinInfos, "__builtin_arm_mve_"},
1167+
{&CDE::BuiltinStrings, CDE::BuiltinInfos, "__builtin_arm_cde_"},
1168+
{&BuiltinStrings, BuiltinInfos},
1169+
};
11081170
}
11091171

11101172
bool ARMTargetInfo::isCLZForZeroUndef() const { return false; }

clang/lib/Sema/SemaARM.cpp

+6-10
Original file line numberDiff line numberDiff line change
@@ -709,22 +709,18 @@ bool SemaARM::CheckNeonBuiltinFunctionCall(const TargetInfo &TI,
709709
CallExpr *TheCall) {
710710
if (const FunctionDecl *FD =
711711
SemaRef.getCurFunctionDecl(/*AllowLambda=*/true)) {
712+
std::optional<ArmStreamingType> BuiltinType;
712713

713714
switch (BuiltinID) {
714715
default:
715716
break;
716-
#define GET_NEON_BUILTINS
717-
#define TARGET_BUILTIN(id, ...) case NEON::BI##id:
718-
#define BUILTIN(id, ...) case NEON::BI##id:
717+
#define GET_NEON_STREAMING_COMPAT_FLAG
719718
#include "clang/Basic/arm_neon.inc"
720-
if (checkArmStreamingBuiltin(SemaRef, TheCall, FD, ArmNonStreaming,
721-
BuiltinID))
722-
return true;
723-
break;
724-
#undef TARGET_BUILTIN
725-
#undef BUILTIN
726-
#undef GET_NEON_BUILTINS
719+
#undef GET_NEON_STREAMING_COMPAT_FLAG
727720
}
721+
if (BuiltinType &&
722+
checkArmStreamingBuiltin(SemaRef, TheCall, FD, *BuiltinType, BuiltinID))
723+
return true;
728724
}
729725

730726
llvm::APSInt Result;

0 commit comments

Comments
 (0)