[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