[Lldb-commits] [lldb] [lldb] Compare generic DWARF relational operands as signed values (PR #218335)
via lldb-commits
lldb-commits at lists.llvm.org
Mon Aug 24 21:53:41 PDT 2026
https://github.com/MrEven132 updated https://github.com/llvm/llvm-project/pull/218335
>From 638722257b3ba98487cc33376c0b5e926fefff34 Mon Sep 17 00:00:00 2001
From: MrEven132 <13554966229 at 163.com>
Date: Tue, 25 Aug 2026 12:08:12 +0800
Subject: [PATCH 1/6] [lldb][NFC] Add a helper to identify potentially generic
operands
---
lldb/source/Expression/DWARFExpression.cpp | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp
index 91c47546eeac7..d4504dafa3321 100644
--- a/lldb/source/Expression/DWARFExpression.cpp
+++ b/lldb/source/Expression/DWARFExpression.cpp
@@ -1380,6 +1380,15 @@ static llvm::Error CheckScalarOperandsHaveSameType(const Scalar &lhs,
return llvm::Error::success();
}
+// Scalar does not preserve DWARF's generic type identifier. Since generic
+// values are address-sized integers, use the scalar kind and width as an
+// approximation.
+static bool IsPotentiallyGenericIntegerOperand(const Scalar &operand,
+ size_t address_size) {
+ return address_size != 0 && operand.GetType() == Scalar::e_int &&
+ operand.GetByteSize() == address_size;
+}
+
llvm::Expected<Value> DWARFExpression::Evaluate(
ExecutionContext *exe_ctx, RegisterContext *reg_ctx,
lldb::ModuleSP module_sp, const DataExtractor &opcodes,
>From 829e50bfa0293db88a52b52489a8cefa8ea2404d Mon Sep 17 00:00:00 2001
From: MrEven132 <13554966229 at 163.com>
Date: Tue, 25 Aug 2026 12:09:02 +0800
Subject: [PATCH 2/6] [lldb] Compare generic DW_OP_ge operands as signed
---
lldb/source/Expression/DWARFExpression.cpp | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp
index d4504dafa3321..c101c8cf73058 100644
--- a/lldb/source/Expression/DWARFExpression.cpp
+++ b/lldb/source/Expression/DWARFExpression.cpp
@@ -1754,6 +1754,11 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
return err;
tmp = stack.back();
stack.pop_back();
+ if (IsPotentiallyGenericIntegerOperand(tmp.GetScalar(), address_size) &&
+ IsPotentiallyGenericIntegerOperand(stack.back().GetScalar(), address_size)) {
+ tmp.GetScalar().MakeSigned();
+ stack.back().GetScalar().MakeSigned();
+ }
stack.back().GetScalar() =
to_generic(stack.back().GetScalar() >= tmp.GetScalar());
break;
>From 122988dd18dd86d2925510d12de8da7fa2d2965e Mon Sep 17 00:00:00 2001
From: MrEven132 <13554966229 at 163.com>
Date: Tue, 25 Aug 2026 12:09:32 +0800
Subject: [PATCH 3/6] [lldb] Compare generic DW_OP_gt operands as signed
---
lldb/source/Expression/DWARFExpression.cpp | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp
index c101c8cf73058..5ef5d51982f91 100644
--- a/lldb/source/Expression/DWARFExpression.cpp
+++ b/lldb/source/Expression/DWARFExpression.cpp
@@ -1770,6 +1770,11 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
return err;
tmp = stack.back();
stack.pop_back();
+ if (IsPotentiallyGenericIntegerOperand(tmp.GetScalar(), address_size) &&
+ IsPotentiallyGenericIntegerOperand(stack.back().GetScalar(), address_size)) {
+ tmp.GetScalar().MakeSigned();
+ stack.back().GetScalar().MakeSigned();
+ }
stack.back().GetScalar() =
to_generic(stack.back().GetScalar() > tmp.GetScalar());
break;
>From fcf135114b490fda46f5f1cf14bdd1e83026acd0 Mon Sep 17 00:00:00 2001
From: MrEven132 <13554966229 at 163.com>
Date: Tue, 25 Aug 2026 12:10:11 +0800
Subject: [PATCH 4/6] [lldb] Compare generic DW_OP_le operands as signed
---
lldb/source/Expression/DWARFExpression.cpp | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp
index 5ef5d51982f91..fdbcb768dc8fb 100644
--- a/lldb/source/Expression/DWARFExpression.cpp
+++ b/lldb/source/Expression/DWARFExpression.cpp
@@ -1786,6 +1786,11 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
return err;
tmp = stack.back();
stack.pop_back();
+ if (IsPotentiallyGenericIntegerOperand(tmp.GetScalar(), address_size) &&
+ IsPotentiallyGenericIntegerOperand(stack.back().GetScalar(), address_size)) {
+ tmp.GetScalar().MakeSigned();
+ stack.back().GetScalar().MakeSigned();
+ }
stack.back().GetScalar() =
to_generic(stack.back().GetScalar() <= tmp.GetScalar());
break;
>From 48339a9ea6dd06650a22ea517a82242fb1991275 Mon Sep 17 00:00:00 2001
From: MrEven132 <13554966229 at 163.com>
Date: Tue, 25 Aug 2026 12:10:33 +0800
Subject: [PATCH 5/6] [lldb] Compare generic DW_OP_lt operands as signed
---
lldb/source/Expression/DWARFExpression.cpp | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp
index fdbcb768dc8fb..bdd77fa5af106 100644
--- a/lldb/source/Expression/DWARFExpression.cpp
+++ b/lldb/source/Expression/DWARFExpression.cpp
@@ -1802,6 +1802,11 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
return err;
tmp = stack.back();
stack.pop_back();
+ if (IsPotentiallyGenericIntegerOperand(tmp.GetScalar(), address_size) &&
+ IsPotentiallyGenericIntegerOperand(stack.back().GetScalar(), address_size)) {
+ tmp.GetScalar().MakeSigned();
+ stack.back().GetScalar().MakeSigned();
+ }
stack.back().GetScalar() =
to_generic(stack.back().GetScalar() < tmp.GetScalar());
break;
>From 4ff57cf6198d521b9a74e4f06edbc212318c65a3 Mon Sep 17 00:00:00 2001
From: MrEven132 <13554966229 at 163.com>
Date: Tue, 25 Aug 2026 12:41:56 +0800
Subject: [PATCH 6/6] [lldb] Test signed generic DWARF relational comparisons
---
.../Expression/DWARFExpressionTest.cpp | 39 +++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/lldb/unittests/Expression/DWARFExpressionTest.cpp b/lldb/unittests/Expression/DWARFExpressionTest.cpp
index 094cfaf790a9a..50bdc96be7c93 100644
--- a/lldb/unittests/Expression/DWARFExpressionTest.cpp
+++ b/lldb/unittests/Expression/DWARFExpressionTest.cpp
@@ -766,6 +766,45 @@ TEST(DWARFExpression, RelationalOpsProduceGenericResult) {
}
}
+TEST(DWARFExpression, GenericRelationalOpsUseSignedComparison) {
+ struct TestCase {
+ uint8_t opcode;
+ uint8_t expected;
+ };
+ constexpr TestCase test_cases[] = {
+ {DW_OP_lt, 1}, {DW_OP_le, 1}, {DW_OP_gt, 0}, {DW_OP_ge, 0}};
+
+ for (const TestCase &test : test_cases) {
+ // Generic relational operands are compared as signed values, so the
+ // unsigned encoding of all-one bits below represents -1 for comparison.
+ const std::vector<uint8_t> expr = {
+ DW_OP_const8u,
+ 0xff,
+ 0xff,
+ 0xff,
+ 0xff,
+ 0xff,
+ 0xff,
+ 0xff,
+ 0xff,
+ DW_OP_consts,
+ 0x00,
+ test.opcode,
+ DW_OP_stack_value,
+ };
+ DataExtractor extractor(expr.data(), expr.size(), lldb::eByteOrderLittle,
+ /*addr_size=*/8);
+
+ EXPECT_THAT_EXPECTED(
+ DWARFExpression::Evaluate(
+ /*exe_ctx=*/nullptr, /*reg_ctx=*/nullptr, /*module_sp=*/{},
+ extractor, /*unit=*/nullptr, lldb::eRegisterKindLLDB,
+ /*initial_value_ptr=*/nullptr, /*object_address_ptr=*/nullptr),
+ ExpectScalar(64, test.expected, false))
+ << "opcode 0x" << llvm::utohexstr(test.opcode);
+ }
+}
+
TEST(DWARFExpression, DW_OP_stack_value) {
EXPECT_THAT_EXPECTED(Evaluate({DW_OP_stack_value}), llvm::Failed());
}
More information about the lldb-commits
mailing list