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

>From 1b2d617f7372207a9565d64c8db906862b0bffca Mon Sep 17 00:00:00 2001
From: Georgiy Samoylov <[email protected]>
Date: Wed, 11 Feb 2026 16:50:34 +0300
Subject: [PATCH 1/3] [MC] Add format check for MCSubtargetFeatures

---
 llvm/include/llvm/MC/TargetRegistry.h | 6 ++++++
 llvm/lib/MC/TargetRegistry.cpp        | 9 +++++++++
 2 files changed, 15 insertions(+)

diff --git a/llvm/include/llvm/MC/TargetRegistry.h 
b/llvm/include/llvm/MC/TargetRegistry.h
index 4451dfa72a5f4..ae4774cbc045f 100644
--- a/llvm/include/llvm/MC/TargetRegistry.h
+++ b/llvm/include/llvm/MC/TargetRegistry.h
@@ -452,6 +452,8 @@ class Target {
                                          StringRef Features) const {
     if (!MCSubtargetInfoCtorFn)
       return nullptr;
+    if (!isValidFeatureListFormat(Features))
+      return nullptr;
     return MCSubtargetInfoCtorFn(TheTriple, CPU, Features);
   }
 
@@ -630,6 +632,10 @@ class Target {
     return nullptr;
   }
 
+  /// isValidFeatureListFormat - check that FeatureString
+  /// has valid format.
+  static bool isValidFeatureListFormat(StringRef FeaturesString);
+
   /// @}
 };
 
diff --git a/llvm/lib/MC/TargetRegistry.cpp b/llvm/lib/MC/TargetRegistry.cpp
index 9263dda65a8b0..cc0218a5a7cca 100644
--- a/llvm/lib/MC/TargetRegistry.cpp
+++ b/llvm/lib/MC/TargetRegistry.cpp
@@ -15,6 +15,7 @@
 #include "llvm/MC/MCInstPrinter.h"
 #include "llvm/MC/MCObjectStreamer.h"
 #include "llvm/MC/MCObjectWriter.h"
+#include "llvm/Support/Regex.h"
 #include "llvm/Support/raw_ostream.h"
 #include <cassert>
 #include <vector>
@@ -23,6 +24,14 @@ using namespace llvm;
 // Clients are responsible for avoid race conditions in registration.
 static Target *FirstTarget = nullptr;
 
