Skip to content

Commit 24510f5

Browse files
committed
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. This in turn shrinks the largest string table by a factor of two.
1 parent bf81122 commit 24510f5

File tree

7 files changed

+284
-135
lines changed

7 files changed

+284
-135
lines changed

clang/include/clang/Basic/BuiltinsNEON.def

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

clang/include/clang/Basic/TargetBuiltins.h

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,12 @@ 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
}
@@ -47,19 +50,26 @@ namespace clang {
4750
namespace SVE {
4851
enum {
4952
LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
50-
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
53+
#define GET_SVE_BUILTIN_ENUMERATORS
54+
#include "clang/Basic/arm_sve_builtins.inc"
55+
#undef GET_SVE_BUILTIN_ENUMERATORS
56+
FirstNeonBridgeBuiltin,
57+
LastSveBuiltin = FirstNeonBridgeBuiltin - 1,
58+
#define GET_SVE_BUILTINS
5159
#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID,
52-
#include "clang/Basic/BuiltinsSVE.def"
60+
#include "clang/Basic/BuiltinsAArch64NeonSVEBridge.def"
61+
#undef TARGET_BUILTIN
62+
#undef GET_SVE_BUILTINS
5363
FirstTSBuiltin,
5464
};
5565
}
5666

5767
namespace SME {
5868
enum {
5969
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"
70+
#define GET_SME_BUILTIN_ENUMERATORS
71+
#include "clang/Basic/arm_sme_builtins.inc"
72+
#undef GET_SME_BUILTIN_ENUMERATORS
6373
FirstTSBuiltin,
6474
};
6575
}

clang/lib/Basic/Targets/AArch64.cpp

Lines changed: 77 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,11 @@ 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},
774+
{&NEON::FP16::BuiltinStrings, NEON::FP16::BuiltinInfos},
775+
{&SVE::BuiltinStrings, SVE::BuiltinInfos},
776+
{&BuiltinSVENeonBridgeStrings, BuiltinSVENeonBridgeInfos},
777+
{&SME::BuiltinStrings, SME::BuiltinInfos},
738778
{&BuiltinAArch64Strings, BuiltinAArch64Infos},
739779
};
740780
}

clang/lib/Basic/Targets/ARM.cpp

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1071,26 +1071,50 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts,
10711071
}
10721072
}
10731073

1074-
static constexpr int NumBuiltins =
1075-
clang::ARM::LastTSBuiltin - Builtin::FirstTSBuiltin;
1074+
static constexpr int NumBuiltins = ARM::LastTSBuiltin - Builtin::FirstTSBuiltin;
1075+
static constexpr int NumNeonBuiltins =
1076+
NEON::FirstFp16Builtin - Builtin::FirstTSBuiltin;
1077+
static constexpr int NumFp16Builtins =
1078+
NEON::FirstTSBuiltin - NEON::FirstFp16Builtin;
1079+
static constexpr int NumARMBuiltins = ARM::LastTSBuiltin - NEON::FirstTSBuiltin;
1080+
static_assert(NumBuiltins ==
1081+
(NumNeonBuiltins + NumFp16Builtins + NumARMBuiltins));
1082+
1083+
namespace clang {
1084+
namespace NEON {
1085+
#define GET_NEON_BUILTIN_STR_TABLE
1086+
#include "clang/Basic/arm_neon.inc"
1087+
#undef GET_NEON_BUILTIN_STR_TABLE
1088+
1089+
static constexpr std::array<Builtin::Info, NumNeonBuiltins> BuiltinInfos = {
1090+
#define GET_NEON_BUILTIN_INFOS
1091+
#include "clang/Basic/arm_neon.inc"
1092+
#undef GET_NEON_BUILTIN_INFOS
1093+
};
1094+
1095+
namespace FP16 {
1096+
#define GET_NEON_BUILTIN_STR_TABLE
1097+
#include "clang/Basic/arm_fp16.inc"
1098+
#undef GET_NEON_BUILTIN_STR_TABLE
1099+
1100+
static constexpr std::array<Builtin::Info, NumFp16Builtins> BuiltinInfos = {
1101+
#define GET_NEON_BUILTIN_INFOS
1102+
#include "clang/Basic/arm_fp16.inc"
1103+
#undef GET_NEON_BUILTIN_INFOS
1104+
};
1105+
} // namespace FP16
1106+
} // namespace NEON
1107+
} // namespace clang
10761108

