Skip to content

Commit 3be4621

Browse files
committed
[clang][AArch64] Don't define features macros when explicitly disabled
Currently, clang has a general issue where it may incorrectly define feature-specific macros(e.g., __ARM_FEATURE_CRC32) even when the corresponding features are explicitly disabled via -target-feature. This can lead to unexpected behavior in code that relies on these macros. This commit fixed the issue by adding a secondary check to confirm if the features are explicitly disabled in `-target-feature`.
1 parent 9cab82f commit 3be4621

File tree

2 files changed

+144
-63
lines changed

2 files changed

+144
-63
lines changed

clang/lib/Basic/Targets/AArch64.cpp

Lines changed: 108 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -914,6 +914,66 @@ void AArch64TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
914914

915915
bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
916916
DiagnosticsEngine &Diags) {
917+
// The first round, address the ARM version initially.
918+
for (const auto &Feature : Features) {
919+
// All predecessor archs are added but select the latest one for ArchKind.
920+
if (Feature == "+v8a" && ArchInfo->Version < llvm::AArch64::ARMV8A.Version)
921+
ArchInfo = &llvm::AArch64::ARMV8A;
922+
if (Feature == "+v8.1a" &&
923+
ArchInfo->Version < llvm::AArch64::ARMV8_1A.Version)
924+
ArchInfo = &llvm::AArch64::ARMV8_1A;
925+
if (Feature == "+v8.2a" &&
926+
ArchInfo->Version < llvm::AArch64::ARMV8_2A.Version)
927+
ArchInfo = &llvm::AArch64::ARMV8_2A;
928+
if (Feature == "+v8.3a" &&
929+
ArchInfo->Version < llvm::AArch64::ARMV8_3A.Version)
930+
ArchInfo = &llvm::AArch64::ARMV8_3A;
931+
if (Feature == "+v8.4a" &&
932+
ArchInfo->Version < llvm::AArch64::ARMV8_4A.Version)
933+
ArchInfo = &llvm::AArch64::ARMV8_4A;
934+
if (Feature == "+v8.5a" &&
935+
ArchInfo->Version < llvm::AArch64::ARMV8_5A.Version)
936+
ArchInfo = &llvm::AArch64::ARMV8_5A;
937+
if (Feature == "+v8.6a" &&
938+
ArchInfo->Version < llvm::AArch64::ARMV8_6A.Version)
939+
ArchInfo = &llvm::AArch64::ARMV8_6A;
940+
if (Feature == "+v8.7a" &&
941+
ArchInfo->Version < llvm::AArch64::ARMV8_7A.Version)
942+
ArchInfo = &llvm::AArch64::ARMV8_7A;
943+
if (Feature == "+v8.8a" &&
944+
ArchInfo->Version < llvm::AArch64::ARMV8_8A.Version)
945+
ArchInfo = &llvm::AArch64::ARMV8_8A;
946+
if (Feature == "+v8.9a" &&
947+
ArchInfo->Version < llvm::AArch64::ARMV8_9A.Version)
948+
ArchInfo = &llvm::AArch64::ARMV8_9A;
949+
if (Feature == "+v9a" && ArchInfo->Version < llvm::AArch64::ARMV9A.Version)
950+
ArchInfo = &llvm::AArch64::ARMV9A;
951+
if (Feature == "+v9.1a" &&
952+
ArchInfo->Version < llvm::AArch64::ARMV9_1A.Version)
953+
ArchInfo = &llvm::AArch64::ARMV9_1A;
954+
if (Feature == "+v9.2a" &&
955+
ArchInfo->Version < llvm::AArch64::ARMV9_2A.Version)
956+
ArchInfo = &llvm::AArch64::ARMV9_2A;
957+
if (Feature == "+v9.3a" &&
958+
ArchInfo->Version < llvm::AArch64::ARMV9_3A.Version)
959+
ArchInfo = &llvm::AArch64::ARMV9_3A;
960+
if (Feature == "+v9.4a" &&
961+
ArchInfo->Version < llvm::AArch64::ARMV9_4A.Version)
962+
ArchInfo = &llvm::AArch64::ARMV9_4A;
963+
if (Feature == "+v9.5a" &&
964+
ArchInfo->Version < llvm::AArch64::ARMV9_5A.Version)
965+
ArchInfo = &llvm::AArch64::ARMV9_5A;
966+
if (Feature == "+v9.6a" &&
967+
ArchInfo->Version < llvm::AArch64::ARMV9_6A.Version)
968+
ArchInfo = &llvm::AArch64::ARMV9_6A;
969+
if (Feature == "+v8r")
970+
ArchInfo = &llvm::AArch64::ARMV8R;
971+
}
972+
973+
setDataLayout();
974+
setArchFeatures();
975+
976+
// The second round, address each feature.
917977
for (const auto &Feature : Features) {
918978
if (Feature == "-fp-armv8")
919979
HasNoFP = true;
@@ -944,13 +1004,17 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
9441004
HasFullFP16 = true;
9451005
HasSVE2 = true;
9461006
}
1007+
if (Feature == "-sve2")
1008+
HasSVE2 = false;
9471009
if (Feature == "+sve2p1") {
9481010
FPU |= NeonMode;
9491011
FPU |= SveMode;
9501012
HasFullFP16 = true;
9511013
HasSVE2 = true;
9521014
HasSVE2p1 = true;
9531015
}
1016+
if (Feature == "-sve2p1")
1017+
HasSVE2p1 = false;
9541018
if (Feature == "+sve-aes") {
9551019
FPU |= NeonMode;
9561020
HasFullFP16 = true;
@@ -994,19 +1058,25 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
9941058
HasBFloat16 = true;
9951059
HasFullFP16 = true;
9961060
}
1061+
if (Feature == "-sme")
1062+
HasSME = false;
9971063
if (Feature == "+sme2") {
9981064
HasSME = true;
9991065
HasSME2 = true;
10001066
HasBFloat16 = true;
10011067
HasFullFP16 = true;
10021068
}
1069+
if (Feature == "-sme2")
1070+
HasSME2 = false;
10031071
if (Feature == "+sme2p1") {
10041072
HasSME = true;
10051073
HasSME2 = true;
10061074
HasSME2p1 = true;
10071075
HasBFloat16 = true;
10081076
HasFullFP16 = true;
10091077
}
1078+
if (Feature == "-sme2p1")
1079+
HasSME2p1 = false;
10101080
if (Feature == "+sme-f64f64") {
10111081
HasSME = true;
10121082
HasSMEF64F64 = true;
@@ -1043,20 +1113,34 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
10431113
}
10441114
if (Feature == "+sb")
10451115
HasSB = true;
1116+
if (Feature == "-sb")
1117+
HasSB = false;
10461118
if (Feature == "+predres")
10471119
HasPredRes = true;
1120+
if (Feature == "-predres")
1121+
HasPredRes = false;
10481122
if (Feature == "+ssbs")
10491123
HasSSBS = true;
1124+
if (Feature == "-ssbs")
1125+
HasSSBS = false;
10501126
if (Feature == "+bti")
10511127
HasBTI = true;
1128+
if (Feature == "-bti")
1129+
HasBTI = false;
10521130
if (Feature == "+wfxt")
10531131
HasWFxT = true;
1132+
if (Feature == "-wfxt")
1133+
HasWFxT = false;
10541134
if (Feature == "-fmv")
10551135
HasFMV = false;
10561136
if (Feature == "+crc")
10571137
HasCRC = true;
1138+
if (Feature == "-crc")
1139+
HasCRC = false;
10581140
if (Feature == "+rcpc")
10591141
HasRCPC = true;
1142+
if (Feature == "-rcpc")
1143+
HasRCPC = false;
10601144
if (Feature == "+aes") {
10611145
FPU |= NeonMode;
10621146
HasAES = true;
@@ -1074,83 +1158,45 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
10741158
FPU |= NeonMode;
10751159
HasRDM = true;
10761160
}
1161+
if (Feature == "-rdm")
1162+
HasRDM = false;
10771163
if (Feature == "+dit")
10781164
HasDIT = true;
1165+
if (Feature == "-dit")
1166+
HasDIT = false;
10791167
if (Feature == "+cccp")
10801168
HasCCPP = true;
1169+
if (Feature == "-cccp")
1170+
HasCCPP = false;
10811171
if (Feature == "+ccdp") {
10821172
HasCCPP = true;
10831173
HasCCDP = true;
10841174
}
1175+
if (Feature == "-ccdp")
1176+
HasCCDP = false;
10851177
if (Feature == "+fptoint")
10861178
HasFRInt3264 = true;
1179+
if (Feature == "-fptoint")
1180+
HasFRInt3264 = false;
10871181
if (Feature == "+sm4") {
10881182
FPU |= NeonMode;
10891183
HasSM4 = true;
10901184
}
10911185
if (Feature == "+strict-align")
10921186
HasUnalignedAccess = false;
10931187

1094-
// All predecessor archs are added but select the latest one for ArchKind.
1095-
if (Feature == "+v8a" && ArchInfo->Version < llvm::AArch64::ARMV8A.Version)
1096-
ArchInfo = &llvm::AArch64::ARMV8A;
1097-
if (Feature == "+v8.1a" &&
1098-
ArchInfo->Version < llvm::AArch64::ARMV8_1A.Version)
1099-
ArchInfo = &llvm::AArch64::ARMV8_1A;
1100-
if (Feature == "+v8.2a" &&
1101-
ArchInfo->Version < llvm::AArch64::ARMV8_2A.Version)
1102-
ArchInfo = &llvm::AArch64::ARMV8_2A;
1103-
if (Feature == "+v8.3a" &&
1104-
ArchInfo->Version < llvm::AArch64::ARMV8_3A.Version)
1105-
ArchInfo = &llvm::AArch64::ARMV8_3A;
1106-
if (Feature == "+v8.4a" &&
1107-
ArchInfo->Version < llvm::AArch64::ARMV8_4A.Version)
1108-
ArchInfo = &llvm::AArch64::ARMV8_4A;
1109-
if (Feature == "+v8.5a" &&
1110-
ArchInfo->Version < llvm::AArch64::ARMV8_5A.Version)
1111-
ArchInfo = &llvm::AArch64::ARMV8_5A;
1112-
if (Feature == "+v8.6a" &&
1113-
ArchInfo->Version < llvm::AArch64::ARMV8_6A.Version)
1114-
ArchInfo = &llvm::AArch64::ARMV8_6A;
1115-
if (Feature == "+v8.7a" &&
1116-
ArchInfo->Version < llvm::AArch64::ARMV8_7A.Version)
1117-
ArchInfo = &llvm::AArch64::ARMV8_7A;
1118-
if (Feature == "+v8.8a" &&
1119-
ArchInfo->Version < llvm::AArch64::ARMV8_8A.Version)
1120-
ArchInfo = &llvm::AArch64::ARMV8_8A;
1121-
if (Feature == "+v8.9a" &&
1122-
ArchInfo->Version < llvm::AArch64::ARMV8_9A.Version)
1123-
ArchInfo = &llvm::AArch64::ARMV8_9A;
1124-
if (Feature == "+v9a" && ArchInfo->Version < llvm::AArch64::ARMV9A.Version)
1125-
ArchInfo = &llvm::AArch64::ARMV9A;
1126-
if (Feature == "+v9.1a" &&
1127-
ArchInfo->Version < llvm::AArch64::ARMV9_1A.Version)
1128-
ArchInfo = &llvm::AArch64::ARMV9_1A;
1129-
if (Feature == "+v9.2a" &&
1130-
ArchInfo->Version < llvm::AArch64::ARMV9_2A.Version)
1131-
ArchInfo = &llvm::AArch64::ARMV9_2A;
1132-
if (Feature == "+v9.3a" &&
1133-
ArchInfo->Version < llvm::AArch64::ARMV9_3A.Version)
1134-
ArchInfo = &llvm::AArch64::ARMV9_3A;
1135-
if (Feature == "+v9.4a" &&
1136-
ArchInfo->Version < llvm::AArch64::ARMV9_4A.Version)
1137-
ArchInfo = &llvm::AArch64::ARMV9_4A;
1138-
if (Feature == "+v9.5a" &&
1139-
ArchInfo->Version < llvm::AArch64::ARMV9_5A.Version)
1140-
ArchInfo = &llvm::AArch64::ARMV9_5A;
1141-
if (Feature == "+v9.6a" &&
1142-
ArchInfo->Version < llvm::AArch64::ARMV9_6A.Version)
1143-
ArchInfo = &llvm::AArch64::ARMV9_6A;
1144-
if (Feature == "+v8r")
1145-
ArchInfo = &llvm::AArch64::ARMV8R;
11461188
if (Feature == "+fullfp16") {
11471189
FPU |= NeonMode;
11481190
HasFullFP16 = true;
11491191
}
1192+
if (Feature == "-fullfp16")
1193+
HasFullFP16 = false;
11501194
if (Feature == "+dotprod") {
11511195
FPU |= NeonMode;
11521196
HasDotProd = true;
11531197
}
1198+
if (Feature == "-dotprod")
1199+
HasDotProd = false;
11541200
if (Feature == "+fp16fml") {
11551201
FPU |= NeonMode;
11561202
HasFullFP16 = true;
@@ -1164,20 +1210,30 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
11641210
HasPAuth = true;
11651211
if (Feature == "+i8mm")
11661212
HasMatMul = true;
1213+
if (Feature == "-i8mm")
1214+
HasMatMul = false;
11671215
if (Feature == "+bf16")
11681216
HasBFloat16 = true;
1217+
if (Feature == "-bf16")
1218+
HasBFloat16 = false;
11691219
if (Feature == "+lse")
11701220
HasLSE = true;
1221+
if (Feature == "-lse")
1222+
HasLSE = false;
11711223
if (Feature == "+ls64")
11721224
HasLS64 = true;
11731225
if (Feature == "+rand")
11741226
HasRandGen = true;
11751227
if (Feature == "+flagm")
11761228
HasFlagM = true;
1229+
if (Feature == "-flagm")
1230+
HasFlagM = false;
11771231
if (Feature == "+altnzcv") {
11781232
HasFlagM = true;
11791233
HasAlternativeNZCV = true;
11801234
}
1235+
if (Feature == "-altnzcv")
1236+
HasAlternativeNZCV = false;
11811237
if (Feature == "+mops")
11821238
HasMOPS = true;
11831239
if (Feature == "+d128")
@@ -1192,17 +1248,6 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
11921248
}
11931249
}
11941250

1195-
// Check features that are manually disabled by command line options.
1196-
// This needs to be checked after architecture-related features are handled,
1197-
// making sure they are properly disabled when required.
1198-
for (const auto &Feature : Features) {
1199-
if (Feature == "-d128")
1200-
HasD128 = false;
1201-
}
1202-
1203-
setDataLayout();
1204-
setArchFeatures();
1205-
12061251
if (HasNoFP) {
12071252
FPU &= ~FPUMode;
12081253
FPU &= ~NeonMode;

0 commit comments

Comments
 (0)