diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp index 5d5c03d81ef1f..299dbe97d6176 100644 --- a/lldb/source/Expression/DWARFExpression.cpp +++ b/lldb/source/Expression/DWARFExpression.cpp @@ -1724,7 +1724,8 @@ llvm::Expected DWARFExpression::Evaluate( return err; tmp = stack.back(); stack.pop_back(); - stack.back().GetScalar() = stack.back().GetScalar() == tmp.GetScalar(); + stack.back().GetScalar() = + to_generic(stack.back().GetScalar() == tmp.GetScalar()); break; case DW_OP_ge: @@ -1734,7 +1735,8 @@ llvm::Expected DWARFExpression::Evaluate( return err; tmp = stack.back(); stack.pop_back(); - stack.back().GetScalar() = stack.back().GetScalar() >= tmp.GetScalar(); + stack.back().GetScalar() = + to_generic(stack.back().GetScalar() >= tmp.GetScalar()); break; case DW_OP_gt: @@ -1744,7 +1746,8 @@ llvm::Expected DWARFExpression::Evaluate( return err; tmp = stack.back(); stack.pop_back(); - stack.back().GetScalar() = stack.back().GetScalar() > tmp.GetScalar(); + stack.back().GetScalar() = + to_generic(stack.back().GetScalar() > tmp.GetScalar()); break; case DW_OP_le: @@ -1754,7 +1757,8 @@ llvm::Expected DWARFExpression::Evaluate( return err; tmp = stack.back(); stack.pop_back(); - stack.back().GetScalar() = stack.back().GetScalar() <= tmp.GetScalar(); + stack.back().GetScalar() = + to_generic(stack.back().GetScalar() <= tmp.GetScalar()); break; case DW_OP_lt: @@ -1764,7 +1768,8 @@ llvm::Expected DWARFExpression::Evaluate( return err; tmp = stack.back(); stack.pop_back(); - stack.back().GetScalar() = stack.back().GetScalar() < tmp.GetScalar(); + stack.back().GetScalar() = + to_generic(stack.back().GetScalar() < tmp.GetScalar()); break; case DW_OP_ne: @@ -1774,7 +1779,8 @@ llvm::Expected DWARFExpression::Evaluate( return err; tmp = stack.back(); stack.pop_back(); - stack.back().GetScalar() = stack.back().GetScalar() != tmp.GetScalar(); + stack.back().GetScalar() = + to_generic(stack.back().GetScalar() != tmp.GetScalar()); break; case DW_OP_lit0: diff --git a/lldb/unittests/Expression/DWARFExpressionTest.cpp b/lldb/unittests/Expression/DWARFExpressionTest.cpp index 7dc707ac29a70..6df4553757de4 100644 --- a/lldb/unittests/Expression/DWARFExpressionTest.cpp +++ b/lldb/unittests/Expression/DWARFExpressionTest.cpp @@ -708,6 +708,39 @@ TEST(DWARFExpression, GenericBinaryOpsAllowDifferentSignedness) { ExpectScalar(4)); } +TEST(DWARFExpression, RelationalOpsProduceGenericResult) { + struct TestCase { + uint8_t opcode; + uint8_t lhs; + uint8_t rhs; + }; + constexpr TestCase test_cases[] = { + {DW_OP_eq, 3, 3}, {DW_OP_ge, 4, 3}, {DW_OP_gt, 4, 3}, + {DW_OP_le, 3, 4}, {DW_OP_lt, 3, 4}, {DW_OP_ne, 3, 4}, + }; + + for (const TestCase &test : test_cases) { + const std::vector expr = { + DW_OP_lit8, + static_cast(DW_OP_lit0 + test.lhs), + static_cast(DW_OP_lit0 + test.rhs), + test.opcode, + DW_OP_plus, + 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, 9, false)) + << "opcode 0x" << llvm::utohexstr(test.opcode); + } +} + TEST(DWARFExpression, DW_OP_stack_value) { EXPECT_THAT_EXPECTED(Evaluate({DW_OP_stack_value}), llvm::Failed()); }