[Lldb-commits] [lldb] [lldb/Target] Add BorrowedStackFrame and make StackFrame methods virtual (PR #170191)
Med Ismail Bennani via lldb-commits
lldb-commits at lists.llvm.org
Mon Dec 1 14:47:17 PST 2025
================
@@ -0,0 +1,193 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLDB_TARGET_BORROWEDSTACKFRAME_H
+#define LLDB_TARGET_BORROWEDSTACKFRAME_H
+
+#include "lldb/Target/StackFrame.h"
+
+namespace lldb_private {
+
+/// \class BorrowedStackFrame BorrowedStackFrame.h
+/// "lldb/Target/BorrowedStackFrame.h"
+///
+/// A wrapper around an existing StackFrame that supersedes its frame index.
+///
+/// This class is useful when you need to present an existing stack frame
+/// with a different index, such as when creating synthetic frame views or
+/// renumbering frames without copying all the underlying data.
+///
+/// All methods delegate to the borrowed frame except for GetFrameIndex()
+/// which uses the overridden index.
+
+class BorrowedStackFrame : public StackFrame {
+public:
+ /// Construct a BorrowedStackFrame that wraps an existing frame.
+ ///
+ /// \param [in] borrowed_frame_sp
+ /// The existing StackFrame to borrow from. This frame's data will be
+ /// used for all operations except frame index queries.
+ ///
+ /// \param [in] override_frame_index
+ /// The frame index to report instead of the borrowed frame's index.
+ BorrowedStackFrame(const lldb::StackFrameSP &borrowed_frame_sp,
+ uint32_t override_frame_index);
+
+ ~BorrowedStackFrame() override = default;
+
+ // Override frame index methods
+ uint32_t GetFrameIndex() const override { return m_override_frame_index; }
+ void SetFrameIndex(uint32_t index) { m_override_frame_index = index; }
+
+ uint32_t GetConcreteFrameIndex() const override {
+ return m_borrowed_frame_sp->GetConcreteFrameIndex();
+ }
+
+ // Delegate all other virtual methods to the borrowed frame
+ StackID &GetStackID() override { return m_borrowed_frame_sp->GetStackID(); }
+
+ const Address &GetFrameCodeAddress() override {
+ return m_borrowed_frame_sp->GetFrameCodeAddress();
+ }
+
+ Address GetFrameCodeAddressForSymbolication() override {
+ return m_borrowed_frame_sp->GetFrameCodeAddressForSymbolication();
+ }
+
+ bool ChangePC(lldb::addr_t pc) override {
+ return m_borrowed_frame_sp->ChangePC(pc);
+ }
+
+ const SymbolContext &
+ GetSymbolContext(lldb::SymbolContextItem resolve_scope) override {
+ return m_borrowed_frame_sp->GetSymbolContext(resolve_scope);
+ }
+
+ llvm::Error GetFrameBaseValue(Scalar &value) override {
+ return m_borrowed_frame_sp->GetFrameBaseValue(value);
+ }
+
+ DWARFExpressionList *GetFrameBaseExpression(Status *error_ptr) override {
+ return m_borrowed_frame_sp->GetFrameBaseExpression(error_ptr);
+ }
+
+ Block *GetFrameBlock() override {
+ return m_borrowed_frame_sp->GetFrameBlock();
+ }
+
+ lldb::RegisterContextSP GetRegisterContext() override {
+ return m_borrowed_frame_sp->GetRegisterContext();
+ }
+
+ VariableList *GetVariableList(bool get_file_globals,
+ Status *error_ptr) override {
+ return m_borrowed_frame_sp->GetVariableList(get_file_globals, error_ptr);
+ }
+
+ lldb::VariableListSP
+ GetInScopeVariableList(bool get_file_globals,
+ bool must_have_valid_location = false) override {
+ return m_borrowed_frame_sp->GetInScopeVariableList(
+ get_file_globals, must_have_valid_location);
+ }
+
+ lldb::ValueObjectSP GetValueForVariableExpressionPath(
+ llvm::StringRef var_expr, lldb::DynamicValueType use_dynamic,
+ uint32_t options, lldb::VariableSP &var_sp, Status &error) override {
+ return m_borrowed_frame_sp->GetValueForVariableExpressionPath(
+ var_expr, use_dynamic, options, var_sp, error);
+ }
+
+ bool HasDebugInformation() override {
+ return m_borrowed_frame_sp->HasDebugInformation();
+ }
+
+ const char *Disassemble() override {
+ return m_borrowed_frame_sp->Disassemble();
+ }
+
+ lldb::ValueObjectSP
+ GetValueObjectForFrameVariable(const lldb::VariableSP &variable_sp,
+ lldb::DynamicValueType use_dynamic) override {
+ return m_borrowed_frame_sp->GetValueObjectForFrameVariable(variable_sp,
+ use_dynamic);
+ }
+
+ bool IsInlined() override { return m_borrowed_frame_sp->IsInlined(); }
+
+ bool IsSynthetic() const override {
----------------
medismailben wrote:
Correct
https://github.com/llvm/llvm-project/pull/170191
More information about the lldb-commits
mailing list