[clang] [llvm] [AIX] diagnose invalid feature strings on the target attribute (PR #208059)
Wael Yehia via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 8 09:33:36 PDT 2026
https://github.com/w2yehia updated https://github.com/llvm/llvm-project/pull/208059
>From e1a02c77ea6f21fb4694d9155c832f172e6d1e8d Mon Sep 17 00:00:00 2001
From: Wael Yehia <wyehia at ca.ibm.com>
Date: Tue, 7 Jul 2026 18:16:09 +0000
Subject: [PATCH 1/3] diagnose invalid feature strings on the target attribute
---
clang/lib/Basic/Targets/PPC.cpp | 8 ++++++++
clang/lib/Basic/Targets/PPC.h | 2 ++
clang/test/Sema/attr-target.c | 2 +-
llvm/include/llvm/TargetParser/PPCTargetParser.h | 1 +
llvm/include/llvm/TargetParser/TargetParser.h | 3 +++
llvm/lib/TargetParser/PPCTargetParser.cpp | 11 +++++++++++
6 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Basic/Targets/PPC.cpp b/clang/lib/Basic/Targets/PPC.cpp
index c9a41df806aff..1ecb474c1ede8 100644
--- a/clang/lib/Basic/Targets/PPC.cpp
+++ b/clang/lib/Basic/Targets/PPC.cpp
@@ -714,6 +714,14 @@ ParsedTargetAttr PPCTargetInfo::parseTargetAttr(StringRef Features) const {
return Ret;
}
+bool PPCTargetInfo::isValidFeatureName(StringRef Name) const {
+ // we have some target features that are spelled differently on the command
+ // line versus what's in PPC.td. We need to continue accepting them.
+ if (Name == "pcrel" || Name == "prefixed")
+ return true;
+ return llvm::PPC::isValidFeatureName(Name);
+}
+
llvm::APInt PPCTargetInfo::getFMVPriority(ArrayRef<StringRef> Features) const {
if (Features.empty())
return llvm::APInt(32, 0);
diff --git a/clang/lib/Basic/Targets/PPC.h b/clang/lib/Basic/Targets/PPC.h
index a9f49aa3aebe1..9931ae36f9bc4 100644
--- a/clang/lib/Basic/Targets/PPC.h
+++ b/clang/lib/Basic/Targets/PPC.h
@@ -202,6 +202,8 @@ class LLVM_LIBRARY_VISIBILITY PPCTargetInfo : public TargetInfo {
ParsedTargetAttr parseTargetAttr(StringRef Str) const override;
+ bool isValidFeatureName(StringRef Name) const override;
+
llvm::APInt getFMVPriority(ArrayRef<StringRef> Features) const override;
ArrayRef<const char *> getGCCRegNames() const override;
diff --git a/clang/test/Sema/attr-target.c b/clang/test/Sema/attr-target.c
index ddf6654632187..4426ce96d774d 100644
--- a/clang/test/Sema/attr-target.c
+++ b/clang/test/Sema/attr-target.c
@@ -67,7 +67,7 @@ int __attribute__((target("branch-protection=none"))) birch_tree(void) { return
#elifdef __powerpc__
-int __attribute__((target("float128,arch=pwr9"))) foo(void) { return 4; }
+int __attribute__((target("float128,cpu=pwr9"))) foo(void) { return 4; }
//expected-error at +1 {{'target' attribute takes one argument}}
int __attribute__((target())) bar(void) { return 4; }
// no warning, tune is supported for PPC
diff --git a/llvm/include/llvm/TargetParser/PPCTargetParser.h b/llvm/include/llvm/TargetParser/PPCTargetParser.h
index d3d44afb5f544..9f39551377f70 100644
--- a/llvm/include/llvm/TargetParser/PPCTargetParser.h
+++ b/llvm/include/llvm/TargetParser/PPCTargetParser.h
@@ -43,6 +43,7 @@ LLVM_ABI StringRef normalizeCPUName(StringRef CPUName);
LLVM_ABI std::optional<llvm::StringMap<bool>>
getPPCDefaultTargetFeatures(const Triple &T, StringRef CPUName);
+LLVM_ABI bool isValidFeatureName(StringRef Name);
} // namespace PPC
} // namespace llvm
diff --git a/llvm/include/llvm/TargetParser/TargetParser.h b/llvm/include/llvm/TargetParser/TargetParser.h
index b65ff37dfc958..2346c5f407219 100644
--- a/llvm/include/llvm/TargetParser/TargetParser.h
+++ b/llvm/include/llvm/TargetParser/TargetParser.h
@@ -27,6 +27,9 @@ struct BasicSubtargetFeatureKV {
const char *Key; ///< K-V key string
unsigned Value; ///< K-V integer value
FeatureBitArray Implies; ///< K-V bit mask
+
+ /// Compare routine for std::lower_bound
+ bool operator<(StringRef S) const { return StringRef(Key) < S; }
};
/// Used to provide key value pairs for feature and CPU bit flags.
diff --git a/llvm/lib/TargetParser/PPCTargetParser.cpp b/llvm/lib/TargetParser/PPCTargetParser.cpp
index 106d07107ac8c..ef2d02b7afc03 100644
--- a/llvm/lib/TargetParser/PPCTargetParser.cpp
+++ b/llvm/lib/TargetParser/PPCTargetParser.cpp
@@ -145,5 +145,16 @@ std::optional<StringMap<bool>> getPPCDefaultTargetFeatures(const Triple &T,
}
return Features;
}
+
+bool isValidFeatureName(StringRef Name) {
+ ArrayRef<BasicSubtargetFeatureKV> A = BasicPPCFeatureKV;
+ // Binary search the array
+ const BasicSubtargetFeatureKV *F = llvm::lower_bound(A, Name);
+ // If not found then return NULL
+ if (F == A.end() || StringRef(F->Key) != Name)
+ return false;
+ // Return the found array item
+ return true;
+}
} // namespace PPC
} // namespace llvm
>From bf5d970d8c4a74b60d4ebefef98d2da06e6454d7 Mon Sep 17 00:00:00 2001
From: Wael Yehia <wyehia at ca.ibm.com>
Date: Tue, 7 Jul 2026 18:48:39 +0000
Subject: [PATCH 2/3] add test
---
clang/test/Sema/attr-target.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/clang/test/Sema/attr-target.c b/clang/test/Sema/attr-target.c
index 4426ce96d774d..6e9d85b5e1d67 100644
--- a/clang/test/Sema/attr-target.c
+++ b/clang/test/Sema/attr-target.c
@@ -84,6 +84,8 @@ int __attribute__((target("cpu=hiss,cpu=woof"))) pine_tree(void) { return 4; }
int __attribute__((target("cpu=pwr9,cpu=pwr10"))) oak_tree(void) { return 4; }
//expected-warning at +1 {{unknown tune CPU 'hiss' in the 'target' attribute string; 'target' attribute ignored}}
int __attribute__((target("tune=hiss,tune=woof"))) apple_tree(void) { return 4; }
+//expected-warning at +1 {{unsupported 'woof' in the 'target' attribute string; 'target' attribute ignored}}
+int __attribute__((target("woof"))) cherry_tree(void) { return 4; }
#else
>From 86ae4bc3c8d9cc109e9cfd4be3443fe2e68700ee Mon Sep 17 00:00:00 2001
From: Wael Yehia <wyehia at ca.ibm.com>
Date: Wed, 8 Jul 2026 16:49:31 +0000
Subject: [PATCH 3/3] simplify logic
---
llvm/lib/TargetParser/PPCTargetParser.cpp | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/llvm/lib/TargetParser/PPCTargetParser.cpp b/llvm/lib/TargetParser/PPCTargetParser.cpp
index ef2d02b7afc03..76c2c13ac53a4 100644
--- a/llvm/lib/TargetParser/PPCTargetParser.cpp
+++ b/llvm/lib/TargetParser/PPCTargetParser.cpp
@@ -150,11 +150,7 @@ bool isValidFeatureName(StringRef Name) {
ArrayRef<BasicSubtargetFeatureKV> A = BasicPPCFeatureKV;
// Binary search the array
const BasicSubtargetFeatureKV *F = llvm::lower_bound(A, Name);
- // If not found then return NULL
- if (F == A.end() || StringRef(F->Key) != Name)
- return false;
- // Return the found array item
- return true;
+ return F != A.end() && StringRef(F->Key) == Name;
}
} // namespace PPC
} // namespace llvm
More information about the cfe-commits
mailing list