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

Reply via email to