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 aa388046837cc418487bb63a828e9a3f77f4a7df 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..697b00c1f61be 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.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
