https://github.com/DanShaders updated https://github.com/llvm/llvm-project/pull/98426
>From 723205411efe18dbe8bb154839525b59963b1638 Mon Sep 17 00:00:00 2001 From: Dan Klishch <danilklis...@gmail.com> Date: Wed, 10 Jul 2024 23:39:42 -0400 Subject: [PATCH 1/2] [clang] Do not allow unorderable features in [[gnu::target{,_clones}]] This partially addresses #98244. --- clang/lib/Sema/SemaDecl.cpp | 4 +++- clang/lib/Sema/SemaDeclAttr.cpp | 3 ++- clang/test/Sema/attr-target-clones.c | 3 +++ clang/test/Sema/attr-target-mv.c | 14 ++++++++++++++ clang/test/Sema/attr-target.c | 2 ++ 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 5b7275c316f74a..e03e66f23e9a1e 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -11108,7 +11108,9 @@ static bool CheckMultiVersionValue(Sema &S, const FunctionDecl *FD) { } if (!TargetInfo.validateCpuSupports(BareFeat) || - !TargetInfo.isValidFeatureName(BareFeat)) { + !TargetInfo.isValidFeatureName(BareFeat) || + (BareFeat != "default" && + TargetInfo.multiVersionSortPriority(BareFeat) == 0)) { S.Diag(FD->getLocation(), diag::err_bad_multiversion_option) << Feature << BareFeat; return true; diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index bb4d33560b93b8..256188e65d8aaa 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -3289,7 +3289,8 @@ bool Sema::checkTargetClonesAttrString( } else if (Cur == "default") { DefaultIsDupe = HasDefault; HasDefault = true; - } else if (!Context.getTargetInfo().isValidFeatureName(Cur)) + } else if (!Context.getTargetInfo().isValidFeatureName(Cur) || + Context.getTargetInfo().multiVersionSortPriority(Cur) == 0) return Diag(CurLoc, diag::warn_unsupported_target_attribute) << Unsupported << None << Cur << TargetClones; if (llvm::is_contained(StringsBuffer, Cur) || DefaultIsDupe) diff --git a/clang/test/Sema/attr-target-clones.c b/clang/test/Sema/attr-target-clones.c index e287fce7699b77..4597ea54d02bfe 100644 --- a/clang/test/Sema/attr-target-clones.c +++ b/clang/test/Sema/attr-target-clones.c @@ -122,3 +122,6 @@ void good_overload5(int) __attribute__((target_clones("mmx", "sse4.2", "default" void good_isa_level(int) __attribute__((target_clones("default", "arch=x86-64", "arch=x86-64-v2", "arch=x86-64-v3", "arch=x86-64-v4"))); // expected-warning@+1 {{unsupported CPU 'x86-64-v5' in the 'target_clones' attribute string; 'target_clones' attribute ignored}} void bad_isa_level(int) __attribute__((target_clones("default", "arch=x86-64-v5"))); + +// expected-warning@+1 {{unsupported 'sha' in the 'target_clones' attribute string; 'target_clones' attribute ignored}} +void bad_feature(void) __attribute__((target_clones("default", "sse4.2", "sha"))); diff --git a/clang/test/Sema/attr-target-mv.c b/clang/test/Sema/attr-target-mv.c index 8218771275e1bd..ddb1d82b02f098 100644 --- a/clang/test/Sema/attr-target-mv.c +++ b/clang/test/Sema/attr-target-mv.c @@ -170,3 +170,17 @@ int __attribute__((__overloadable__)) __attribute__((target("arch=sandybridge")) int __attribute__((__overloadable__)) __attribute__((target("sse4.2"))) good_overload7(void); int __attribute__((target("arch=sandybridge"))) good_overload7(int); + +// expected-error@+2 {{function multiversioning doesn't support feature 'sha'}} +// expected-note@+2 {{function multiversioning caused by this declaration}} +int __attribute__((target("sha"))) no_priority1(void); +int __attribute__((target("default"))) no_priority1(void); + +int __attribute__((target("default"))) no_priority2(void); +// expected-error@+1 {{function multiversioning doesn't support feature 'sha'}} +int __attribute__((target("sha"))) no_priority2(void); + +int __attribute__((target("default"))) no_priority3(void); +int __attribute__((target("avx2"))) no_priority3(void); +// expected-error@+1 {{function multiversioning doesn't support feature 'sha'}} +int __attribute__((target("sha"))) no_priority3(void); diff --git a/clang/test/Sema/attr-target.c b/clang/test/Sema/attr-target.c index 5328f056507a71..65ece3c27d2990 100644 --- a/clang/test/Sema/attr-target.c +++ b/clang/test/Sema/attr-target.c @@ -33,6 +33,8 @@ void __attribute__((target("x86-64"))) baseline(void) {} //expected-warning@+1 {{unsupported 'x86-64-v2' in the 'target' attribute string}} void __attribute__((target("x86-64-v2"))) v2(void) {} +int __attribute__((target("sha"))) good_target_but_not_for_fmv() { return 5; } + #elifdef __aarch64__ int __attribute__((target("sve,arch=armv8-a"))) foo(void) { return 4; } >From 7378d6241f4e829a3b69af2ceb9a70c9c0bcc56a Mon Sep 17 00:00:00 2001 From: Dan Klishch <danilklis...@gmail.com> Date: Mon, 13 Jan 2025 16:57:19 -0500 Subject: [PATCH 2/2] fixup after #116257 --- clang/lib/Sema/SemaDecl.cpp | 3 +-- clang/lib/Sema/SemaDeclAttr.cpp | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index e03e66f23e9a1e..ccfaf273dc7683 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -11109,8 +11109,7 @@ static bool CheckMultiVersionValue(Sema &S, const FunctionDecl *FD) { if (!TargetInfo.validateCpuSupports(BareFeat) || !TargetInfo.isValidFeatureName(BareFeat) || - (BareFeat != "default" && - TargetInfo.multiVersionSortPriority(BareFeat) == 0)) { + (BareFeat != "default" && TargetInfo.getFMVPriority(BareFeat) == 0)) { S.Diag(FD->getLocation(), diag::err_bad_multiversion_option) << Feature << BareFeat; return true; diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index 256188e65d8aaa..0a1f2535a7d0c5 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -3290,7 +3290,7 @@ bool Sema::checkTargetClonesAttrString( DefaultIsDupe = HasDefault; HasDefault = true; } else if (!Context.getTargetInfo().isValidFeatureName(Cur) || - Context.getTargetInfo().multiVersionSortPriority(Cur) == 0) + Context.getTargetInfo().getFMVPriority(Cur) == 0) return Diag(CurLoc, diag::warn_unsupported_target_attribute) << Unsupported << None << Cur << TargetClones; if (llvm::is_contained(StringsBuffer, Cur) || DefaultIsDupe) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits