[lldb] [llvm] [llvm][lldb] Add check for incorrect target features (PR #180901)
Georgiy Samoylov via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 11 01:05:55 PST 2026
https://github.com/sga-sc updated https://github.com/llvm/llvm-project/pull/180901
>From 8559ea0de542a7d966f8ae3ee1f2e952d0c15d5f Mon Sep 17 00:00:00 2001
From: Georgiy Samoylov <g.samoylov at syntacore.com>
Date: Thu, 5 Feb 2026 15:26:01 +0300
Subject: [PATCH 1/3] [llvm] Add format check for MCSubtargetFeatures
---
llvm/include/llvm/MC/TargetRegistry.h | 29 ++++++++++++++++++++++++++-
1 file changed, 28 insertions(+), 1 deletion(-)
diff --git a/llvm/include/llvm/MC/TargetRegistry.h b/llvm/include/llvm/MC/TargetRegistry.h
index 4451dfa72a5f4..6e2f194212875 100644
--- a/llvm/include/llvm/MC/TargetRegistry.h
+++ b/llvm/include/llvm/MC/TargetRegistry.h
@@ -351,6 +351,31 @@ class Target {
/// InstrumentManager, if registered (default = nullptr).
InstrumentManagerCtorTy InstrumentManagerCtorFn = nullptr;
+ bool isSignedFeatureList(StringRef FeaturesString) const {
+ if (FeaturesString.empty())
+ return true;
+
+ llvm::SmallVector<llvm::StringRef, 8> Features;
+ FeaturesString.split(Features, ',', /*MaxSplit=*/-1, /*KeepEmpty=*/false);
+
+ if (Features.empty())
+ return false;
+
+ for (llvm::StringRef Feature : Features) {
+ if (Feature.empty())
+ return false;
+
+ char C = Feature.front();
+ if (C != '+' && C != '-')
+ return false;
+
+ if (Feature.size() == 1)
+ return false;
+ }
+
+ return true;
+ }
+
public:
Target() = default;
@@ -452,7 +477,9 @@ class Target {
StringRef Features) const {
if (!MCSubtargetInfoCtorFn)
return nullptr;
- return MCSubtargetInfoCtorFn(TheTriple, CPU, Features);
+ if (!isSignedFeatureList(Features))
+ return nullptr;
+ return MCSubtargetInfoCtorFn(Triple(TheTriple), CPU, Features);
}
/// createTargetMachine - Create a target specific machine implementation
>From 03a409d4e24ec7b0b9da7fdf8c959ae908f11c26 Mon Sep 17 00:00:00 2001
From: Georgiy Samoylov <g.samoylov at syntacore.com>
Date: Thu, 5 Feb 2026 16:23:23 +0300
Subject: [PATCH 2/3] [lldb] Add error message for incorrect features string
---
.../Commands/CommandObjectDisassemble.cpp | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/lldb/source/Commands/CommandObjectDisassemble.cpp b/lldb/source/Commands/CommandObjectDisassemble.cpp
index c0553d2c6c8b2..faed2cafc8237 100644
--- a/lldb/source/Commands/CommandObjectDisassemble.cpp
+++ b/lldb/source/Commands/CommandObjectDisassemble.cpp
@@ -486,15 +486,15 @@ void CommandObjectDisassemble::DoExecute(Args &command,
m_options.arch, flavor_string, cpu_string, features_string, plugin_name);
if (!disassembler) {
- if (plugin_name) {
- result.AppendErrorWithFormat(
- "Unable to find Disassembler plug-in named '%s' that supports the "
- "'%s' architecture.\n",
- plugin_name, m_options.arch.GetArchitectureName());
- } else
- result.AppendErrorWithFormat(
- "Unable to find Disassembler plug-in for the '%s' architecture.\n",
- m_options.arch.GetArchitectureName());
+ result.AppendErrorWithFormat(
+ "Unable to find Disassembler plug-in with such parameters: name: '%s', "
+ "flavor: '%s', cpu: '%s', features: '%s' for the "
+ "'%s' architecture.\n",
+ plugin_name ? plugin_name : "None",
+ flavor_string ? flavor_string : "None",
+ cpu_string ? cpu_string : "None",
+ features_string ? features_string : "None",
+ m_options.arch.GetArchitectureName());
return;
} else if (flavor_string != nullptr && !disassembler->FlavorValidForArchSpec(
m_options.arch, flavor_string))
>From a97b1c99cb862f058622130b1a4843e63f841179 Mon Sep 17 00:00:00 2001
From: Georgiy Samoylov <g.samoylov at syntacore.com>
Date: Mon, 2 Feb 2026 13:15:56 +0300
Subject: [PATCH 3/3] [lldb][test] Add test for invalid target feature handling
---
.../TestDisassembleInvalidTargetFeatures.py | 40 +++++++++++++++++++
1 file changed, 40 insertions(+)
create mode 100644 lldb/test/API/commands/disassemble/basic/TestDisassembleInvalidTargetFeatures.py
diff --git a/lldb/test/API/commands/disassemble/basic/TestDisassembleInvalidTargetFeatures.py b/lldb/test/API/commands/disassemble/basic/TestDisassembleInvalidTargetFeatures.py
new file mode 100644
index 0000000000000..1ecabc520bf16
--- /dev/null
+++ b/lldb/test/API/commands/disassemble/basic/TestDisassembleInvalidTargetFeatures.py
@@ -0,0 +1,40 @@
+"""
+Test for lldb disassemble command with -Y option and invalid parameters.
+This test verifies that disassemble -Y command properly reports error messages
+when invoked with incorrect options.
+"""
+
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import TestBase
+from lldbsuite.test import lldbutil
+
+
+class TestDisassembleInvalidTargetFeatures(TestBase):
+ """Test disassemble -Y option error handling."""
+
+ def run_invalid_disasm_cmd(self, option, expected_error):
+ cmd = f"disassemble -Y {option}"
+ self.runCmd(cmd, check=False)
+ output = self.res.GetOutput()
+ error = self.res.GetError()
+ self.assertFalse(self.res.Succeeded(), f"{cmd} should fail")
+ self.assertTrue(len(error) > 0, f"Error for '{cmd}' should not be empty")
+ self.assertIn(expected_error, error)
+
+ def test_disassemble_Y_invalid_options(self):
+ self.build()
+ _, _, _, _ = lldbutil.run_to_source_breakpoint(
+ self, "main", lldb.SBFileSpec("main.cpp")
+ )
+
+ self.run_invalid_disasm_cmd("", "last option requires an argument")
+ self.run_invalid_disasm_cmd(
+ "invalid", "Unable to find Disassembler plug-in with such parameters:"
+ )
+ self.run_invalid_disasm_cmd(
+ "+invalid_1,-invalid_2,+invalid3", "Failed to disassemble memory at"
+ )
+ self.run_invalid_disasm_cmd("-Z", "Failed to disassemble memory at")
+ self.run_invalid_disasm_cmd("+++", "Failed to disassemble memory at")
+ self.run_invalid_disasm_cmd("----", "Failed to disassemble memory at")
More information about the llvm-commits
mailing list