10771109
static constexpr llvm::StringTable BuiltinStrings =
10781110
CLANG_BUILTIN_STR_TABLE_START
1079-
#define BUILTIN CLANG_BUILTIN_STR_TABLE
1080-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
1081-
#include "clang/Basic/BuiltinsNEON.def"
1082-
10831111
#define BUILTIN CLANG_BUILTIN_STR_TABLE
10841112
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
10851113
#define TARGET_HEADER_BUILTIN CLANG_TARGET_HEADER_BUILTIN_STR_TABLE
10861114
#include "clang/Basic/BuiltinsARM.def"
1087-
;
1115+
; // namespace clang
10881116

1089-
static constexpr auto BuiltinInfos = Builtin::MakeInfos<NumBuiltins>({
1090-
#define BUILTIN CLANG_BUILTIN_ENTRY
1091-
#define LIBBUILTIN CLANG_LIBBUILTIN_ENTRY
1092-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
1093-
#include "clang/Basic/BuiltinsNEON.def"
1117+
static constexpr auto BuiltinInfos = Builtin::MakeInfos<NumARMBuiltins>({
10941118
#define BUILTIN CLANG_BUILTIN_ENTRY
10951119
#define LANGBUILTIN CLANG_LANGBUILTIN_ENTRY
10961120
#define LIBBUILTIN CLANG_LIBBUILTIN_ENTRY
@@ -1101,7 +1125,11 @@ static constexpr auto BuiltinInfos = Builtin::MakeInfos<NumBuiltins>({
11011125

11021126
llvm::SmallVector<Builtin::InfosShard>
11031127
ARMTargetInfo::getTargetBuiltins() const {
1104-
return {{&BuiltinStrings, BuiltinInfos}};
1128+
return {
1129+
{&NEON::BuiltinStrings, NEON::BuiltinInfos},
1130+
{&NEON::FP16::BuiltinStrings, NEON::FP16::BuiltinInfos},
1131+
{&BuiltinStrings, BuiltinInfos},
1132+
};
11051133
}
11061134

11071135
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
@@ -718,22 +718,18 @@ bool SemaARM::CheckNeonBuiltinFunctionCall(const TargetInfo &TI,
718718
unsigned BuiltinID,
719719
CallExpr *TheCall) {
720720
if (const FunctionDecl *FD = SemaRef.getCurFunctionDecl()) {
721+
std::optional<ArmStreamingType> BuiltinType;
721722

722723
switch (BuiltinID) {
723724
default:
724725
break;
725-
#define GET_NEON_BUILTINS
726-
#define TARGET_BUILTIN(id, ...) case NEON::BI##id:
727-
#define BUILTIN(id, ...) case NEON::BI##id:
726+
#define GET_NEON_STREAMING_COMPAT_FLAG
728727
#include "clang/Basic/arm_neon.inc"
729-
if (checkArmStreamingBuiltin(SemaRef, TheCall, FD, ArmNonStreaming,
730-
BuiltinID))
731-
return true;
732-
break;
733-
#undef TARGET_BUILTIN
734-
#undef BUILTIN
735-
#undef GET_NEON_BUILTINS
728+
#undef GET_NEON_STREAMING_COMPAT_FLAG
736729
}
730+
if (BuiltinType &&
731+
checkArmStreamingBuiltin(SemaRef, TheCall, FD, *BuiltinType, BuiltinID))
732+
return true;
737733
}
738734

739735
llvm::APSInt Result;

0 commit comments

Comments
 (0)