Skip to content

Commit 185b1df

Browse files
authored
[X86][AArch64][PowerPC] __builtin_cpu_supports accepts unknown options. (#83515)
The patch fixes #83407 modifing __builtin_cpu_supports behaviour so that it returns false if unsupported features names provided in parameter and issue a warning. __builtin_cpu_supports is target independent, but currently supported by X86, AArch64 and PowerPC only.
1 parent 195744c commit 185b1df

File tree

7 files changed

+30
-14
lines changed

7 files changed

+30
-14
lines changed

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -765,7 +765,7 @@ def err_builtin_redeclare : Error<"cannot redeclare builtin function %0">;
765765
def err_arm_invalid_specialreg : Error<"invalid special register for builtin">;
766766
def err_arm_invalid_coproc : Error<"coprocessor %0 must be configured as "
767767
"%select{GCP|CDE}1">;
768-
def err_invalid_cpu_supports : Error<"invalid cpu feature string for builtin">;
768+
def warn_invalid_cpu_supports : Warning<"invalid cpu feature string for builtin">;
769769
def err_invalid_cpu_is : Error<"invalid cpu name for builtin">;
770770
def err_invalid_cpu_specific_dispatch_value : Error<
771771
"invalid option '%0' for %select{cpu_specific|cpu_dispatch}1">;

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13952,6 +13952,8 @@ Value *CodeGenFunction::EmitX86CpuIs(StringRef CPUStr) {
1395213952
Value *CodeGenFunction::EmitX86CpuSupports(const CallExpr *E) {
1395313953
const Expr *FeatureExpr = E->getArg(0)->IgnoreParenCasts();
1395413954
StringRef FeatureStr = cast<StringLiteral>(FeatureExpr)->getString();
13955+
if (!getContext().getTargetInfo().validateCpuSupports(FeatureStr))
13956+
return Builder.getFalse();
1395513957
return EmitX86CpuSupports(FeatureStr);
1395613958
}
1395713959

@@ -14041,6 +14043,8 @@ Value *CodeGenFunction::EmitAArch64CpuSupports(const CallExpr *E) {
1404114043
ArgStr.split(Features, "+");
1404214044
for (auto &Feature : Features) {
1404314045
Feature = Feature.trim();
14046+
if (!llvm::AArch64::parseArchExtension(Feature))
14047+
return Builder.getFalse();
1404414048
if (Feature != "default")
1404514049
Features.push_back(Feature);
1404614050
}
@@ -16639,7 +16643,8 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
1663916643
.Case(Name, {FA_WORD, Bitmask})
1664016644
#include "llvm/TargetParser/PPCTargetParser.def"
1664116645
.Default({0, 0});
16642-
assert(BitMask && "Invalid target feature string. Missed by SemaChecking?");
16646+
if (!BitMask)
16647+
return Builder.getFalse();
1664316648
Value *Op0 = llvm::ConstantInt::get(Int32Ty, FeatureWord);
1664416649
llvm::Function *F = CGM.getIntrinsic(Intrinsic::ppc_fixed_addr_ld);
1664516650
Value *TheCall = Builder.CreateCall(F, {Op0}, "cpu_supports");

clang/lib/Sema/SemaChecking.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2180,9 +2180,11 @@ static bool SemaBuiltinCpu(Sema &S, const TargetInfo &TI, CallExpr *TheCall,
21802180

21812181
// Check the contents of the string.
21822182
StringRef Feature = cast<StringLiteral>(Arg)->getString();
2183-
if (IsCPUSupports && !TheTI->validateCpuSupports(Feature))
2184-
return S.Diag(TheCall->getBeginLoc(), diag::err_invalid_cpu_supports)
2185-
<< Arg->getSourceRange();
2183+
if (IsCPUSupports && !TheTI->validateCpuSupports(Feature)) {
2184+
S.Diag(TheCall->getBeginLoc(), diag::warn_invalid_cpu_supports)
2185+
<< Arg->getSourceRange();
2186+
return false;
2187+
}
21862188
if (!IsCPUSupports && !TheTI->validateCpuIs(Feature))
21872189
return S.Diag(TheCall->getBeginLoc(), diag::err_invalid_cpu_is)
21882190
<< Arg->getSourceRange();

clang/test/CodeGen/aarch64-cpu-supports.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@
3434
// CHECK-NEXT: store i32 3, ptr [[RETVAL]], align 4
3535
// CHECK-NEXT: br label [[RETURN]]
3636
// CHECK: if.end4:
37+
// CHECK-NEXT: br i1 false, label [[IF_THEN5:%.*]], label [[IF_END6:%.*]]
38+
// CHECK: if.then5:
39+
// CHECK-NEXT: store i32 4, ptr [[RETVAL]], align 4
40+
// CHECK-NEXT: br label [[RETURN]]
41+
// CHECK: if.end6:
3742
// CHECK-NEXT: store i32 0, ptr [[RETVAL]], align 4
3843
// CHECK-NEXT: br label [[RETURN]]
3944
// CHECK: return:
@@ -50,5 +55,8 @@ int main(void) {
5055
if (__builtin_cpu_supports("sme2+ls64_v+wfxt"))
5156
return 3;
5257

58+
if (__builtin_cpu_supports("avx2"))
59+
return 4;
60+
5361
return 0;
5462
}

clang/test/Misc/warning-flags.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ This test serves two purposes:
1818

1919
The list of warnings below should NEVER grow. It should gradually shrink to 0.
2020

21-
CHECK: Warnings without flags (66):
21+
CHECK: Warnings without flags (67):
2222

2323
CHECK-NEXT: ext_expected_semi_decl_list
2424
CHECK-NEXT: ext_explicit_specialization_storage_class
@@ -58,6 +58,7 @@ CHECK-NEXT: warn_ignoring_ftabstop_value
5858
CHECK-NEXT: warn_implements_nscopying
5959
CHECK-NEXT: warn_incompatible_qualified_id
6060
CHECK-NEXT: warn_invalid_asm_cast_lvalue
61+
CHECK-NEXT: warn_invalid_cpu_supports
6162
CHECK-NEXT: warn_maynot_respond
6263
CHECK-NEXT: warn_method_param_redefinition
6364
CHECK-NEXT: warn_missing_case_for_condition

clang/test/Sema/aarch64-cpu-supports.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@ int test_aarch64_features(void) {
55
// expected-error@+1 {{expression is not a string literal}}
66
if (__builtin_cpu_supports(ssbs2))
77
return 1;
8-
// expected-error@+1 {{invalid cpu feature string}}
8+
// expected-warning@+1 {{invalid cpu feature string}}
99
if (__builtin_cpu_supports(""))
1010
return 2;
11-
// expected-error@+1 {{invalid cpu feature string}}
11+
// expected-warning@+1 {{invalid cpu feature string}}
1212
if (__builtin_cpu_supports("pmull128"))
1313
return 3;
14-
// expected-error@+1 {{invalid cpu feature string}}
14+
// expected-warning@+1 {{invalid cpu feature string}}
1515
if (__builtin_cpu_supports("sve2,rpres"))
1616
return 4;
17-
// expected-error@+1 {{invalid cpu feature string}}
17+
// expected-warning@+1 {{invalid cpu feature string}}
1818
if (__builtin_cpu_supports("dgh+sve2-pmull"))
1919
return 5;
20-
// expected-error@+1 {{invalid cpu feature string}}
20+
// expected-warning@+1 {{invalid cpu feature string}}
2121
if (__builtin_cpu_supports("default"))
2222
return 6;
2323
if (__builtin_cpu_supports(" ssbs + bti "))

clang/test/Sema/builtin-cpu-supports.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ extern const char *str;
77

88
int main(void) {
99
#ifdef __x86_64__
10-
if (__builtin_cpu_supports("ss")) // expected-error {{invalid cpu feature string}}
10+
if (__builtin_cpu_supports("ss")) // expected-warning {{invalid cpu feature string}}
1111
a("sse4.2");
1212

1313
if (__builtin_cpu_supports(str)) // expected-error {{expression is not a string literal}}
@@ -25,9 +25,9 @@ int main(void) {
2525
(void)__builtin_cpu_supports("x86-64-v2");
2626
(void)__builtin_cpu_supports("x86-64-v3");
2727
(void)__builtin_cpu_supports("x86-64-v4");
28-
(void)__builtin_cpu_supports("x86-64-v5"); // expected-error {{invalid cpu feature string for builtin}}
28+
(void)__builtin_cpu_supports("x86-64-v5"); // expected-warning {{invalid cpu feature string for builtin}}
2929
#else
30-
if (__builtin_cpu_supports("neon")) // expected-error {{invalid cpu feature string for builtin}}
30+
if (__builtin_cpu_supports("neon")) // expected-warning {{invalid cpu feature string for builtin}}
3131
a("vsx");
3232

3333
if (__builtin_cpu_is("cortex-x3")) // expected-error {{builtin is not supported on this target}}

0 commit comments

Comments
 (0)