180814287SRaphael Isemann //===-- SBFrame.cpp -------------------------------------------------------===// 230fdc8d8SChris Lattner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 630fdc8d8SChris Lattner // 730fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 830fdc8d8SChris Lattner 930fdc8d8SChris Lattner #include <algorithm> 10349213f9SGreg Clayton #include <set> 11dbb0abbfSEugene Zelenko #include <string> 12dbb0abbfSEugene Zelenko 13dbb0abbfSEugene Zelenko #include "lldb/API/SBFrame.h" 1430fdc8d8SChris Lattner 1530fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1630fdc8d8SChris Lattner 17baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h" 18bd4bf82aSJonas Devlieghere #include "Utils.h" 1930fdc8d8SChris Lattner #include "lldb/Core/Address.h" 2030fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2130fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h" 2230fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h" 23347ec0faSAlex Langford #include "lldb/Expression/ExpressionVariable.h" 24151c032cSJim Ingham #include "lldb/Expression/UserExpression.h" 251ba7c4d0SGreg Clayton #include "lldb/Host/Host.h" 2630fdc8d8SChris Lattner #include "lldb/Symbol/Block.h" 271f746071SGreg Clayton #include "lldb/Symbol/Function.h" 281f746071SGreg Clayton #include "lldb/Symbol/Symbol.h" 2930fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h" 3030fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h" 31b9c1b51eSKate Stone #include "lldb/Symbol/VariableList.h" 3230fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h" 3330fdc8d8SChris Lattner #include "lldb/Target/Process.h" 3430fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 35b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h" 3641ae8e74SKuba Mracek #include "lldb/Target/StackFrameRecognizer.h" 37b9556accSGreg Clayton #include "lldb/Target/StackID.h" 38b9c1b51eSKate Stone #include "lldb/Target/Target.h" 3930fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 40bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h" 41bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 4230fdc8d8SChris Lattner 434c5de699SEli Friedman #include "lldb/API/SBAddress.h" 44b9c1b51eSKate Stone #include "lldb/API/SBDebugger.h" 4535e1bda6SJim Ingham #include "lldb/API/SBExpressionOptions.h" 46dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 474c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h" 484c5de699SEli Friedman #include "lldb/API/SBThread.h" 49b9c1b51eSKate Stone #include "lldb/API/SBValue.h" 5051f96eebSZachary Turner #include "lldb/API/SBVariablesOptions.h" 5130fdc8d8SChris Lattner 52237c3ed9SSean Callanan #include "llvm/Support/PrettyStackTrace.h" 53237c3ed9SSean Callanan 5430fdc8d8SChris Lattner using namespace lldb; 5530fdc8d8SChris Lattner using namespace lldb_private; 5630fdc8d8SChris Lattner 57baf5664fSJonas Devlieghere SBFrame::SBFrame() : m_opaque_sp(new ExecutionContextRef()) { 58baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBFrame); 59baf5664fSJonas Devlieghere } 6030fdc8d8SChris Lattner 61b9c1b51eSKate Stone SBFrame::SBFrame(const StackFrameSP &lldb_object_sp) 62b9c1b51eSKate Stone : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) { 63baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBFrame, (const lldb::StackFrameSP &), 64baf5664fSJonas Devlieghere lldb_object_sp); 6530fdc8d8SChris Lattner } 6630fdc8d8SChris Lattner 67bd4bf82aSJonas Devlieghere SBFrame::SBFrame(const SBFrame &rhs) : m_opaque_sp() { 68baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBFrame, (const lldb::SBFrame &), rhs); 69baf5664fSJonas Devlieghere 70bd4bf82aSJonas Devlieghere m_opaque_sp = clone(rhs.m_opaque_sp); 71bd4bf82aSJonas Devlieghere } 72efabb123SGreg Clayton 73dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default; 74dbb0abbfSEugene Zelenko 75b9c1b51eSKate Stone const SBFrame &SBFrame::operator=(const SBFrame &rhs) { 76baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(const lldb::SBFrame &, 77baf5664fSJonas Devlieghere SBFrame, operator=,(const lldb::SBFrame &), rhs); 78baf5664fSJonas Devlieghere 79efabb123SGreg Clayton if (this != &rhs) 80bd4bf82aSJonas Devlieghere m_opaque_sp = clone(rhs.m_opaque_sp); 81306809f2SJonas Devlieghere return LLDB_RECORD_RESULT(*this); 82efabb123SGreg Clayton } 83efabb123SGreg Clayton 84b9c1b51eSKate Stone StackFrameSP SBFrame::GetFrameSP() const { 85dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetFrameSP() : StackFrameSP()); 86b9556accSGreg Clayton } 8730fdc8d8SChris Lattner 88b9c1b51eSKate Stone void SBFrame::SetFrameSP(const StackFrameSP &lldb_object_sp) { 897fdf9ef1SGreg Clayton return m_opaque_sp->SetFrameSP(lldb_object_sp); 90b9556accSGreg Clayton } 9130fdc8d8SChris Lattner 92b9c1b51eSKate Stone bool SBFrame::IsValid() const { 93baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsValid); 947f5237bcSPavel Labath return this->operator bool(); 957f5237bcSPavel Labath } 967f5237bcSPavel Labath SBFrame::operator bool() const { 977f5237bcSPavel Labath LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, operator bool); 98baf5664fSJonas Devlieghere 99bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 100bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1017fa7dc36SJim Ingham 1027fa7dc36SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 1037fa7dc36SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 104b9c1b51eSKate Stone if (target && process) { 1057fa7dc36SJim Ingham Process::StopLocker stop_locker; 1067fa7dc36SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 107dbb0abbfSEugene Zelenko return GetFrameSP().get() != nullptr; 10830fdc8d8SChris Lattner } 10930fdc8d8SChris Lattner 1107fa7dc36SJim Ingham // Without a target & process we can't have a valid stack frame. 1117fa7dc36SJim Ingham return false; 1127fa7dc36SJim Ingham } 1137fa7dc36SJim Ingham 114b9c1b51eSKate Stone SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const { 115baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(lldb::SBSymbolContext, SBFrame, GetSymbolContext, 116baf5664fSJonas Devlieghere (uint32_t), resolve_scope); 117baf5664fSJonas Devlieghere 11830fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 119bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 120bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 121991e4453SZachary Turner SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope); 122dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 123d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1247730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 125b9c1b51eSKate Stone if (target && process) { 1267fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 127b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1287730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 129581af8b0SJonas Devlieghere if (frame) 130991e4453SZachary Turner sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext(scope)); 131c9858e4dSGreg Clayton } 1327fdf9ef1SGreg Clayton } 133ceb6b139SCaroline Tice 134baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_sym_ctx); 13530fdc8d8SChris Lattner } 13630fdc8d8SChris Lattner 137b9c1b51eSKate Stone SBModule SBFrame::GetModule() const { 138baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBModule, SBFrame, GetModule); 139baf5664fSJonas Devlieghere 14072eff18aSGreg Clayton SBModule sb_module; 141acdbe816SGreg Clayton ModuleSP module_sp; 142bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 143bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1444fc6cb9cSJim Ingham 145dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 146d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1477730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 148b9c1b51eSKate Stone if (target && process) { 1497fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 150b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1517730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 152b9c1b51eSKate Stone if (frame) { 153d9e416c0SGreg Clayton module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp; 154acdbe816SGreg Clayton sb_module.SetSP(module_sp); 155c9858e4dSGreg Clayton } 1567fdf9ef1SGreg Clayton } 157581af8b0SJonas Devlieghere } 1584838131bSGreg Clayton 159baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_module); 16030fdc8d8SChris Lattner } 16130fdc8d8SChris Lattner 162b9c1b51eSKate Stone SBCompileUnit SBFrame::GetCompileUnit() const { 163baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBCompileUnit, SBFrame, 164baf5664fSJonas Devlieghere GetCompileUnit); 165baf5664fSJonas Devlieghere 16672eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 167bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 168bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1694fc6cb9cSJim Ingham 170dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 171d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1727730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 173b9c1b51eSKate Stone if (target && process) { 1747fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 175b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1767730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 177b9c1b51eSKate Stone if (frame) { 178b9c1b51eSKate Stone sb_comp_unit.reset( 179b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit); 180c9858e4dSGreg Clayton } 181c9858e4dSGreg Clayton } 182581af8b0SJonas Devlieghere } 183ceb6b139SCaroline Tice 184baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_comp_unit); 18530fdc8d8SChris Lattner } 18630fdc8d8SChris Lattner 187b9c1b51eSKate Stone SBFunction SBFrame::GetFunction() const { 188baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFunction, SBFrame, GetFunction); 189baf5664fSJonas Devlieghere 19072eff18aSGreg Clayton SBFunction sb_function; 191bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 192bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1934fc6cb9cSJim Ingham 194dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 195d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1967730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 197b9c1b51eSKate Stone if (target && process) { 1987fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 199b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2007730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 201b9c1b51eSKate Stone if (frame) { 202b9c1b51eSKate Stone sb_function.reset( 203b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextFunction).function); 2047fdf9ef1SGreg Clayton } 205c9858e4dSGreg Clayton } 206581af8b0SJonas Devlieghere } 2074838131bSGreg Clayton 208baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_function); 20930fdc8d8SChris Lattner } 21030fdc8d8SChris Lattner 211b9c1b51eSKate Stone SBSymbol SBFrame::GetSymbol() const { 212baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBSymbol, SBFrame, GetSymbol); 213baf5664fSJonas Devlieghere 21472eff18aSGreg Clayton SBSymbol sb_symbol; 215bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 216bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2174fc6cb9cSJim Ingham 218dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 219d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2207730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 221b9c1b51eSKate Stone if (target && process) { 2227fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 223b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2247730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 225b9c1b51eSKate Stone if (frame) { 226d9e416c0SGreg Clayton sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol); 2277fdf9ef1SGreg Clayton } 228c9858e4dSGreg Clayton } 229581af8b0SJonas Devlieghere } 230581af8b0SJonas Devlieghere 231baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_symbol); 2323b06557eSGreg Clayton } 2333b06557eSGreg Clayton 234b9c1b51eSKate Stone SBBlock SBFrame::GetBlock() const { 235baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBlock, SBFrame, GetBlock); 236baf5664fSJonas Devlieghere 23772eff18aSGreg Clayton SBBlock sb_block; 238bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 239bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2404fc6cb9cSJim Ingham 241dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 242d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2437730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 244b9c1b51eSKate Stone if (target && process) { 2457fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 246b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2477730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 248581af8b0SJonas Devlieghere if (frame) 249d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block); 2507fdf9ef1SGreg Clayton } 251c9858e4dSGreg Clayton } 252baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_block); 25330fdc8d8SChris Lattner } 25430fdc8d8SChris Lattner 255b9c1b51eSKate Stone SBBlock SBFrame::GetFrameBlock() const { 256baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBlock, SBFrame, GetFrameBlock); 257baf5664fSJonas Devlieghere 25872eff18aSGreg Clayton SBBlock sb_block; 259bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 260bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2614fc6cb9cSJim Ingham 262dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 263d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2647730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 265b9c1b51eSKate Stone if (target && process) { 2667fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 267b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2687730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 269581af8b0SJonas Devlieghere if (frame) 270d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetFrameBlock()); 2717fdf9ef1SGreg Clayton } 272c9858e4dSGreg Clayton } 273baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_block); 27495897c6aSGreg Clayton } 27595897c6aSGreg Clayton 276b9c1b51eSKate Stone SBLineEntry SBFrame::GetLineEntry() const { 277baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBLineEntry, SBFrame, GetLineEntry); 278baf5664fSJonas Devlieghere 27972eff18aSGreg Clayton SBLineEntry sb_line_entry; 280bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 281bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2824fc6cb9cSJim Ingham 283dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 284d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2857730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 286b9c1b51eSKate Stone if (target && process) { 2877fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 288b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2897730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 290b9c1b51eSKate Stone if (frame) { 291b9c1b51eSKate Stone sb_line_entry.SetLineEntry( 292b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextLineEntry).line_entry); 2937fdf9ef1SGreg Clayton } 294c9858e4dSGreg Clayton } 295581af8b0SJonas Devlieghere } 296baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_line_entry); 29730fdc8d8SChris Lattner } 29830fdc8d8SChris Lattner 299b9c1b51eSKate Stone uint32_t SBFrame::GetFrameID() const { 300baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBFrame, GetFrameID); 301baf5664fSJonas Devlieghere 302b9556accSGreg Clayton uint32_t frame_idx = UINT32_MAX; 303b9556accSGreg Clayton 304c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 305c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 306c481c7eeSJim Ingham 307b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 3087fdf9ef1SGreg Clayton if (frame) 309d9e416c0SGreg Clayton frame_idx = frame->GetFrameIndex(); 3104838131bSGreg Clayton 3114838131bSGreg Clayton return frame_idx; 31230fdc8d8SChris Lattner } 31330fdc8d8SChris Lattner 314b9c1b51eSKate Stone lldb::addr_t SBFrame::GetCFA() const { 315baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetCFA); 316baf5664fSJonas Devlieghere 317c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 318c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 319c481c7eeSJim Ingham 320424a5dbcSGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 321424a5dbcSGreg Clayton if (frame) 322424a5dbcSGreg Clayton return frame->GetStackID().GetCallFrameAddress(); 323424a5dbcSGreg Clayton return LLDB_INVALID_ADDRESS; 324424a5dbcSGreg Clayton } 325424a5dbcSGreg Clayton 326b9c1b51eSKate Stone addr_t SBFrame::GetPC() const { 327baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetPC); 328baf5664fSJonas Devlieghere 32969b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 330bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 331bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3324fc6cb9cSJim Ingham 333dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 334d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3357730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 336b9c1b51eSKate Stone if (target && process) { 3377fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 338b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3397730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 340b9c1b51eSKate Stone if (frame) { 341b9c1b51eSKate Stone addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress( 34204803b3eSTatyana Krasnukha target, AddressClass::eCode); 343c9858e4dSGreg Clayton } 3447fdf9ef1SGreg Clayton } 345581af8b0SJonas Devlieghere } 346ceb6b139SCaroline Tice 347ceb6b139SCaroline Tice return addr; 34830fdc8d8SChris Lattner } 34930fdc8d8SChris Lattner 350b9c1b51eSKate Stone bool SBFrame::SetPC(addr_t new_pc) { 351baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBFrame, SetPC, (lldb::addr_t), new_pc); 352baf5664fSJonas Devlieghere 353ceb6b139SCaroline Tice bool ret_val = false; 354bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 355bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3564fc6cb9cSJim Ingham 357d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3587730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 359b9c1b51eSKate Stone if (target && process) { 3607fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 361b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3620d7401cfSMed Ismail Bennani if (StackFrame *frame = exe_ctx.GetFramePtr()) { 3630d7401cfSMed Ismail Bennani if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) { 3640d7401cfSMed Ismail Bennani ret_val = reg_ctx_sp->SetPC(new_pc); 3650d7401cfSMed Ismail Bennani } 366c9858e4dSGreg Clayton } 3677fdf9ef1SGreg Clayton } 368581af8b0SJonas Devlieghere } 369ceb6b139SCaroline Tice 370ceb6b139SCaroline Tice return ret_val; 37130fdc8d8SChris Lattner } 37230fdc8d8SChris Lattner 373b9c1b51eSKate Stone addr_t SBFrame::GetSP() const { 374baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetSP); 375baf5664fSJonas Devlieghere 3764838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 377bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 378bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3794fc6cb9cSJim Ingham 380d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3817730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 382b9c1b51eSKate Stone if (target && process) { 3837fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 384b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3850d7401cfSMed Ismail Bennani if (StackFrame *frame = exe_ctx.GetFramePtr()) { 3860d7401cfSMed Ismail Bennani if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) { 3870d7401cfSMed Ismail Bennani addr = reg_ctx_sp->GetSP(); 3880d7401cfSMed Ismail Bennani } 3897fdf9ef1SGreg Clayton } 390c9858e4dSGreg Clayton } 391581af8b0SJonas Devlieghere } 3924838131bSGreg Clayton 3934838131bSGreg Clayton return addr; 39430fdc8d8SChris Lattner } 39530fdc8d8SChris Lattner 396b9c1b51eSKate Stone addr_t SBFrame::GetFP() const { 397baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetFP); 398baf5664fSJonas Devlieghere 39969b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 400bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 401bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4024fc6cb9cSJim Ingham 403d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4047730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 405b9c1b51eSKate Stone if (target && process) { 4067fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 407b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4080d7401cfSMed Ismail Bennani if (StackFrame *frame = exe_ctx.GetFramePtr()) { 4090d7401cfSMed Ismail Bennani if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) { 4100d7401cfSMed Ismail Bennani addr = reg_ctx_sp->GetFP(); 4110d7401cfSMed Ismail Bennani } 4120d7401cfSMed Ismail Bennani } 413c9858e4dSGreg Clayton } 4147fdf9ef1SGreg Clayton } 415ceb6b139SCaroline Tice 416ceb6b139SCaroline Tice return addr; 41730fdc8d8SChris Lattner } 41830fdc8d8SChris Lattner 419b9c1b51eSKate Stone SBAddress SBFrame::GetPCAddress() const { 420baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBFrame, GetPCAddress); 421baf5664fSJonas Devlieghere 42230fdc8d8SChris Lattner SBAddress sb_addr; 423bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 424bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4254fc6cb9cSJim Ingham 426b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 427d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4287730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 429b9c1b51eSKate Stone if (target && process) { 4307fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 431b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4327730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 433581af8b0SJonas Devlieghere if (frame) 434*6cd4a4cdSJonas Devlieghere sb_addr.SetAddress(frame->GetFrameCodeAddress()); 4357fdf9ef1SGreg Clayton } 436c9858e4dSGreg Clayton } 437baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_addr); 43830fdc8d8SChris Lattner } 43930fdc8d8SChris Lattner 440baf5664fSJonas Devlieghere void SBFrame::Clear() { 441baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBFrame, Clear); 442baf5664fSJonas Devlieghere 443baf5664fSJonas Devlieghere m_opaque_sp->Clear(); 444baf5664fSJonas Devlieghere } 44530fdc8d8SChris Lattner 446b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) { 447baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 448baf5664fSJonas Devlieghere (const char *), var_path); 449baf5664fSJonas Devlieghere 4507edbdfc9SGreg Clayton SBValue sb_value; 451c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 452c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 453c481c7eeSJim Ingham 454b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 455d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 456b9c1b51eSKate Stone if (frame && target) { 457b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 458b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 4597edbdfc9SGreg Clayton sb_value = GetValueForVariablePath(var_path, use_dynamic); 4607edbdfc9SGreg Clayton } 461baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 4627edbdfc9SGreg Clayton } 4637edbdfc9SGreg Clayton 464b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path, 465b9c1b51eSKate Stone DynamicValueType use_dynamic) { 466baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 467baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType), var_path, 468baf5664fSJonas Devlieghere use_dynamic); 469baf5664fSJonas Devlieghere 4707edbdfc9SGreg Clayton SBValue sb_value; 471b9c1b51eSKate Stone if (var_path == nullptr || var_path[0] == '\0') { 472baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 4737730b9a4SJim Ingham } 4747730b9a4SJim Ingham 475bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 476bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4774fc6cb9cSJim Ingham 478dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 479d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4807730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 481b9c1b51eSKate Stone if (target && process) { 4827fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 483b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4847730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 485b9c1b51eSKate Stone if (frame) { 4867edbdfc9SGreg Clayton VariableSP var_sp; 48797206d57SZachary Turner Status error; 488b9c1b51eSKate Stone ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath( 489b9c1b51eSKate Stone var_path, eNoDynamicValues, 490b9c1b51eSKate Stone StackFrame::eExpressionPathOptionCheckPtrVsMember | 491b9c1b51eSKate Stone StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 492b9c1b51eSKate Stone var_sp, error)); 493e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 4947730b9a4SJim Ingham } 495c9858e4dSGreg Clayton } 4967fdf9ef1SGreg Clayton } 497baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 4987edbdfc9SGreg Clayton } 4997edbdfc9SGreg Clayton 500b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name) { 501baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *), 502baf5664fSJonas Devlieghere name); 503baf5664fSJonas Devlieghere 504316d498bSGreg Clayton SBValue value; 505c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 506c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 507c481c7eeSJim Ingham 508b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 509d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 510b9c1b51eSKate Stone if (frame && target) { 511b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 512b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 513316d498bSGreg Clayton value = FindVariable(name, use_dynamic); 514316d498bSGreg Clayton } 515baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value); 51678a685aaSJim Ingham } 51778a685aaSJim Ingham 518b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name, 519b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 520baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable, 521baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType), name, use_dynamic); 522baf5664fSJonas Devlieghere 52369b582faSGreg Clayton VariableSP var_sp; 52458b59f95SJim Ingham SBValue sb_value; 5257730b9a4SJim Ingham 526b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') { 527baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 5287730b9a4SJim Ingham } 5297730b9a4SJim Ingham 53081e871edSGreg Clayton ValueObjectSP value_sp; 531bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 532bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5334fc6cb9cSJim Ingham 534dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 535d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5367730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 537b9c1b51eSKate Stone if (target && process) { 5387fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 539b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 5407730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 541b9c1b51eSKate Stone if (frame) { 542e23d0b63SShafik Yaghmour value_sp = frame->FindVariable(ConstString(name)); 54330fdc8d8SChris Lattner 544e23d0b63SShafik Yaghmour if (value_sp) 545e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 546c9858e4dSGreg Clayton } 547316d498bSGreg Clayton } 548581af8b0SJonas Devlieghere } 5494838131bSGreg Clayton 550baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 551dde9cff3SCaroline Tice } 552dde9cff3SCaroline Tice 553b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) { 554baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue, 555baf5664fSJonas Devlieghere (const char *, lldb::ValueType), name, value_type); 556baf5664fSJonas Devlieghere 557316d498bSGreg Clayton SBValue value; 558c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 559c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 560c481c7eeSJim Ingham 561b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 562d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 563b9c1b51eSKate Stone if (frame && target) { 564b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 565b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 566316d498bSGreg Clayton value = FindValue(name, value_type, use_dynamic); 567316d498bSGreg Clayton } 568baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value); 56978a685aaSJim Ingham } 57078a685aaSJim Ingham 571b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type, 572b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 573baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue, 574baf5664fSJonas Devlieghere (const char *, lldb::ValueType, lldb::DynamicValueType), 575baf5664fSJonas Devlieghere name, value_type, use_dynamic); 576baf5664fSJonas Devlieghere 57769b582faSGreg Clayton SBValue sb_value; 5787730b9a4SJim Ingham 579b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') { 580baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 5817730b9a4SJim Ingham } 5827730b9a4SJim Ingham 58381e871edSGreg Clayton ValueObjectSP value_sp; 584bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 585bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5864fc6cb9cSJim Ingham 587dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 588d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5897730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 590b9c1b51eSKate Stone if (target && process) { 5917fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 592b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 5937730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 594b9c1b51eSKate Stone if (frame) { 5958a2a0dfbSEnrico Granata VariableList variable_list; 5968a2a0dfbSEnrico Granata 597b9c1b51eSKate Stone switch (value_type) { 59869b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 59969b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 60069b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 60169b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 60263a27afaSGreg Clayton case eValueTypeVariableThreadLocal: // thread local variables 60369b582faSGreg Clayton { 604d9e416c0SGreg Clayton SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock)); 60572eff18aSGreg Clayton 60672eff18aSGreg Clayton const bool can_create = true; 60772eff18aSGreg Clayton const bool get_parent_variables = true; 60872eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 60972eff18aSGreg Clayton 6100efb51a0SChaoren Lin if (sc.block) 611b9c1b51eSKate Stone sc.block->AppendVariables( 612b9c1b51eSKate Stone can_create, get_parent_variables, 613b9c1b51eSKate Stone stop_if_block_is_inlined_function, 614b9c1b51eSKate Stone [frame](Variable *v) { return v->IsInScope(frame); }, 615b9c1b51eSKate Stone &variable_list); 616b9c1b51eSKate Stone if (value_type == eValueTypeVariableGlobal) { 6178a2a0dfbSEnrico Granata const bool get_file_globals = true; 6188a2a0dfbSEnrico Granata VariableList *frame_vars = frame->GetVariableList(get_file_globals); 6198a2a0dfbSEnrico Granata if (frame_vars) 6208a2a0dfbSEnrico Granata frame_vars->AppendVariablesIfUnique(variable_list); 6218a2a0dfbSEnrico Granata } 62269b582faSGreg Clayton ConstString const_name(name); 623b9c1b51eSKate Stone VariableSP variable_sp( 624b9c1b51eSKate Stone variable_list.FindVariable(const_name, value_type)); 625b9c1b51eSKate Stone if (variable_sp) { 626b9c1b51eSKate Stone value_sp = frame->GetValueObjectForFrameVariable(variable_sp, 627b9c1b51eSKate Stone eNoDynamicValues); 628e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 62930fdc8d8SChris Lattner } 630b9c1b51eSKate Stone } break; 63169b582faSGreg Clayton 63269b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 63369b582faSGreg Clayton { 634d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 635b9c1b51eSKate Stone if (reg_ctx) { 63669b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 637b9c1b51eSKate Stone for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 638b9c1b51eSKate Stone const RegisterInfo *reg_info = 639b9c1b51eSKate Stone reg_ctx->GetRegisterInfoAtIndex(reg_idx); 64069b582faSGreg Clayton if (reg_info && 64169b582faSGreg Clayton ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 642b9c1b51eSKate Stone (reg_info->alt_name && 643b9c1b51eSKate Stone strcasecmp(reg_info->alt_name, name) == 0))) { 644d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 64581e871edSGreg Clayton sb_value.SetSP(value_sp); 64681e871edSGreg Clayton break; 64769b582faSGreg Clayton } 64869b582faSGreg Clayton } 64969b582faSGreg Clayton } 650b9c1b51eSKate Stone } break; 65169b582faSGreg Clayton 652b9c1b51eSKate Stone case eValueTypeRegisterSet: // A collection of stack frame register 653b9c1b51eSKate Stone // values 65469b582faSGreg Clayton { 655d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 656b9c1b51eSKate Stone if (reg_ctx) { 65769b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 658b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 65969b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx); 66069b582faSGreg Clayton if (reg_set && 66169b582faSGreg Clayton ((reg_set->name && strcasecmp(reg_set->name, name) == 0) || 662b9c1b51eSKate Stone (reg_set->short_name && 663b9c1b51eSKate Stone strcasecmp(reg_set->short_name, name) == 0))) { 664b9c1b51eSKate Stone value_sp = 665b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx); 66681e871edSGreg Clayton sb_value.SetSP(value_sp); 66781e871edSGreg Clayton break; 66869b582faSGreg Clayton } 66969b582faSGreg Clayton } 67069b582faSGreg Clayton } 671b9c1b51eSKate Stone } break; 67269b582faSGreg Clayton 67369b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 67469b582faSGreg Clayton { 67569b582faSGreg Clayton ConstString const_name(name); 676b9c1b51eSKate Stone ExpressionVariableSP expr_var_sp( 677b9c1b51eSKate Stone target->GetPersistentVariable(const_name)); 678b9c1b51eSKate Stone if (expr_var_sp) { 67981e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 680e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 68181e871edSGreg Clayton } 682b9c1b51eSKate Stone } break; 68369b582faSGreg Clayton 68469b582faSGreg Clayton default: 68569b582faSGreg Clayton break; 68669b582faSGreg Clayton } 687c9858e4dSGreg Clayton } 6887fdf9ef1SGreg Clayton } 689581af8b0SJonas Devlieghere } 6904838131bSGreg Clayton 691baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 692dde9cff3SCaroline Tice } 693dde9cff3SCaroline Tice 694b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const { 695baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &), 696baf5664fSJonas Devlieghere that); 697baf5664fSJonas Devlieghere 698b57e4a1bSJason Molenda lldb::StackFrameSP this_sp = GetFrameSP(); 699b57e4a1bSJason Molenda lldb::StackFrameSP that_sp = that.GetFrameSP(); 70035e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 70135e2ab60SJohnny Chen } 70235e2ab60SJohnny Chen 703baf5664fSJonas Devlieghere bool SBFrame::operator==(const SBFrame &rhs) const { 704baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator==,(const lldb::SBFrame &), 705baf5664fSJonas Devlieghere rhs); 70630fdc8d8SChris Lattner 707baf5664fSJonas Devlieghere return IsEqual(rhs); 708baf5664fSJonas Devlieghere } 709baf5664fSJonas Devlieghere 710baf5664fSJonas Devlieghere bool SBFrame::operator!=(const SBFrame &rhs) const { 711baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator!=,(const lldb::SBFrame &), 712baf5664fSJonas Devlieghere rhs); 713baf5664fSJonas Devlieghere 714baf5664fSJonas Devlieghere return !IsEqual(rhs); 715baf5664fSJonas Devlieghere } 71630fdc8d8SChris Lattner 717b9c1b51eSKate Stone SBThread SBFrame::GetThread() const { 718baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBThread, SBFrame, GetThread); 719baf5664fSJonas Devlieghere 720c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 721c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 722c481c7eeSJim Ingham 723d9e416c0SGreg Clayton ThreadSP thread_sp(exe_ctx.GetThreadSP()); 724d9e416c0SGreg Clayton SBThread sb_thread(thread_sp); 725ceb6b139SCaroline Tice 726baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_thread); 72730fdc8d8SChris Lattner } 72830fdc8d8SChris Lattner 729b9c1b51eSKate Stone const char *SBFrame::Disassemble() const { 730baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, Disassemble); 731baf5664fSJonas Devlieghere 732dbb0abbfSEugene Zelenko const char *disassembly = nullptr; 733bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 734bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 7354fc6cb9cSJim Ingham 736dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 737d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7387730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 739b9c1b51eSKate Stone if (target && process) { 7407fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 741b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 7427730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 743b9c1b51eSKate Stone if (frame) { 744d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 7457fdf9ef1SGreg Clayton } 746c9858e4dSGreg Clayton } 747581af8b0SJonas Devlieghere } 7484838131bSGreg Clayton 7494838131bSGreg Clayton return disassembly; 75030fdc8d8SChris Lattner } 75130fdc8d8SChris Lattner 752b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics, 753b9c1b51eSKate Stone bool in_scope_only) { 754baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 755baf5664fSJonas Devlieghere (bool, bool, bool, bool), arguments, locals, statics, 756baf5664fSJonas Devlieghere in_scope_only); 757baf5664fSJonas Devlieghere 758316d498bSGreg Clayton SBValueList value_list; 759c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 760c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 761c481c7eeSJim Ingham 762b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 763d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 764b9c1b51eSKate Stone if (frame && target) { 765b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 766b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 767b9c1b51eSKate Stone const bool include_runtime_support_values = 768b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false; 76951f96eebSZachary Turner 77051f96eebSZachary Turner SBVariablesOptions options; 77151f96eebSZachary Turner options.SetIncludeArguments(arguments); 77251f96eebSZachary Turner options.SetIncludeLocals(locals); 77351f96eebSZachary Turner options.SetIncludeStatics(statics); 77451f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 77551f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 77651f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 77751f96eebSZachary Turner 77851f96eebSZachary Turner value_list = GetVariables(options); 779316d498bSGreg Clayton } 780baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value_list); 78178a685aaSJim Ingham } 78278a685aaSJim Ingham 783b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals, 784b9c1b51eSKate Stone bool statics, bool in_scope_only, 785b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 786baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 787baf5664fSJonas Devlieghere (bool, bool, bool, bool, lldb::DynamicValueType), 788baf5664fSJonas Devlieghere arguments, locals, statics, in_scope_only, use_dynamic); 789baf5664fSJonas Devlieghere 790c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 791c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 792c481c7eeSJim Ingham 793560558ebSEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 794b9c1b51eSKate Stone const bool include_runtime_support_values = 795b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false; 79651f96eebSZachary Turner SBVariablesOptions options; 79751f96eebSZachary Turner options.SetIncludeArguments(arguments); 79851f96eebSZachary Turner options.SetIncludeLocals(locals); 79951f96eebSZachary Turner options.SetIncludeStatics(statics); 80051f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 80151f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 80251f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 803baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(GetVariables(options)); 804560558ebSEnrico Granata } 805560558ebSEnrico Granata 806b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) { 807baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 808baf5664fSJonas Devlieghere (const lldb::SBVariablesOptions &), options); 809baf5664fSJonas Devlieghere 810b9556accSGreg Clayton SBValueList value_list; 811bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 812bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 8134fc6cb9cSJim Ingham 814dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 815d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 816b9556accSGreg Clayton 81751f96eebSZachary Turner const bool statics = options.GetIncludeStatics(); 81851f96eebSZachary Turner const bool arguments = options.GetIncludeArguments(); 8194c7f5d5cSKuba Mracek const bool recognized_arguments = 8204c7f5d5cSKuba Mracek options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP())); 82151f96eebSZachary Turner const bool locals = options.GetIncludeLocals(); 82251f96eebSZachary Turner const bool in_scope_only = options.GetInScopeOnly(); 823b9c1b51eSKate Stone const bool include_runtime_support_values = 824b9c1b51eSKate Stone options.GetIncludeRuntimeSupportValues(); 82551f96eebSZachary Turner const lldb::DynamicValueType use_dynamic = options.GetUseDynamic(); 82651f96eebSZachary Turner 827ceb6b139SCaroline Tice 828349213f9SGreg Clayton std::set<VariableSP> variable_set; 8297730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 830b9c1b51eSKate Stone if (target && process) { 8317fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 832b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 8337730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 834b9c1b51eSKate Stone if (frame) { 835dbb0abbfSEugene Zelenko VariableList *variable_list = nullptr; 836d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 837b9c1b51eSKate Stone if (variable_list) { 83830fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 839b9c1b51eSKate Stone if (num_variables) { 840d1782133SRaphael Isemann for (const VariableSP &variable_sp : *variable_list) { 841b9c1b51eSKate Stone if (variable_sp) { 84230fdc8d8SChris Lattner bool add_variable = false; 843b9c1b51eSKate Stone switch (variable_sp->GetScope()) { 84430fdc8d8SChris Lattner case eValueTypeVariableGlobal: 84530fdc8d8SChris Lattner case eValueTypeVariableStatic: 84663a27afaSGreg Clayton case eValueTypeVariableThreadLocal: 84730fdc8d8SChris Lattner add_variable = statics; 84830fdc8d8SChris Lattner break; 84930fdc8d8SChris Lattner 85030fdc8d8SChris Lattner case eValueTypeVariableArgument: 85130fdc8d8SChris Lattner add_variable = arguments; 85230fdc8d8SChris Lattner break; 85330fdc8d8SChris Lattner 85430fdc8d8SChris Lattner case eValueTypeVariableLocal: 85530fdc8d8SChris Lattner add_variable = locals; 85630fdc8d8SChris Lattner break; 857c982c768SGreg Clayton 858c982c768SGreg Clayton default: 859c982c768SGreg Clayton break; 86030fdc8d8SChris Lattner } 861b9c1b51eSKate Stone if (add_variable) { 862349213f9SGreg Clayton // Only add variables once so we don't end up with duplicates 863349213f9SGreg Clayton if (variable_set.find(variable_sp) == variable_set.end()) 864349213f9SGreg Clayton variable_set.insert(variable_sp); 865349213f9SGreg Clayton else 866349213f9SGreg Clayton continue; 867349213f9SGreg Clayton 868d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 86930fdc8d8SChris Lattner continue; 87030fdc8d8SChris Lattner 871b9c1b51eSKate Stone ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable( 872b9c1b51eSKate Stone variable_sp, eNoDynamicValues)); 873560558ebSEnrico Granata 874b9c1b51eSKate Stone if (!include_runtime_support_values && valobj_sp != nullptr && 875dbb0abbfSEugene Zelenko valobj_sp->IsRuntimeSupportValue()) 876560558ebSEnrico Granata continue; 877560558ebSEnrico Granata 878e3e91517SEnrico Granata SBValue value_sb; 879e3e91517SEnrico Granata value_sb.SetSP(valobj_sp, use_dynamic); 880e3e91517SEnrico Granata value_list.Append(value_sb); 88130fdc8d8SChris Lattner } 88230fdc8d8SChris Lattner } 88330fdc8d8SChris Lattner } 88430fdc8d8SChris Lattner } 88530fdc8d8SChris Lattner } 88641ae8e74SKuba Mracek if (recognized_arguments) { 88741ae8e74SKuba Mracek auto recognized_frame = frame->GetRecognizedFrame(); 88841ae8e74SKuba Mracek if (recognized_frame) { 88941ae8e74SKuba Mracek ValueObjectListSP recognized_arg_list = 89041ae8e74SKuba Mracek recognized_frame->GetRecognizedArguments(); 89141ae8e74SKuba Mracek if (recognized_arg_list) { 89241ae8e74SKuba Mracek for (auto &rec_value_sp : recognized_arg_list->GetObjects()) { 89341ae8e74SKuba Mracek SBValue value_sb; 89441ae8e74SKuba Mracek value_sb.SetSP(rec_value_sp, use_dynamic); 89541ae8e74SKuba Mracek value_list.Append(value_sb); 89641ae8e74SKuba Mracek } 89741ae8e74SKuba Mracek } 89841ae8e74SKuba Mracek } 89941ae8e74SKuba Mracek } 900c9858e4dSGreg Clayton } 9017fdf9ef1SGreg Clayton } 902581af8b0SJonas Devlieghere } 903ceb6b139SCaroline Tice 904baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value_list); 90530fdc8d8SChris Lattner } 90630fdc8d8SChris Lattner 907b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() { 908baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBValueList, SBFrame, GetRegisters); 909baf5664fSJonas Devlieghere 91030fdc8d8SChris Lattner SBValueList value_list; 911bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 912bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 9134fc6cb9cSJim Ingham 914dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 915d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 9167730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 917b9c1b51eSKate Stone if (target && process) { 9187fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 919b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 9207730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 921b9c1b51eSKate Stone if (frame) { 922d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 923b9c1b51eSKate Stone if (reg_ctx) { 92430fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 925b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 926b9c1b51eSKate Stone value_list.Append( 927b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx)); 92830fdc8d8SChris Lattner } 92930fdc8d8SChris Lattner } 930c9858e4dSGreg Clayton } 9317fdf9ef1SGreg Clayton } 932581af8b0SJonas Devlieghere } 933ceb6b139SCaroline Tice 934baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value_list); 93530fdc8d8SChris Lattner } 93630fdc8d8SChris Lattner 937b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) { 938baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *), 939baf5664fSJonas Devlieghere name); 940baf5664fSJonas Devlieghere 941ad9a53c5SJason Molenda SBValue result; 942ad9a53c5SJason Molenda ValueObjectSP value_sp; 943bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 944bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 945ad9a53c5SJason Molenda 946dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 947ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr(); 948ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 949b9c1b51eSKate Stone if (target && process) { 950ad9a53c5SJason Molenda Process::StopLocker stop_locker; 951b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 952ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr(); 953b9c1b51eSKate Stone if (frame) { 954ad9a53c5SJason Molenda RegisterContextSP reg_ctx(frame->GetRegisterContext()); 955b9c1b51eSKate Stone if (reg_ctx) { 956ad9a53c5SJason Molenda const uint32_t num_regs = reg_ctx->GetRegisterCount(); 957b9c1b51eSKate Stone for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 958b9c1b51eSKate Stone const RegisterInfo *reg_info = 959b9c1b51eSKate Stone reg_ctx->GetRegisterInfoAtIndex(reg_idx); 960ad9a53c5SJason Molenda if (reg_info && 961ad9a53c5SJason Molenda ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 962b9c1b51eSKate Stone (reg_info->alt_name && 963b9c1b51eSKate Stone strcasecmp(reg_info->alt_name, name) == 0))) { 964ad9a53c5SJason Molenda value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 965ad9a53c5SJason Molenda result.SetSP(value_sp); 966ad9a53c5SJason Molenda break; 967ad9a53c5SJason Molenda } 968ad9a53c5SJason Molenda } 969ad9a53c5SJason Molenda } 970ad9a53c5SJason Molenda } 971ad9a53c5SJason Molenda } 972581af8b0SJonas Devlieghere } 973ad9a53c5SJason Molenda 974baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(result); 975ad9a53c5SJason Molenda } 976ad9a53c5SJason Molenda 977b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) { 978baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &), 979baf5664fSJonas Devlieghere description); 980baf5664fSJonas Devlieghere 981da7bc7d0SGreg Clayton Stream &strm = description.ref(); 982da7bc7d0SGreg Clayton 983bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 984bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 9854fc6cb9cSJim Ingham 986b57e4a1bSJason Molenda StackFrame *frame; 987d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 9887730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 989b9c1b51eSKate Stone if (target && process) { 9907fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 991b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 9927730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 993b9c1b51eSKate Stone if (frame) { 994d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&strm); 9957730b9a4SJim Ingham } 996c9858e4dSGreg Clayton } 997c9858e4dSGreg Clayton 998b9c1b51eSKate Stone } else 999da7bc7d0SGreg Clayton strm.PutCString("No value"); 1000dde9cff3SCaroline Tice 1001dde9cff3SCaroline Tice return true; 1002dde9cff3SCaroline Tice } 10031d3afba3SGreg Clayton 1004b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) { 1005baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, (const char *), 1006baf5664fSJonas Devlieghere expr); 1007baf5664fSJonas Devlieghere 1008316d498bSGreg Clayton SBValue result; 1009c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1010c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1011c481c7eeSJim Ingham 1012b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1013d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1014b9c1b51eSKate Stone if (frame && target) { 101535e1bda6SJim Ingham SBExpressionOptions options; 1016b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value = 1017b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 1018cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 101935e1bda6SJim Ingham options.SetUnwindOnError(true); 102024785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1021998c8a1cSRyan Brown if (target->GetLanguage() != eLanguageTypeUnknown) 1022998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1023998c8a1cSRyan Brown else 1024998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 1025baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 1026316d498bSGreg Clayton } 1027baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(result); 102878a685aaSJim Ingham } 102978a685aaSJim Ingham 103078a685aaSJim Ingham SBValue 1031b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr, 1032b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value) { 1033baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1034baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType), expr, 1035baf5664fSJonas Devlieghere fetch_dynamic_value); 1036baf5664fSJonas Devlieghere 103735e1bda6SJim Ingham SBExpressionOptions options; 1038cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 103935e1bda6SJim Ingham options.SetUnwindOnError(true); 104024785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1041c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1042c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1043c481c7eeSJim Ingham 1044998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1045998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1046998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1047998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1048998c8a1cSRyan Brown else if (frame) 1049998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 1050baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 10517ba6e991SJim Ingham } 10527ba6e991SJim Ingham 1053b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr, 1054b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value, 1055b9c1b51eSKate Stone bool unwind_on_error) { 1056baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1057baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType, bool), expr, 1058baf5664fSJonas Devlieghere fetch_dynamic_value, unwind_on_error); 1059baf5664fSJonas Devlieghere 106035e1bda6SJim Ingham SBExpressionOptions options; 1061c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1062c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1063c481c7eeSJim Ingham 1064cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 106535e1bda6SJim Ingham options.SetUnwindOnError(unwind_on_error); 106624785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1067998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1068998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1069998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1070998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1071998c8a1cSRyan Brown else if (frame) 1072998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 1073baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 107435e1bda6SJim Ingham } 107535e1bda6SJim Ingham 1076b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr, 1077b9c1b51eSKate Stone const SBExpressionOptions &options) { 1078baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1079baf5664fSJonas Devlieghere (const char *, const lldb::SBExpressionOptions &), expr, 1080baf5664fSJonas Devlieghere options); 1081baf5664fSJonas Devlieghere 10825160ce5cSGreg Clayton Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1083a162ebafSSean Callanan 108469b582faSGreg Clayton SBValue expr_result; 10857730b9a4SJim Ingham 1086b9c1b51eSKate Stone if (expr == nullptr || expr[0] == '\0') { 1087baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(expr_result); 10887730b9a4SJim Ingham } 10897730b9a4SJim Ingham 109081e871edSGreg Clayton ValueObjectSP expr_value_sp; 10914838131bSGreg Clayton 1092bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1093bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 10944fc6cb9cSJim Ingham 1095b9556accSGreg Clayton 1096dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 10977730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 10987730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 10997730b9a4SJim Ingham 1100b9c1b51eSKate Stone if (target && process) { 11017fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1102b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 11037730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1104b9c1b51eSKate Stone if (frame) { 11058f7db52dSJim Ingham std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace; 1106b9c1b51eSKate Stone if (target->GetDisplayExpressionsInCrashlogs()) { 11071ba7c4d0SGreg Clayton StreamString frame_description; 1108d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&frame_description); 1109a8f3ae7cSJonas Devlieghere stack_trace = std::make_unique<llvm::PrettyStackTraceFormat>( 1110b9c1b51eSKate Stone "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value " 1111b9c1b51eSKate Stone "= %u) %s", 1112b9c1b51eSKate Stone expr, options.GetFetchDynamicValue(), 1113c156427dSZachary Turner frame_description.GetData()); 1114fb6621efSGreg Clayton } 1115fb6621efSGreg Clayton 1116370e5dbaSPavel Labath target->EvaluateExpression(expr, frame, expr_value_sp, options.ref()); 1117e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 11187730b9a4SJim Ingham } 1119c9858e4dSGreg Clayton } 11207fdf9ef1SGreg Clayton } 11214838131bSGreg Clayton 112263e5fb76SJonas Devlieghere LLDB_LOGF(expr_log, 112363e5fb76SJonas Devlieghere "** [SBFrame::EvaluateExpression] Expression result is " 1124b9c1b51eSKate Stone "%s, summary %s **", 1125324a1036SSaleem Abdulrasool expr_result.GetValue(), expr_result.GetSummary()); 11264838131bSGreg Clayton 1127baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(expr_result); 11281d3afba3SGreg Clayton } 1129316d498bSGreg Clayton 1130b9c1b51eSKate Stone bool SBFrame::IsInlined() { 1131baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsInlined); 1132baf5664fSJonas Devlieghere 113305f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->IsInlined(); 113405f75e9fSOleksiy Vyalov } 113505f75e9fSOleksiy Vyalov 1136b9c1b51eSKate Stone bool SBFrame::IsInlined() const { 1137baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsInlined); 1138baf5664fSJonas Devlieghere 1139c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1140c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1141c481c7eeSJim Ingham 1142dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1143d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 11447730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1145b9c1b51eSKate Stone if (target && process) { 11467fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1147b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 11487730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1149b9c1b51eSKate Stone if (frame) { 11507fdf9ef1SGreg Clayton 1151d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1152316d498bSGreg Clayton if (block) 1153dbb0abbfSEugene Zelenko return block->GetContainingInlinedBlock() != nullptr; 11547730b9a4SJim Ingham } 1155c9858e4dSGreg Clayton } 11567fdf9ef1SGreg Clayton } 1157316d498bSGreg Clayton return false; 1158316d498bSGreg Clayton } 1159316d498bSGreg Clayton 11604b36f791SVedant Kumar bool SBFrame::IsArtificial() { 1161baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsArtificial); 1162baf5664fSJonas Devlieghere 11634b36f791SVedant Kumar return static_cast<const SBFrame *>(this)->IsArtificial(); 11644b36f791SVedant Kumar } 11654b36f791SVedant Kumar 11664b36f791SVedant Kumar bool SBFrame::IsArtificial() const { 1167baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsArtificial); 1168baf5664fSJonas Devlieghere 11694b36f791SVedant Kumar std::unique_lock<std::recursive_mutex> lock; 11704b36f791SVedant Kumar ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 11714b36f791SVedant Kumar 11724b36f791SVedant Kumar StackFrame *frame = exe_ctx.GetFramePtr(); 11734b36f791SVedant Kumar if (frame) 11744b36f791SVedant Kumar return frame->IsArtificial(); 11754b36f791SVedant Kumar 11764b36f791SVedant Kumar return false; 11774b36f791SVedant Kumar } 11784b36f791SVedant Kumar 1179b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() { 1180baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetFunctionName); 1181baf5664fSJonas Devlieghere 118205f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->GetFunctionName(); 118305f75e9fSOleksiy Vyalov } 118405f75e9fSOleksiy Vyalov 1185bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const { 1186baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::LanguageType, SBFrame, GuessLanguage); 1187baf5664fSJonas Devlieghere 1188bdbdd229SJim Ingham std::unique_lock<std::recursive_mutex> lock; 1189bdbdd229SJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1190bdbdd229SJim Ingham 1191bdbdd229SJim Ingham StackFrame *frame = nullptr; 1192bdbdd229SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 1193bdbdd229SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1194bdbdd229SJim Ingham if (target && process) { 1195bdbdd229SJim Ingham Process::StopLocker stop_locker; 1196bdbdd229SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) { 1197bdbdd229SJim Ingham frame = exe_ctx.GetFramePtr(); 1198bdbdd229SJim Ingham if (frame) { 1199bdbdd229SJim Ingham return frame->GuessLanguage(); 1200bdbdd229SJim Ingham } 1201bdbdd229SJim Ingham } 1202bdbdd229SJim Ingham } 1203bdbdd229SJim Ingham return eLanguageTypeUnknown; 1204bdbdd229SJim Ingham } 1205bdbdd229SJim Ingham 1206b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const { 1207baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, GetFunctionName); 1208baf5664fSJonas Devlieghere 1209dbb0abbfSEugene Zelenko const char *name = nullptr; 1210c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1211c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1212c481c7eeSJim Ingham 1213dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1214d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 12157730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1216b9c1b51eSKate Stone if (target && process) { 12177fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1218b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 12197730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1220b9c1b51eSKate Stone if (frame) { 1221b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1222b9c1b51eSKate Stone eSymbolContextBlock | 1223b9c1b51eSKate Stone eSymbolContextSymbol)); 1224b9c1b51eSKate Stone if (sc.block) { 1225316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1226b9c1b51eSKate Stone if (inlined_block) { 1227b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1228b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 122922b04487SAlex Langford name = inlined_info->GetName().AsCString(); 1230316d498bSGreg Clayton } 1231316d498bSGreg Clayton } 1232316d498bSGreg Clayton 1233b9c1b51eSKate Stone if (name == nullptr) { 1234316d498bSGreg Clayton if (sc.function) 1235316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1236316d498bSGreg Clayton } 1237316d498bSGreg Clayton 1238b9c1b51eSKate Stone if (name == nullptr) { 1239316d498bSGreg Clayton if (sc.symbol) 1240316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1241316d498bSGreg Clayton } 12427730b9a4SJim Ingham } 1243c9858e4dSGreg Clayton } 12447fdf9ef1SGreg Clayton } 1245316d498bSGreg Clayton return name; 1246316d498bSGreg Clayton } 1247c1f705c2SEnrico Granata 1248b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() { 1249baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetDisplayFunctionName); 1250baf5664fSJonas Devlieghere 1251dbb0abbfSEugene Zelenko const char *name = nullptr; 1252c481c7eeSJim Ingham 1253c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1254c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1255c481c7eeSJim Ingham 1256dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1257c1f705c2SEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 1258c1f705c2SEnrico Granata Process *process = exe_ctx.GetProcessPtr(); 1259b9c1b51eSKate Stone if (target && process) { 1260c1f705c2SEnrico Granata Process::StopLocker stop_locker; 1261b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1262c1f705c2SEnrico Granata frame = exe_ctx.GetFramePtr(); 1263b9c1b51eSKate Stone if (frame) { 1264b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1265b9c1b51eSKate Stone eSymbolContextBlock | 1266b9c1b51eSKate Stone eSymbolContextSymbol)); 1267b9c1b51eSKate Stone if (sc.block) { 1268c1f705c2SEnrico Granata Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1269b9c1b51eSKate Stone if (inlined_block) { 1270b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1271b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 127222b04487SAlex Langford name = inlined_info->GetDisplayName().AsCString(); 1273c1f705c2SEnrico Granata } 1274c1f705c2SEnrico Granata } 1275c1f705c2SEnrico Granata 1276b9c1b51eSKate Stone if (name == nullptr) { 1277c1f705c2SEnrico Granata if (sc.function) 1278c1f705c2SEnrico Granata name = sc.function->GetDisplayName().GetCString(); 1279c1f705c2SEnrico Granata } 1280c1f705c2SEnrico Granata 1281b9c1b51eSKate Stone if (name == nullptr) { 1282c1f705c2SEnrico Granata if (sc.symbol) 1283c1f705c2SEnrico Granata name = sc.symbol->GetDisplayName().GetCString(); 1284c1f705c2SEnrico Granata } 1285c1f705c2SEnrico Granata } 1286c1f705c2SEnrico Granata } 1287c1f705c2SEnrico Granata } 1288c1f705c2SEnrico Granata return name; 1289c1f705c2SEnrico Granata } 1290ae211eceSMichal Gorny 1291ae211eceSMichal Gorny namespace lldb_private { 1292ae211eceSMichal Gorny namespace repro { 1293ae211eceSMichal Gorny 1294ae211eceSMichal Gorny template <> 1295ae211eceSMichal Gorny void RegisterMethods<SBFrame>(Registry &R) { 1296ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBFrame, ()); 1297ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBFrame, (const lldb::StackFrameSP &)); 1298ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBFrame, (const lldb::SBFrame &)); 1299ae211eceSMichal Gorny LLDB_REGISTER_METHOD(const lldb::SBFrame &, 1300ae211eceSMichal Gorny SBFrame, operator=,(const lldb::SBFrame &)); 1301ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsValid, ()); 1302ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBFrame, operator bool, ()); 1303ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBSymbolContext, SBFrame, GetSymbolContext, 1304ae211eceSMichal Gorny (uint32_t)); 1305ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBModule, SBFrame, GetModule, ()); 1306ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBCompileUnit, SBFrame, GetCompileUnit, 1307ae211eceSMichal Gorny ()); 1308ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBFunction, SBFrame, GetFunction, ()); 1309ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBSymbol, SBFrame, GetSymbol, ()); 1310ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBBlock, SBFrame, GetBlock, ()); 1311ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBBlock, SBFrame, GetFrameBlock, ()); 1312ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBLineEntry, SBFrame, GetLineEntry, ()); 1313ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(uint32_t, SBFrame, GetFrameID, ()); 1314ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetCFA, ()); 1315ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetPC, ()); 1316ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBFrame, SetPC, (lldb::addr_t)); 1317ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetSP, ()); 1318ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetFP, ()); 1319ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBFrame, GetPCAddress, ()); 1320ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBFrame, Clear, ()); 1321ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 1322ae211eceSMichal Gorny (const char *)); 1323ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 1324ae211eceSMichal Gorny (const char *, lldb::DynamicValueType)); 1325ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *)); 1326ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindVariable, 1327ae211eceSMichal Gorny (const char *, lldb::DynamicValueType)); 1328ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindValue, 1329ae211eceSMichal Gorny (const char *, lldb::ValueType)); 1330ae211eceSMichal Gorny LLDB_REGISTER_METHOD( 1331ae211eceSMichal Gorny lldb::SBValue, SBFrame, FindValue, 1332ae211eceSMichal Gorny (const char *, lldb::ValueType, lldb::DynamicValueType)); 1333ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &)); 1334ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, 1335ae211eceSMichal Gorny SBFrame, operator==,(const lldb::SBFrame &)); 1336ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, 1337ae211eceSMichal Gorny SBFrame, operator!=,(const lldb::SBFrame &)); 1338ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBThread, SBFrame, GetThread, ()); 1339ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(const char *, SBFrame, Disassemble, ()); 1340ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables, 1341ae211eceSMichal Gorny (bool, bool, bool, bool)); 1342ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables, 1343ae211eceSMichal Gorny (bool, bool, bool, bool, lldb::DynamicValueType)); 1344ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables, 1345ae211eceSMichal Gorny (const lldb::SBVariablesOptions &)); 1346ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetRegisters, ()); 1347ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *)); 1348ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &)); 1349ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1350ae211eceSMichal Gorny (const char *)); 1351ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1352ae211eceSMichal Gorny (const char *, lldb::DynamicValueType)); 1353ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1354ae211eceSMichal Gorny (const char *, lldb::DynamicValueType, bool)); 1355ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1356ae211eceSMichal Gorny (const char *, const lldb::SBExpressionOptions &)); 1357ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBFrame, IsInlined, ()); 1358ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsInlined, ()); 1359ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBFrame, IsArtificial, ()); 1360ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsArtificial, ()); 1361ae211eceSMichal Gorny LLDB_REGISTER_METHOD(const char *, SBFrame, GetFunctionName, ()); 1362ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::LanguageType, SBFrame, GuessLanguage, ()); 1363ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(const char *, SBFrame, GetFunctionName, ()); 1364ae211eceSMichal Gorny LLDB_REGISTER_METHOD(const char *, SBFrame, GetDisplayFunctionName, ()); 1365ae211eceSMichal Gorny } 1366ae211eceSMichal Gorny 1367ae211eceSMichal Gorny } 1368ae211eceSMichal Gorny } 1369