Skip to content

Commit 4ef9cea

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 f0befb3 commit 4ef9cea

File tree

9 files changed

+387
-170
lines changed

9 files changed

+387
-170
lines changed

clang/include/clang/Basic/BuiltinsARM.def

Lines changed: 0 additions & 7 deletions
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

Lines changed: 0 additions & 22 deletions
This file was deleted.

clang/include/clang/Basic/TargetBuiltins.h

Lines changed: 33 additions & 13 deletions
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

Lines changed: 78 additions & 37 deletions
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

Lines changed: 75 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1072,26 +1072,81 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts,
10721072
}
10731073
}
10741074

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

10781141
static constexpr llvm::StringTable BuiltinStrings =
10791142
CLANG_BUILTIN_STR_TABLE_START
1080-
#define BUILTIN CLANG_BUILTIN_STR_TABLE
1081-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
1082-
#include "clang/Basic/BuiltinsNEON.def"
1083-
10841143
#define BUILTIN CLANG_BUILTIN_STR_TABLE
10851144
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
10861145
#define TARGET_HEADER_BUILTIN CLANG_TARGET_HEADER_BUILTIN_STR_TABLE
10871146
#include "clang/Basic/BuiltinsARM.def"
1088-
;
1147+
; // namespace clang
10891148

1090-
static constexpr auto BuiltinInfos = Builtin::MakeInfos<NumBuiltins>({
1091-
#define BUILTIN CLANG_BUILTIN_ENTRY
1092-
#define LIBBUILTIN CLANG_LIBBUILTIN_ENTRY
1093-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
1094-
#include "clang/Basic/BuiltinsNEON.def"
1149+
static constexpr auto BuiltinInfos = Builtin::MakeInfos<NumARMBuiltins>({
10951150
#define BUILTIN CLANG_BUILTIN_ENTRY
10961151
#define LANGBUILTIN CLANG_LANGBUILTIN_ENTRY
10971152
#define LIBBUILTIN CLANG_LIBBUILTIN_ENTRY
@@ -1102,7 +1157,14 @@ static constexpr auto BuiltinInfos = Builtin::MakeInfos<NumBuiltins>({
11021157

11031158
llvm::SmallVector<Builtin::InfosShard>
11041159
ARMTargetInfo::getTargetBuiltins() const {
1105-
return {{&BuiltinStrings, BuiltinInfos}};
1160+
return {
1161+
{&NEON::BuiltinStrings, NEON::BuiltinInfos, "__builtin_neon_"},
1162+
{&NEON::FP16::BuiltinStrings, NEON::FP16::BuiltinInfos,
1163+
"__builtin_neon_"},
1164+
{&MVE::BuiltinStrings, MVE::BuiltinInfos, "__builtin_arm_mve_"},
1165+
{&CDE::BuiltinStrings, CDE::BuiltinInfos, "__builtin_arm_cde_"},
1166+
{&BuiltinStrings, BuiltinInfos},
1167+
};
11061168
}
11071169

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

clang/lib/Sema/SemaARM.cpp

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -720,22 +720,18 @@ bool SemaARM::CheckNeonBuiltinFunctionCall(const TargetInfo &TI,
720720
unsigned BuiltinID,
721721
CallExpr *TheCall) {
722722
if (const FunctionDecl *FD = SemaRef.getCurFunctionDecl()) {
723+
std::optional<ArmStreamingType> BuiltinType;
723724

724725
switch (BuiltinID) {
725726
default:
726727
break;
727-
#define GET_NEON_BUILTINS
728-
#define TARGET_BUILTIN(id, ...) case NEON::BI##id:
729-
#define BUILTIN(id, ...) case NEON::BI##id:
728+
#define GET_NEON_STREAMING_COMPAT_FLAG
730729
#include "clang/Basic/arm_neon.inc"
731-
if (checkArmStreamingBuiltin(SemaRef, TheCall, FD, ArmNonStreaming,
732-
BuiltinID))
733-
return true;
734-
break;
735-
#undef TARGET_BUILTIN
736-
#undef BUILTIN
737-
#undef GET_NEON_BUILTINS
730+
#undef GET_NEON_STREAMING_COMPAT_FLAG
738731
}
732+
if (BuiltinType &&
733+
checkArmStreamingBuiltin(SemaRef, TheCall, FD, *BuiltinType, BuiltinID))
734+
return true;
739735
}
740736

741737
llvm::APSInt Result;

0 commit comments

Comments
 (0)