jwnhy updated this revision to Diff 510285. jwnhy added a comment. Update the patch to include a small regression test.
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D147370/new/ https://reviews.llvm.org/D147370 Files: lldb/source/Expression/DWARFExpression.cpp lldb/test/API/commands/expression/signed-dw-op-div/Makefile lldb/test/API/commands/expression/signed-dw-op-div/TestSignedDiv.py lldb/test/API/commands/expression/signed-dw-op-div/main.c Index: lldb/test/API/commands/expression/signed-dw-op-div/main.c =================================================================== --- /dev/null +++ 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; +} Index: lldb/test/API/commands/expression/signed-dw-op-div/TestSignedDiv.py =================================================================== --- /dev/null +++ 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)) Index: lldb/test/API/commands/expression/signed-dw-op-div/Makefile =================================================================== --- /dev/null +++ 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 Index: lldb/source/Expression/DWARFExpression.cpp =================================================================== --- lldb/source/Expression/DWARFExpression.cpp +++ 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.");
Index: lldb/test/API/commands/expression/signed-dw-op-div/main.c =================================================================== --- /dev/null +++ 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; +} Index: lldb/test/API/commands/expression/signed-dw-op-div/TestSignedDiv.py =================================================================== --- /dev/null +++ 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)) Index: lldb/test/API/commands/expression/signed-dw-op-div/Makefile =================================================================== --- /dev/null +++ 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 Index: lldb/source/Expression/DWARFExpression.cpp =================================================================== --- lldb/source/Expression/DWARFExpression.cpp +++ 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.");
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits