https://github.com/eronnen updated https://github.com/llvm/llvm-project/pull/136755
>From c1c072875b9a7ad3d11a03d3c1e4a8b6452749f9 Mon Sep 17 00:00:00 2001 From: Ely Ronnen <elyron...@gmail.com> Date: Tue, 22 Apr 2025 21:58:19 +0200 Subject: [PATCH 1/3] [lldb-dap]: show load addresses in disassembly --- lldb/include/lldb/API/SBFrame.h | 1 + lldb/include/lldb/API/SBInstructionList.h | 7 +++-- lldb/source/API/SBInstructionList.cpp | 29 ++++++++++++++----- .../lldb-dap/Handler/SourceRequestHandler.cpp | 2 +- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/lldb/include/lldb/API/SBFrame.h b/lldb/include/lldb/API/SBFrame.h index 3635ee5a537ad..66db059d531a8 100644 --- a/lldb/include/lldb/API/SBFrame.h +++ b/lldb/include/lldb/API/SBFrame.h @@ -221,6 +221,7 @@ class LLDB_API SBFrame { friend class SBBlock; friend class SBExecutionContext; friend class SBInstruction; + friend class SBInstructionList; friend class SBThread; friend class SBValue; diff --git a/lldb/include/lldb/API/SBInstructionList.h b/lldb/include/lldb/API/SBInstructionList.h index 4c26ec9a294e0..b337c91721653 100644 --- a/lldb/include/lldb/API/SBInstructionList.h +++ b/lldb/include/lldb/API/SBInstructionList.h @@ -54,6 +54,10 @@ class LLDB_API SBInstructionList { bool GetDescription(lldb::SBStream &description); + // Writes assembly instructions to `description` with load addresses using + // `frame`. + bool GetDescription(lldb::SBStream &description, lldb::SBFrame &frame); + bool DumpEmulationForAllInstructions(const char *triple); protected: @@ -62,8 +66,7 @@ class LLDB_API SBInstructionList { friend class SBTarget; void SetDisassembler(const lldb::DisassemblerSP &opaque_sp); - bool GetDescription(lldb_private::Stream &description); - + bool GetDescription(lldb_private::Stream &description, lldb::SBFrame *frame); private: lldb::DisassemblerSP m_opaque_sp; diff --git a/lldb/source/API/SBInstructionList.cpp b/lldb/source/API/SBInstructionList.cpp index c18204375dff1..79432e8c6c91a 100644 --- a/lldb/source/API/SBInstructionList.cpp +++ b/lldb/source/API/SBInstructionList.cpp @@ -15,8 +15,10 @@ #include "lldb/Core/Module.h" #include "lldb/Host/StreamFile.h" #include "lldb/Symbol/SymbolContext.h" +#include "lldb/Target/ExecutionContext.h" #include "lldb/Utility/Instrumentation.h" #include "lldb/Utility/Stream.h" +#include <memory> using namespace lldb; using namespace lldb_private; @@ -114,7 +116,7 @@ void SBInstructionList::Print(FILE *out) { if (out == nullptr) return; StreamFile stream(out, false); - GetDescription(stream); + GetDescription(stream, nullptr); } void SBInstructionList::Print(SBFile out) { @@ -122,7 +124,7 @@ void SBInstructionList::Print(SBFile out) { if (!out.IsValid()) return; StreamFile stream(out.m_opaque_sp); - GetDescription(stream); + GetDescription(stream, nullptr); } void SBInstructionList::Print(FileSP out_sp) { @@ -130,15 +132,21 @@ void SBInstructionList::Print(FileSP out_sp) { if (!out_sp || !out_sp->IsValid()) return; StreamFile stream(out_sp); - GetDescription(stream); + GetDescription(stream, nullptr); } bool SBInstructionList::GetDescription(lldb::SBStream &stream) { LLDB_INSTRUMENT_VA(this, stream); - return GetDescription(stream.ref()); + return GetDescription(stream.ref(), nullptr); } -bool SBInstructionList::GetDescription(Stream &sref) { +bool SBInstructionList::GetDescription(lldb::SBStream &stream, + lldb::SBFrame &frame) { + LLDB_INSTRUMENT_VA(this, stream); + return GetDescription(stream.ref(), &frame); +} + +bool SBInstructionList::GetDescription(Stream &sref, lldb::SBFrame *frame) { if (m_opaque_sp) { size_t num_instructions = GetSize(); @@ -148,10 +156,15 @@ bool SBInstructionList::GetDescription(Stream &sref) { const uint32_t max_opcode_byte_size = m_opaque_sp->GetInstructionList().GetMaxOpcocdeByteSize(); FormatEntity::Entry format; - FormatEntity::Parse("${addr}: ", format); + FormatEntity::Parse("${addr-file-or-load}: ", format); SymbolContext sc; SymbolContext prev_sc; + std::shared_ptr<ExecutionContext> exec_ctx; + if (nullptr != frame) { + exec_ctx = std::make_shared<ExecutionContext>(frame->GetFrameSP()); + } + // Expected address of the next instruction. Used to print an empty line // for non-contiguous blocks of insns. std::optional<Address> next_addr; @@ -172,8 +185,8 @@ bool SBInstructionList::GetDescription(Stream &sref) { if (next_addr && *next_addr != addr) sref.EOL(); inst->Dump(&sref, max_opcode_byte_size, true, false, - /*show_control_flow_kind=*/false, nullptr, &sc, &prev_sc, - &format, 0); + /*show_control_flow_kind=*/false, exec_ctx.get(), &sc, + &prev_sc, &format, 0); sref.EOL(); next_addr = addr; next_addr->Slide(inst->GetOpcode().GetByteSize()); diff --git a/lldb/tools/lldb-dap/Handler/SourceRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/SourceRequestHandler.cpp index 1a7a13d9f267a..bd4fc981475f4 100644 --- a/lldb/tools/lldb-dap/Handler/SourceRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/SourceRequestHandler.cpp @@ -43,7 +43,7 @@ SourceRequestHandler::Run(const protocol::SourceArguments &args) const { lldb::SBInstructionList insts = frame.GetSymbol().GetInstructions(dap.target); lldb::SBStream stream; - insts.GetDescription(stream); + insts.GetDescription(stream, frame); return protocol::SourceResponseBody{/*content=*/stream.GetData(), /*mimeType=*/"text/x-lldb.disassembly"}; >From cb037880698f8df5ac37eba9cc9f90275f2a500e Mon Sep 17 00:00:00 2001 From: Ely Ronnen <elyron...@gmail.com> Date: Wed, 23 Apr 2025 01:06:43 +0200 Subject: [PATCH 2/3] using SBExecutionContext parameter instead of SBFrame --- lldb/include/lldb/API/SBExecutionContext.h | 1 + lldb/include/lldb/API/SBFrame.h | 1 - lldb/include/lldb/API/SBInstructionList.h | 8 ++++--- lldb/source/API/SBInstructionList.cpp | 24 ++++++++++--------- .../lldb-dap/Handler/SourceRequestHandler.cpp | 4 +++- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/lldb/include/lldb/API/SBExecutionContext.h b/lldb/include/lldb/API/SBExecutionContext.h index e1e08fe3f4aae..20584271ff36c 100644 --- a/lldb/include/lldb/API/SBExecutionContext.h +++ b/lldb/include/lldb/API/SBExecutionContext.h @@ -55,6 +55,7 @@ class LLDB_API SBExecutionContext { SBFrame GetFrame() const; protected: + friend class SBInstructionList; friend class lldb_private::python::SWIGBridge; friend class lldb_private::ScriptInterpreter; diff --git a/lldb/include/lldb/API/SBFrame.h b/lldb/include/lldb/API/SBFrame.h index 66db059d531a8..3635ee5a537ad 100644 --- a/lldb/include/lldb/API/SBFrame.h +++ b/lldb/include/lldb/API/SBFrame.h @@ -221,7 +221,6 @@ class LLDB_API SBFrame { friend class SBBlock; friend class SBExecutionContext; friend class SBInstruction; - friend class SBInstructionList; friend class SBThread; friend class SBValue; diff --git a/lldb/include/lldb/API/SBInstructionList.h b/lldb/include/lldb/API/SBInstructionList.h index b337c91721653..aafbe80a80cba 100644 --- a/lldb/include/lldb/API/SBInstructionList.h +++ b/lldb/include/lldb/API/SBInstructionList.h @@ -55,8 +55,9 @@ class LLDB_API SBInstructionList { bool GetDescription(lldb::SBStream &description); // Writes assembly instructions to `description` with load addresses using - // `frame`. - bool GetDescription(lldb::SBStream &description, lldb::SBFrame &frame); + // `exe_ctx`. + bool GetDescription(lldb::SBStream &description, + lldb::SBExecutionContext &exe_ctx); bool DumpEmulationForAllInstructions(const char *triple); @@ -66,7 +67,8 @@ class LLDB_API SBInstructionList { friend class SBTarget; void SetDisassembler(const lldb::DisassemblerSP &opaque_sp); - bool GetDescription(lldb_private::Stream &description, lldb::SBFrame *frame); + bool GetDescription(lldb_private::Stream &description, + lldb::SBExecutionContext *exe_ctx = nullptr); private: lldb::DisassemblerSP m_opaque_sp; diff --git a/lldb/source/API/SBInstructionList.cpp b/lldb/source/API/SBInstructionList.cpp index 79432e8c6c91a..8169392fcd1a4 100644 --- a/lldb/source/API/SBInstructionList.cpp +++ b/lldb/source/API/SBInstructionList.cpp @@ -8,6 +8,7 @@ #include "lldb/API/SBInstructionList.h" #include "lldb/API/SBAddress.h" +#include "lldb/API/SBExecutionContext.h" #include "lldb/API/SBFile.h" #include "lldb/API/SBInstruction.h" #include "lldb/API/SBStream.h" @@ -116,7 +117,7 @@ void SBInstructionList::Print(FILE *out) { if (out == nullptr) return; StreamFile stream(out, false); - GetDescription(stream, nullptr); + GetDescription(stream); } void SBInstructionList::Print(SBFile out) { @@ -124,7 +125,7 @@ void SBInstructionList::Print(SBFile out) { if (!out.IsValid()) return; StreamFile stream(out.m_opaque_sp); - GetDescription(stream, nullptr); + GetDescription(stream); } void SBInstructionList::Print(FileSP out_sp) { @@ -132,21 +133,22 @@ void SBInstructionList::Print(FileSP out_sp) { if (!out_sp || !out_sp->IsValid()) return; StreamFile stream(out_sp); - GetDescription(stream, nullptr); + GetDescription(stream); } bool SBInstructionList::GetDescription(lldb::SBStream &stream) { LLDB_INSTRUMENT_VA(this, stream); - return GetDescription(stream.ref(), nullptr); + return GetDescription(stream.ref()); } bool SBInstructionList::GetDescription(lldb::SBStream &stream, - lldb::SBFrame &frame) { + lldb::SBExecutionContext &exe_ctx) { LLDB_INSTRUMENT_VA(this, stream); - return GetDescription(stream.ref(), &frame); + return GetDescription(stream.ref(), &exe_ctx); } -bool SBInstructionList::GetDescription(Stream &sref, lldb::SBFrame *frame) { +bool SBInstructionList::GetDescription(Stream &sref, + lldb::SBExecutionContext *exe_ctx) { if (m_opaque_sp) { size_t num_instructions = GetSize(); @@ -160,9 +162,9 @@ bool SBInstructionList::GetDescription(Stream &sref, lldb::SBFrame *frame) { SymbolContext sc; SymbolContext prev_sc; - std::shared_ptr<ExecutionContext> exec_ctx; - if (nullptr != frame) { - exec_ctx = std::make_shared<ExecutionContext>(frame->GetFrameSP()); + std::shared_ptr<ExecutionContext> exe_ctx_ptr; + if (nullptr != exe_ctx) { + exe_ctx_ptr = std::make_shared<ExecutionContext>(exe_ctx->get()); } // Expected address of the next instruction. Used to print an empty line @@ -185,7 +187,7 @@ bool SBInstructionList::GetDescription(Stream &sref, lldb::SBFrame *frame) { if (next_addr && *next_addr != addr) sref.EOL(); inst->Dump(&sref, max_opcode_byte_size, true, false, - /*show_control_flow_kind=*/false, exec_ctx.get(), &sc, + /*show_control_flow_kind=*/false, exe_ctx_ptr.get(), &sc, &prev_sc, &format, 0); sref.EOL(); next_addr = addr; diff --git a/lldb/tools/lldb-dap/Handler/SourceRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/SourceRequestHandler.cpp index bd4fc981475f4..327198bab0395 100644 --- a/lldb/tools/lldb-dap/Handler/SourceRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/SourceRequestHandler.cpp @@ -11,6 +11,7 @@ #include "LLDBUtils.h" #include "Protocol/ProtocolRequests.h" #include "Protocol/ProtocolTypes.h" +#include "lldb/API/SBExecutionContext.h" #include "lldb/API/SBFrame.h" #include "lldb/API/SBInstructionList.h" #include "lldb/API/SBProcess.h" @@ -43,7 +44,8 @@ SourceRequestHandler::Run(const protocol::SourceArguments &args) const { lldb::SBInstructionList insts = frame.GetSymbol().GetInstructions(dap.target); lldb::SBStream stream; - insts.GetDescription(stream, frame); + lldb::SBExecutionContext exe_ctx(frame); + insts.GetDescription(stream, exe_ctx); return protocol::SourceResponseBody{/*content=*/stream.GetData(), /*mimeType=*/"text/x-lldb.disassembly"}; >From 70d9ce366d76f4ab6e6a3be10166f957d394cbcf Mon Sep 17 00:00:00 2001 From: Ely Ronnen <elyron...@gmail.com> Date: Wed, 23 Apr 2025 01:41:16 +0200 Subject: [PATCH 3/3] cleaner SBInstructionList::GetDescription --- lldb/include/lldb/API/SBInstructionList.h | 2 +- lldb/source/API/SBInstructionList.cpp | 17 ++++++----------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/lldb/include/lldb/API/SBInstructionList.h b/lldb/include/lldb/API/SBInstructionList.h index aafbe80a80cba..4c6bab9c8ccc7 100644 --- a/lldb/include/lldb/API/SBInstructionList.h +++ b/lldb/include/lldb/API/SBInstructionList.h @@ -68,7 +68,7 @@ class LLDB_API SBInstructionList { void SetDisassembler(const lldb::DisassemblerSP &opaque_sp); bool GetDescription(lldb_private::Stream &description, - lldb::SBExecutionContext *exe_ctx = nullptr); + lldb_private::ExecutionContext *exe_ctx = nullptr); private: lldb::DisassemblerSP m_opaque_sp; diff --git a/lldb/source/API/SBInstructionList.cpp b/lldb/source/API/SBInstructionList.cpp index 8169392fcd1a4..0d958c6ae93ef 100644 --- a/lldb/source/API/SBInstructionList.cpp +++ b/lldb/source/API/SBInstructionList.cpp @@ -19,7 +19,6 @@ #include "lldb/Target/ExecutionContext.h" #include "lldb/Utility/Instrumentation.h" #include "lldb/Utility/Stream.h" -#include <memory> using namespace lldb; using namespace lldb_private; @@ -144,11 +143,12 @@ bool SBInstructionList::GetDescription(lldb::SBStream &stream) { bool SBInstructionList::GetDescription(lldb::SBStream &stream, lldb::SBExecutionContext &exe_ctx) { LLDB_INSTRUMENT_VA(this, stream); - return GetDescription(stream.ref(), &exe_ctx); + ExecutionContext exe_ctx_wrapper(exe_ctx.get()); + return GetDescription(stream.ref(), &exe_ctx_wrapper); } -bool SBInstructionList::GetDescription(Stream &sref, - lldb::SBExecutionContext *exe_ctx) { +bool SBInstructionList::GetDescription( + Stream &sref, lldb_private::ExecutionContext *exe_ctx) { if (m_opaque_sp) { size_t num_instructions = GetSize(); @@ -162,11 +162,6 @@ bool SBInstructionList::GetDescription(Stream &sref, SymbolContext sc; SymbolContext prev_sc; - std::shared_ptr<ExecutionContext> exe_ctx_ptr; - if (nullptr != exe_ctx) { - exe_ctx_ptr = std::make_shared<ExecutionContext>(exe_ctx->get()); - } - // Expected address of the next instruction. Used to print an empty line // for non-contiguous blocks of insns. std::optional<Address> next_addr; @@ -187,8 +182,8 @@ bool SBInstructionList::GetDescription(Stream &sref, if (next_addr && *next_addr != addr) sref.EOL(); inst->Dump(&sref, max_opcode_byte_size, true, false, - /*show_control_flow_kind=*/false, exe_ctx_ptr.get(), &sc, - &prev_sc, &format, 0); + /*show_control_flow_kind=*/false, exe_ctx, &sc, &prev_sc, + &format, 0); sref.EOL(); next_addr = addr; next_addr->Slide(inst->GetOpcode().GetByteSize()); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits