diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp --- a/lldb/source/Expression/DWARFExpression.cpp +++ b/lldb/source/Expression/DWARFExpression.cpp @@ -1436,8 +1436,12 @@ return false; } else { stack.pop_back(); - stack.back() = - stack.back().ResolveValue(exe_ctx) / tmp.ResolveValue(exe_ctx); + Scalar divisor, dividend; + divisor = tmp.ResolveValue(exe_ctx); + dividend = stack.back().ResolveValue(exe_ctx); + divisor.MakeSigned(); + dividend.MakeSigned(); + stack.back() = dividend / divisor; if (!stack.back().ResolveValue(exe_ctx).IsValid()) { if (error_ptr) error_ptr->SetErrorString("Divide failed."); diff --git a/lldb/test/API/commands/expression/signed-dw-op-div/Makefile b/lldb/test/API/commands/expression/signed-dw-op-div/Makefile new file mode 100644 --- /dev/null +++ b/lldb/test/API/commands/expression/signed-dw-op-div/Makefile @@ -0,0 +1,4 @@ +C_SOURCES := main.c +CFLAGS_EXTRAS := -g -O1 + +include Makefile.rules diff --git a/lldb/test/API/commands/expression/signed-dw-op-div/TestSignedDiv.py b/lldb/test/API/commands/expression/signed-dw-op-div/TestSignedDiv.py new file mode 100644 --- /dev/null +++ b/lldb/test/API/commands/expression/signed-dw-op-div/TestSignedDiv.py @@ -0,0 +1,14 @@ +"""Test that we can print values that represented via DW_OP_div""" + +import lldb +from lldbsuite.test.lldbtest import * + +class SignedDivTestCase(TestBase): + def test_signed_div(self): + """Test that we can print values that represented via DW_OP_div""" + self.build() + _, process, _, bkpt = lldbutil.run_to_source_breakpoint(self, '// break here', lldb.SBFileSpec('main.c')) + self.expect_expr('i', result_type='uint32_t', result_value='0') + for i in range(1, 10): + lldbutil.continue_to_breakpoint(process, bkpt) + self.expect_expr('i', result_type='uint32_t', result_value=str(i)) diff --git a/lldb/test/API/commands/expression/signed-dw-op-div/main.c b/lldb/test/API/commands/expression/signed-dw-op-div/main.c new file mode 100644 --- /dev/null +++ b/lldb/test/API/commands/expression/signed-dw-op-div/main.c @@ -0,0 +1,14 @@ +#include "stdint.h" +static volatile uint64_t g = 0; + +static const int32_t f() { + uint32_t i; + for (i = 0; (i != 10); i++) + ++g; // break here + return 0; +} + +int main() { + f(); + return 0; +}