https://github.com/charles-zablit updated https://github.com/llvm/llvm-project/pull/167550
>From 52eb5a9396fb2c667fd070b4cb4e914022005d6d Mon Sep 17 00:00:00 2001 From: Charles Zablit <[email protected]> Date: Wed, 10 Dec 2025 15:37:03 +0000 Subject: [PATCH] [lldb] add a marker before skipped frames --- lldb/include/lldb/Target/StackFrame.h | 4 +- lldb/include/lldb/Target/StackFrameList.h | 13 +++++- lldb/source/Target/StackFrame.cpp | 5 +- lldb/source/Target/StackFrameList.cpp | 57 ++++++++++++++++------- lldb/source/Target/Thread.cpp | 6 +-- 5 files changed, 61 insertions(+), 24 deletions(-) diff --git a/lldb/include/lldb/Target/StackFrame.h b/lldb/include/lldb/Target/StackFrame.h index 46922448d6e59..0d07515bf0f13 100644 --- a/lldb/include/lldb/Target/StackFrame.h +++ b/lldb/include/lldb/Target/StackFrame.h @@ -363,7 +363,7 @@ class StackFrame : public ExecutionContextScope, /// \param [in] frame_marker /// Optional string that will be prepended to the frame output description. virtual void DumpUsingSettingsFormat(Stream *strm, bool show_unique = false, - const char *frame_marker = nullptr); + const llvm::StringRef frame_marker = ""); /// Print a description for this frame using a default format. /// @@ -400,7 +400,7 @@ class StackFrame : public ExecutionContextScope, /// Returns true if successful. virtual bool GetStatus(Stream &strm, bool show_frame_info, bool show_source, bool show_unique = false, - const char *frame_marker = nullptr); + const llvm::StringRef frame_marker = ""); /// Query whether this frame is a concrete frame on the call stack, or if it /// is an inlined frame derived from the debug information and presented by diff --git a/lldb/include/lldb/Target/StackFrameList.h b/lldb/include/lldb/Target/StackFrameList.h index 539c070ff0f4b..c5b74522be0bb 100644 --- a/lldb/include/lldb/Target/StackFrameList.h +++ b/lldb/include/lldb/Target/StackFrameList.h @@ -49,6 +49,17 @@ class StackFrameList : public std::enable_shared_from_this<StackFrameList> { /// Resets the selected frame index of this object. void ClearSelectedFrameIndex(); + /// Returns \code true if the next frame is hidden. + bool IsNextFrameHidden(lldb_private::StackFrame &frame); + + /// Returns \code true if the previous frame is hidden. + bool IsPreviousFrameHidden(lldb_private::StackFrame &frame); + + /// Returns the stack frame marker based on the whether the terminal supports + /// Unicode. + std::wstring FrameMarker(lldb::StackFrameSP frame_sp, + lldb::StackFrameSP selected_frame_sp); + /// Get the currently selected frame index. /// We should only call SelectMostRelevantFrame if (a) the user hasn't already /// selected a frame, and (b) if this really is a user facing @@ -96,7 +107,7 @@ class StackFrameList : public std::enable_shared_from_this<StackFrameList> { size_t GetStatus(Stream &strm, uint32_t first_frame, uint32_t num_frames, bool show_frame_info, uint32_t num_frames_with_source, bool show_unique = false, bool show_hidden = false, - const char *frame_marker = nullptr); + bool show_selected_frame = false); /// Returns whether we have currently fetched all the frames of a stack. bool WereAllFramesFetched() const; diff --git a/lldb/source/Target/StackFrame.cpp b/lldb/source/Target/StackFrame.cpp index 3bbb851b88007..7988473069668 100644 --- a/lldb/source/Target/StackFrame.cpp +++ b/lldb/source/Target/StackFrame.cpp @@ -1945,7 +1945,7 @@ bool StackFrame::DumpUsingFormat(Stream &strm, } void StackFrame::DumpUsingSettingsFormat(Stream *strm, bool show_unique, - const char *frame_marker) { + const llvm::StringRef frame_marker) { if (strm == nullptr) return; @@ -2044,7 +2044,8 @@ bool StackFrame::HasCachedData() const { } bool StackFrame::GetStatus(Stream &strm, bool show_frame_info, bool show_source, - bool show_unique, const char *frame_marker) { + bool show_unique, + const llvm::StringRef frame_marker) { if (show_frame_info) { strm.Indent(); DumpUsingSettingsFormat(&strm, show_unique, frame_marker); diff --git a/lldb/source/Target/StackFrameList.cpp b/lldb/source/Target/StackFrameList.cpp index 896a760f61d26..cadad17a75212 100644 --- a/lldb/source/Target/StackFrameList.cpp +++ b/lldb/source/Target/StackFrameList.cpp @@ -27,6 +27,7 @@ #include "lldb/Utility/LLDBLog.h" #include "lldb/Utility/Log.h" #include "llvm/ADT/SmallPtrSet.h" +#include "llvm/Support/ConvertUTF.h" #include <memory> @@ -928,11 +929,42 @@ StackFrameList::GetStackFrameSPForStackFramePtr(StackFrame *stack_frame_ptr) { return ret_sp; } +bool StackFrameList::IsNextFrameHidden(lldb_private::StackFrame &frame) { + uint32_t frame_idx = frame.GetFrameIndex(); + StackFrameSP frame_sp = GetFrameAtIndex(frame_idx + 1); + if (!frame_sp) + return false; + return frame_sp->IsHidden(); +} + +bool StackFrameList::IsPreviousFrameHidden(lldb_private::StackFrame &frame) { + uint32_t frame_idx = frame.GetFrameIndex(); + if (frame_idx == 0) + return false; + StackFrameSP frame_sp = GetFrameAtIndex(frame_idx - 1); + if (!frame_sp) + return false; + return frame_sp->IsHidden(); +} + +std::wstring StackFrameList::FrameMarker(lldb::StackFrameSP frame_sp, + lldb::StackFrameSP selected_frame_sp) { + if (frame_sp == selected_frame_sp) + return Terminal::SupportsUnicode() ? L" * " : L"* "; + else if (!Terminal::SupportsUnicode()) + return L" "; + else if (IsPreviousFrameHidden(*frame_sp)) + return L" ﹉"; + else if (IsNextFrameHidden(*frame_sp)) + return L" ﹍"; + return L" "; +} + size_t StackFrameList::GetStatus(Stream &strm, uint32_t first_frame, uint32_t num_frames, bool show_frame_info, uint32_t num_frames_with_source, bool show_unique, bool show_hidden, - const char *selected_frame_marker) { + bool show_selected_frame) { size_t num_frames_displayed = 0; if (num_frames == 0) @@ -950,25 +982,17 @@ size_t StackFrameList::GetStatus(Stream &strm, uint32_t first_frame, StackFrameSP selected_frame_sp = m_thread.GetSelectedFrame(DoNoSelectMostRelevantFrame); - const char *unselected_marker = nullptr; std::string buffer; - if (selected_frame_marker) { - size_t len = strlen(selected_frame_marker); - buffer.insert(buffer.begin(), len, ' '); - unselected_marker = buffer.c_str(); - } - const char *marker = nullptr; + std::wstring marker; for (frame_idx = first_frame; frame_idx < last_frame; ++frame_idx) { frame_sp = GetFrameAtIndex(frame_idx); if (!frame_sp) break; - if (selected_frame_marker != nullptr) { - if (frame_sp == selected_frame_sp) - marker = selected_frame_marker; - else - marker = unselected_marker; - } + if (show_selected_frame) + marker = FrameMarker(frame_sp, selected_frame_sp); + else + marker = FrameMarker(frame_sp, nullptr); // Hide uninteresting frames unless it's the selected frame. if (!show_hidden && frame_sp != selected_frame_sp && frame_sp->IsHidden()) @@ -982,10 +1006,11 @@ size_t StackFrameList::GetStatus(Stream &strm, uint32_t first_frame, m_thread.GetID(), num_frames_displayed)) break; - + std::string marker_utf8; + llvm::convertWideToUTF8(marker, marker_utf8); if (!frame_sp->GetStatus(strm, show_frame_info, num_frames_with_source > (first_frame - frame_idx), - show_unique, marker)) + show_unique, marker_utf8)) break; ++num_frames_displayed; } diff --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp index b40e753aca1e9..800099888b99a 100644 --- a/lldb/source/Target/Thread.cpp +++ b/lldb/source/Target/Thread.cpp @@ -1887,16 +1887,16 @@ size_t Thread::GetStatus(Stream &strm, uint32_t start_frame, const bool show_frame_info = true; const bool show_frame_unique = only_stacks; - const char *selected_frame_marker = nullptr; + bool show_selected_frame = false; if (num_frames == 1 || only_stacks || (GetID() != GetProcess()->GetThreadList().GetSelectedThread()->GetID())) strm.IndentMore(); else - selected_frame_marker = "* "; + show_selected_frame = true; num_frames_shown = GetStackFrameList()->GetStatus( strm, start_frame, num_frames, show_frame_info, num_frames_with_source, - show_frame_unique, show_hidden, selected_frame_marker); + show_frame_unique, show_hidden, show_selected_frame); if (num_frames == 1) strm.IndentLess(); strm.IndentLess(); _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
