Skip to content

Commit 9988309

Browse files
authored
[clang] Do not allow unorderable features in [[gnu::target{,_clones}]] (#98426)
This partially addresses #98244.
1 parent cc3aab5 commit 9988309

File tree

5 files changed

+23
-2
lines changed

5 files changed

+23
-2
lines changed

clang/lib/Sema/SemaDecl.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11136,7 +11136,8 @@ static bool CheckMultiVersionValue(Sema &S, const FunctionDecl *FD) {
1113611136
}
1113711137

1113811138
if (!TargetInfo.validateCpuSupports(BareFeat) ||
11139-
!TargetInfo.isValidFeatureName(BareFeat)) {
11139+
!TargetInfo.isValidFeatureName(BareFeat) ||
11140+
(BareFeat != "default" && TargetInfo.getFMVPriority(BareFeat) == 0)) {
1114011141
S.Diag(FD->getLocation(), diag::err_bad_multiversion_option)
1114111142
<< Feature << BareFeat;
1114211143
return true;

clang/lib/Sema/SemaDeclAttr.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3289,7 +3289,8 @@ bool Sema::checkTargetClonesAttrString(
32893289
} else if (Cur == "default") {
32903290
DefaultIsDupe = HasDefault;
32913291
HasDefault = true;
3292-
} else if (!Context.getTargetInfo().isValidFeatureName(Cur))
3292+
} else if (!Context.getTargetInfo().isValidFeatureName(Cur) ||
3293+
Context.getTargetInfo().getFMVPriority(Cur) == 0)
32933294
return Diag(CurLoc, diag::warn_unsupported_target_attribute)
32943295
<< Unsupported << None << Cur << TargetClones;
32953296
if (llvm::is_contained(StringsBuffer, Cur) || DefaultIsDupe)

clang/test/Sema/attr-target-clones.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,6 @@ void good_overload5(int) __attribute__((target_clones("mmx", "sse4.2", "default"
122122
void good_isa_level(int) __attribute__((target_clones("default", "arch=x86-64", "arch=x86-64-v2", "arch=x86-64-v3", "arch=x86-64-v4")));
123123
// expected-warning@+1 {{unsupported CPU 'x86-64-v5' in the 'target_clones' attribute string; 'target_clones' attribute ignored}}
124124
void bad_isa_level(int) __attribute__((target_clones("default", "arch=x86-64-v5")));
125+
126+
// expected-warning@+1 {{unsupported 'sha' in the 'target_clones' attribute string; 'target_clones' attribute ignored}}
127+
void bad_feature(void) __attribute__((target_clones("default", "sse4.2", "sha")));

clang/test/Sema/attr-target-mv.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,3 +170,17 @@ int __attribute__((__overloadable__)) __attribute__((target("arch=sandybridge"))
170170

171171
int __attribute__((__overloadable__)) __attribute__((target("sse4.2"))) good_overload7(void);
172172
int __attribute__((target("arch=sandybridge"))) good_overload7(int);
173+
174+
// expected-error@+2 {{function multiversioning doesn't support feature 'sha'}}
175+
// expected-note@+2 {{function multiversioning caused by this declaration}}
176+
int __attribute__((target("sha"))) no_priority1(void);
177+
int __attribute__((target("default"))) no_priority1(void);
178+
179+
int __attribute__((target("default"))) no_priority2(void);
180+
// expected-error@+1 {{function multiversioning doesn't support feature 'sha'}}
181+
int __attribute__((target("sha"))) no_priority2(void);
182+
183+
int __attribute__((target("default"))) no_priority3(void);
184+
int __attribute__((target("avx2"))) no_priority3(void);
185+
// expected-error@+1 {{function multiversioning doesn't support feature 'sha'}}
186+
int __attribute__((target("sha"))) no_priority3(void);

clang/test/Sema/attr-target.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ void __attribute__((target("x86-64"))) baseline(void) {}
3333
//expected-warning@+1 {{unsupported 'x86-64-v2' in the 'target' attribute string}}
3434
void __attribute__((target("x86-64-v2"))) v2(void) {}
3535

36+
int __attribute__((target("sha"))) good_target_but_not_for_fmv() { return 5; }
37+
3638
#elifdef __aarch64__
3739

3840
int __attribute__((target("sve,arch=armv8-a"))) foo(void) { return 4; }

0 commit comments

Comments
 (0)