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 <[email protected]> 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@+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 <[email protected]> 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@+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@+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 <[email protected]> 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 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
