//===----------------------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// #include "lldb/Target/BorrowedStackFrame.h" using namespace lldb; using namespace lldb_private; char BorrowedStackFrame::ID; BorrowedStackFrame::BorrowedStackFrame( StackFrameSP borrowed_frame_sp, uint32_t new_frame_index, std::optional new_concrete_frame_index) : StackFrame( borrowed_frame_sp->GetThread(), new_frame_index, borrowed_frame_sp->GetConcreteFrameIndex(), borrowed_frame_sp->GetRegisterContextSP(), borrowed_frame_sp->GetStackID().GetPC(), borrowed_frame_sp->GetStackID().GetCallFrameAddressWithoutMetadata(), borrowed_frame_sp->m_behaves_like_zeroth_frame, &borrowed_frame_sp->GetSymbolContext(eSymbolContextEverything)), m_borrowed_frame_sp(borrowed_frame_sp), m_new_frame_index(new_frame_index) { if (new_concrete_frame_index) m_new_concrete_frame_index = *new_concrete_frame_index; else m_new_concrete_frame_index = IsInlined() ? LLDB_INVALID_FRAME_ID : new_frame_index; } uint32_t BorrowedStackFrame::GetFrameIndex() const { return m_new_frame_index; } void BorrowedStackFrame::SetFrameIndex(uint32_t index) { m_new_frame_index = index; } uint32_t BorrowedStackFrame::GetConcreteFrameIndex() { // FIXME: We need to find where the concrete frame into which this frame was // inlined landed in the new stack frame list as that is the correct concrete // frame index in this // stack frame. return m_new_concrete_frame_index; } StackID &BorrowedStackFrame::GetStackID() { return m_borrowed_frame_sp->GetStackID(); } const Address &BorrowedStackFrame::GetFrameCodeAddress() { return m_borrowed_frame_sp->GetFrameCodeAddress(); } Address BorrowedStackFrame::GetFrameCodeAddressForSymbolication() { return m_borrowed_frame_sp->GetFrameCodeAddressForSymbolication(); } bool BorrowedStackFrame::ChangePC(addr_t pc) { return m_borrowed_frame_sp->ChangePC(pc); } const SymbolContext & BorrowedStackFrame::GetSymbolContext(SymbolContextItem resolve_scope) { return m_borrowed_frame_sp->GetSymbolContext(resolve_scope); } llvm::Error BorrowedStackFrame::GetFrameBaseValue(Scalar &value) { return m_borrowed_frame_sp->GetFrameBaseValue(value); } DWARFExpressionList * BorrowedStackFrame::GetFrameBaseExpression(Status *error_ptr) { return m_borrowed_frame_sp->GetFrameBaseExpression(error_ptr); } Block *BorrowedStackFrame::GetFrameBlock() { return m_borrowed_frame_sp->GetFrameBlock(); } RegisterContextSP BorrowedStackFrame::GetRegisterContext() { return m_borrowed_frame_sp->GetRegisterContext(); } VariableList *BorrowedStackFrame::GetVariableList(bool get_file_globals, Status *error_ptr) { return m_borrowed_frame_sp->GetVariableList(get_file_globals, error_ptr); } VariableListSP BorrowedStackFrame::GetInScopeVariableList(bool get_file_globals, bool must_have_valid_location) { return m_borrowed_frame_sp->GetInScopeVariableList(get_file_globals, must_have_valid_location); } ValueObjectSP BorrowedStackFrame::GetValueForVariableExpressionPath( llvm::StringRef var_expr, DynamicValueType use_dynamic, uint32_t options, VariableSP &var_sp, Status &error) { return m_borrowed_frame_sp->GetValueForVariableExpressionPath( var_expr, use_dynamic, options, var_sp, error); } bool BorrowedStackFrame::HasDebugInformation() { return m_borrowed_frame_sp->HasDebugInformation(); } const char *BorrowedStackFrame::Disassemble() { return m_borrowed_frame_sp->Disassemble(); } ValueObjectSP BorrowedStackFrame::GetValueObjectForFrameVariable( const VariableSP &variable_sp, DynamicValueType use_dynamic) { return m_borrowed_frame_sp->GetValueObjectForFrameVariable(variable_sp, use_dynamic); } bool BorrowedStackFrame::IsInlined() { return m_borrowed_frame_sp->IsInlined(); } bool BorrowedStackFrame::IsSynthetic() const { return m_borrowed_frame_sp->IsSynthetic(); } bool BorrowedStackFrame::IsHistorical() const { return m_borrowed_frame_sp->IsHistorical(); } bool BorrowedStackFrame::IsArtificial() const { return m_borrowed_frame_sp->IsArtificial(); } bool BorrowedStackFrame::IsHidden() { return m_borrowed_frame_sp->IsHidden(); } const char *BorrowedStackFrame::GetFunctionName() { return m_borrowed_frame_sp->GetFunctionName(); } const char *BorrowedStackFrame::GetDisplayFunctionName() { return m_borrowed_frame_sp->GetDisplayFunctionName(); } ValueObjectSP BorrowedStackFrame::FindVariable(ConstString name) { return m_borrowed_frame_sp->FindVariable(name); } SourceLanguage BorrowedStackFrame::GetLanguage() { return m_borrowed_frame_sp->GetLanguage(); } SourceLanguage BorrowedStackFrame::GuessLanguage() { return m_borrowed_frame_sp->GuessLanguage(); } ValueObjectSP BorrowedStackFrame::GuessValueForAddress(addr_t addr) { return m_borrowed_frame_sp->GuessValueForAddress(addr); } ValueObjectSP BorrowedStackFrame::GuessValueForRegisterAndOffset(ConstString reg, int64_t offset) { return m_borrowed_frame_sp->GuessValueForRegisterAndOffset(reg, offset); } StructuredData::ObjectSP BorrowedStackFrame::GetLanguageSpecificData() { return m_borrowed_frame_sp->GetLanguageSpecificData(); } RecognizedStackFrameSP BorrowedStackFrame::GetRecognizedFrame() { return m_borrowed_frame_sp->GetRecognizedFrame(); } StackFrameSP BorrowedStackFrame::GetBorrowedFrame() const { return m_borrowed_frame_sp; } bool BorrowedStackFrame::isA(const void *ClassID) const { return ClassID == &ID || StackFrame::isA(ClassID); } bool BorrowedStackFrame::classof(const StackFrame *obj) { return obj->isA(&ID); }