https://github.com/eronnen created https://github.com/llvm/llvm-project/pull/136486
Fix wrong assembly line number calculation that assumes the instruction size is `GetAddressByteSize() / 2` >From 0efcbcfa2383e8ffac29904af90313f04bcdfa4a Mon Sep 17 00:00:00 2001 From: Ely Ronnen <elyron...@gmail.com> Date: Sun, 20 Apr 2025 14:27:53 +0200 Subject: [PATCH] fix wrong assembly line number when debugging assembly with different sized instructions --- .../Handler/StackTraceRequestHandler.cpp | 3 ++- lldb/tools/lldb-dap/JSONUtils.cpp | 22 ++++++++++++++----- lldb/tools/lldb-dap/JSONUtils.h | 7 ++++-- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/lldb/tools/lldb-dap/Handler/StackTraceRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/StackTraceRequestHandler.cpp index a58e3325af100..5d1d2835b4392 100644 --- a/lldb/tools/lldb-dap/Handler/StackTraceRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/StackTraceRequestHandler.cpp @@ -67,7 +67,8 @@ static bool FillStackFrames(DAP &dap, lldb::SBThread &thread, break; } - stack_frames.emplace_back(CreateStackFrame(frame, dap.frame_format)); + stack_frames.emplace_back( + CreateStackFrame(frame, dap.frame_format, dap.target)); } if (dap.configuration.displayExtendedBacktrace && reached_end_of_stack) { diff --git a/lldb/tools/lldb-dap/JSONUtils.cpp b/lldb/tools/lldb-dap/JSONUtils.cpp index 33f10c93d2ada..552fdc9439845 100644 --- a/lldb/tools/lldb-dap/JSONUtils.cpp +++ b/lldb/tools/lldb-dap/JSONUtils.cpp @@ -19,6 +19,8 @@ #include "lldb/API/SBFileSpec.h" #include "lldb/API/SBFrame.h" #include "lldb/API/SBFunction.h" +#include "lldb/API/SBInstruction.h" +#include "lldb/API/SBInstructionList.h" #include "lldb/API/SBLineEntry.h" #include "lldb/API/SBModule.h" #include "lldb/API/SBQueue.h" @@ -719,8 +721,8 @@ llvm::json::Value CreateSource(llvm::StringRef source_path) { // }, // "required": [ "id", "name", "line", "column" ] // } -llvm::json::Value CreateStackFrame(lldb::SBFrame &frame, - lldb::SBFormat &format) { +llvm::json::Value CreateStackFrame(lldb::SBFrame &frame, lldb::SBFormat &format, + lldb::SBTarget &target) { llvm::json::Object object; int64_t frame_id = MakeDAPFrameID(frame); object.try_emplace("id", frame_id); @@ -776,10 +778,18 @@ llvm::json::Value CreateStackFrame(lldb::SBFrame &frame, // Calculate the line of the current PC from the start of the current // symbol. - lldb::addr_t inst_offset = frame.GetPCAddress().GetOffset() - - frame.GetSymbol().GetStartAddress().GetOffset(); - lldb::addr_t inst_line = - inst_offset / (frame.GetThread().GetProcess().GetAddressByteSize() / 2); + lldb::SBAddress current_address = frame.GetPCAddress(); + lldb::SBInstructionList inst_list = + frame.GetSymbol().GetInstructions(target); + size_t inst_line = 0; + for (size_t i = 0; i < inst_list.GetSize(); ++i) { + lldb::SBInstruction inst = inst_list.GetInstructionAtIndex(i); + if (inst.GetAddress() == current_address) { + inst_line = i; + break; + } + } + // Line numbers are 1-based. object.try_emplace("line", inst_line + 1); object.try_emplace("column", 1); diff --git a/lldb/tools/lldb-dap/JSONUtils.h b/lldb/tools/lldb-dap/JSONUtils.h index b8c53353bf42d..ffa10743501b8 100644 --- a/lldb/tools/lldb-dap/JSONUtils.h +++ b/lldb/tools/lldb-dap/JSONUtils.h @@ -363,11 +363,14 @@ llvm::json::Value CreateSource(llvm::StringRef source_path); /// The LLDB format to use when populating out the "StackFrame" /// object. /// +/// \param[in] target +/// The LLDB target to use when populating out the "StackFrame" +/// object. /// \return /// A "StackFrame" JSON object with that follows the formal JSON /// definition outlined by Microsoft. -llvm::json::Value CreateStackFrame(lldb::SBFrame &frame, - lldb::SBFormat &format); +llvm::json::Value CreateStackFrame(lldb::SBFrame &frame, lldb::SBFormat &format, + lldb::SBTarget &target); /// Create a "StackFrame" label object for a LLDB thread. /// _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits