[llvm] [llvm] Add format check for MCSubtargetFeatures (PR #180943)

Georgiy Samoylov via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 19 05:00:12 PST 2026


https://github.com/sga-sc updated https://github.com/llvm/llvm-project/pull/180943

>From 3c3ed59c6a2a1ed22fa4df4c28d592ad636a17f8 Mon Sep 17 00:00:00 2001
From: Georgiy Samoylov <Ignitor21838 at gmail.com>
Date: Wed, 11 Feb 2026 16:50:34 +0300
Subject: [PATCH] [llvm] Add format check for MCSubtargetFeatures

---
 llvm/include/llvm/MC/TargetRegistry.h |  4 ++++
 llvm/lib/MC/TargetRegistry.cpp        | 22 ++++++++++++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/llvm/include/llvm/MC/TargetRegistry.h b/llvm/include/llvm/MC/TargetRegistry.h
index 4451dfa72a5f4..e14ab12047a96 100644
--- a/llvm/include/llvm/MC/TargetRegistry.h
+++ b/llvm/include/llvm/MC/TargetRegistry.h
@@ -351,6 +351,8 @@ class Target {
   /// InstrumentManager, if registered (default = nullptr).
   InstrumentManagerCtorTy InstrumentManagerCtorFn = nullptr;
 
+  bool isValidFeatureListFormat(StringRef FeaturesString) const;
+
 public:
   Target() = default;
 
@@ -452,6 +454,8 @@ class Target {
                                          StringRef Features) const {
     if (!MCSubtargetInfoCtorFn)
       return nullptr;
+    if (!isValidFeatureListFormat(Features))
+      return nullptr;
     return MCSubtargetInfoCtorFn(TheTriple, CPU, Features);
   }
 
diff --git a/llvm/lib/MC/TargetRegistry.cpp b/llvm/lib/MC/TargetRegistry.cpp
index 9263dda65a8b0..09a7f2f267934 100644
--- a/llvm/lib/MC/TargetRegistry.cpp
+++ b/llvm/lib/MC/TargetRegistry.cpp
@@ -23,6 +23,28 @@ using namespace llvm;
 // Clients are responsible for avoid race conditions in registration.
 static Target *FirstTarget = nullptr;
 
+bool Target::isValidFeatureListFormat(StringRef FeaturesString) const {
+  if (FeaturesString.empty())
+    return true;
+
+  SmallVector<llvm::StringRef, 8> Features;
+  FeaturesString.split(Features, ',', /*MaxSplit=*/-1, /*KeepEmpty=*/false);
+
+  if (Features.empty())
+    return false;
+
+  for (llvm::StringRef Feature : Features) {
+    char C = Feature.front();
+    if (C != '+' && C != '-')
+      return false;
+
+    if (Feature.size() == 1)
+      return false;
+  }
+
+  return true;
+}
+
 MCStreamer *Target::createMCObjectStreamer(
     const Triple &T, MCContext &Ctx, std::unique_ptr<MCAsmBackend> TAB,
     std::unique_ptr<MCObjectWriter> OW, std::unique_ptr<MCCodeEmitter> Emitter,



More information about the llvm-commits mailing list