+bool Target::isValidFeatureListFormat(StringRef Features) {
+  if (Features.empty())
+    return true;
+
+  static const llvm::Regex pattern("^([+-][^,]+)(,[+-][^,]+)*$");
+  return pattern.match(Features);
+}
+
 MCStreamer *Target::createMCObjectStreamer(
     const Triple &T, MCContext &Ctx, std::unique_ptr<MCAsmBackend> TAB,
     std::unique_ptr<MCObjectWriter> OW, std::unique_ptr<MCCodeEmitter> Emitter,

>From 7a6d4b7167268b06961710fb94853e289b058ede Mon Sep 17 00:00:00 2001
From: Georgiy Samoylov <[email protected]>
Date: Wed, 25 Feb 2026 13:39:19 +0300
Subject: [PATCH 2/3] [MC][unittest] Add unit-test for feature list format

---
 llvm/unittests/MC/TargetRegistry.cpp | 43 ++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/llvm/unittests/MC/TargetRegistry.cpp 
b/llvm/unittests/MC/TargetRegistry.cpp
index cc464b7681ce1..adeefb2ff6058 100644
--- a/llvm/unittests/MC/TargetRegistry.cpp
+++ b/llvm/unittests/MC/TargetRegistry.cpp
@@ -42,4 +42,47 @@ TEST(TargetRegistry, TargetHasArchType) {
   ASSERT_NE(Count, 0);
 }
 
+TEST(TargetRegistry, IsValidFeatureListFormat) {
+  // Valid strings
+
+  // Empty string is a valid feature string
+  EXPECT_TRUE(Target::isValidFeatureListFormat(""));
+
+  EXPECT_TRUE(Target::isValidFeatureListFormat("+some_feature"));
+  EXPECT_TRUE(Target::isValidFeatureListFormat("-some_feature"));
+  EXPECT_TRUE(
+      Target::isValidFeatureListFormat("+feature1,-feature2,+feature3"));
+  EXPECT_TRUE(Target::isValidFeatureListFormat("+123"));
+
+  // Invalid strings
+
+  // Feature don't start with '+' or '-'
+  EXPECT_FALSE(Target::isValidFeatureListFormat("invalid_string"));
+  EXPECT_FALSE(Target::isValidFeatureListFormat("+good,bad"));
+  EXPECT_FALSE(Target::isValidFeatureListFormat("bad,+good"));
+
+  // String has spaces
+  EXPECT_FALSE(Target::isValidFeatureListFormat(" "));
+  EXPECT_FALSE(Target::isValidFeatureListFormat(", "));
+  EXPECT_FALSE(Target::isValidFeatureListFormat(" avx"));
+  EXPECT_FALSE(Target::isValidFeatureListFormat("+avx, -sse"));
+
+  // Redundant commas
+  EXPECT_FALSE(Target::isValidFeatureListFormat("+feature1,,+feature2"));
+  EXPECT_FALSE(Target::isValidFeatureListFormat(",+feature"));
+  EXPECT_FALSE(Target::isValidFeatureListFormat("-feature,"));
+  EXPECT_FALSE(
+      Target::isValidFeatureListFormat("+feature1,,,+feature2,,+feature3"));
+
+  // Feature consists only of '+' or '-'
+  EXPECT_FALSE(Target::isValidFeatureListFormat("+"));
+  EXPECT_FALSE(Target::isValidFeatureListFormat("-"));
+  EXPECT_FALSE(Target::isValidFeatureListFormat("+avx,-"));
+
+  // Only commas
+  EXPECT_FALSE(Target::isValidFeatureListFormat(","));
+  EXPECT_FALSE(Target::isValidFeatureListFormat(",,"));
+  EXPECT_FALSE(Target::isValidFeatureListFormat(",,,"));
+}
+
 } // end namespace

>From 0ec4ecb3d74287bf0e638930c0af74f9e0168f00 Mon Sep 17 00:00:00 2001
From: Georgiy Samoylov <[email protected]>
Date: Tue, 3 Mar 2026 16:11:01 +0300
Subject: [PATCH 3/3] [lldb] Delete last comma from features

---
 .../Plugins/Disassembler/LLVMC/DisassemblerLLVMC.cpp      | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/lldb/source/Plugins/Disassembler/LLVMC/DisassemblerLLVMC.cpp 
b/lldb/source/Plugins/Disassembler/LLVMC/DisassemblerLLVMC.cpp
index e8bb706f7aab6..7c9ff59f1f547 100644
--- a/lldb/source/Plugins/Disassembler/LLVMC/DisassemblerLLVMC.cpp
+++ b/lldb/source/Plugins/Disassembler/LLVMC/DisassemblerLLVMC.cpp
@@ -1609,6 +1609,10 @@ DisassemblerLLVMC::DisassemblerLLVMC(const ArchSpec 
&arch,
     features_str += "+a,+m,";
   }
 
+  // We should delete the last comma from string
+  if (!features_str.empty() && features_str.back() == ',')
+    features_str.pop_back();
+
   // We use m_disasm_up.get() to tell whether we are valid or not, so if this
   // isn't good for some reason, we won't be valid and FindPlugin will fail and
   // we won't get used.
@@ -1630,9 +1634,9 @@ DisassemblerLLVMC::DisassemblerLLVMC(const ArchSpec &arch,
     /* Create alternate disassembler for MIPS16 and microMIPS */
     uint32_t arch_flags = arch.GetFlags();
     if (arch_flags & ArchSpec::eMIPSAse_mips16)
-      features_str += "+mips16,";
+      features_str += ",+mips16";
     else if (arch_flags & ArchSpec::eMIPSAse_micromips)
-      features_str += "+micromips,";
+      features_str += ",+micromips";
 
     m_alternate_disasm_up = MCDisasmInstance::Create(
         triple_str, cpu, features_str.c_str(), flavor, *this);

_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to