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 357dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 358d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3597730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 360b9c1b51eSKate Stone if (target && process) { 3617fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 362b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3637730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 364b9c1b51eSKate Stone if (frame) { 365d9e416c0SGreg Clayton ret_val = frame->GetRegisterContext()->SetPC(new_pc); 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 380dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 381d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3827730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 383b9c1b51eSKate Stone if (target && process) { 3847fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 385b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3867730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 387b9c1b51eSKate Stone if (frame) { 388d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetSP(); 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 403dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 404d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4057730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 406b9c1b51eSKate Stone if (target && process) { 4077fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 408b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4097730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 410581af8b0SJonas Devlieghere if (frame) 411d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetFP(); 412c9858e4dSGreg Clayton } 4137fdf9ef1SGreg Clayton } 414ceb6b139SCaroline Tice 415ceb6b139SCaroline Tice return addr; 41630fdc8d8SChris Lattner } 41730fdc8d8SChris Lattner 418b9c1b51eSKate Stone SBAddress SBFrame::GetPCAddress() const { 419baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBFrame, GetPCAddress); 420baf5664fSJonas Devlieghere 42130fdc8d8SChris Lattner SBAddress sb_addr; 422bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 423bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4244fc6cb9cSJim Ingham 425b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 426d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4277730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 428b9c1b51eSKate Stone if (target && process) { 4297fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 430b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4317730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 432581af8b0SJonas Devlieghere if (frame) 433d9e416c0SGreg Clayton sb_addr.SetAddress(&frame->GetFrameCodeAddress()); 4347fdf9ef1SGreg Clayton } 435c9858e4dSGreg Clayton } 436baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_addr); 43730fdc8d8SChris Lattner } 43830fdc8d8SChris Lattner 439baf5664fSJonas Devlieghere void SBFrame::Clear() { 440baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBFrame, Clear); 441baf5664fSJonas Devlieghere 442baf5664fSJonas Devlieghere m_opaque_sp->Clear(); 443baf5664fSJonas Devlieghere } 44430fdc8d8SChris Lattner 445b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) { 446baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 447baf5664fSJonas Devlieghere (const char *), var_path); 448baf5664fSJonas Devlieghere 4497edbdfc9SGreg Clayton SBValue sb_value; 450c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 451c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 452c481c7eeSJim Ingham 453b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 454d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 455b9c1b51eSKate Stone if (frame && target) { 456b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 457b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 4587edbdfc9SGreg Clayton sb_value = GetValueForVariablePath(var_path, use_dynamic); 4597edbdfc9SGreg Clayton } 460baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 4617edbdfc9SGreg Clayton } 4627edbdfc9SGreg Clayton 463b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path, 464b9c1b51eSKate Stone DynamicValueType use_dynamic) { 465baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 466baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType), var_path, 467baf5664fSJonas Devlieghere use_dynamic); 468baf5664fSJonas Devlieghere 4697edbdfc9SGreg Clayton SBValue sb_value; 470b9c1b51eSKate Stone if (var_path == nullptr || var_path[0] == '\0') { 471baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 4727730b9a4SJim Ingham } 4737730b9a4SJim Ingham 474bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 475bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4764fc6cb9cSJim Ingham 477dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 478d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4797730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 480b9c1b51eSKate Stone if (target && process) { 4817fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 482b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4837730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 484b9c1b51eSKate Stone if (frame) { 4857edbdfc9SGreg Clayton VariableSP var_sp; 48697206d57SZachary Turner Status error; 487b9c1b51eSKate Stone ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath( 488b9c1b51eSKate Stone var_path, eNoDynamicValues, 489b9c1b51eSKate Stone StackFrame::eExpressionPathOptionCheckPtrVsMember | 490b9c1b51eSKate Stone StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 491b9c1b51eSKate Stone var_sp, error)); 492e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 4937730b9a4SJim Ingham } 494c9858e4dSGreg Clayton } 4957fdf9ef1SGreg Clayton } 496baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 4977edbdfc9SGreg Clayton } 4987edbdfc9SGreg Clayton 499b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name) { 500baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *), 501baf5664fSJonas Devlieghere name); 502baf5664fSJonas Devlieghere 503316d498bSGreg Clayton SBValue value; 504c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 505c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 506c481c7eeSJim Ingham 507b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 508d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 509b9c1b51eSKate Stone if (frame && target) { 510b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 511b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 512316d498bSGreg Clayton value = FindVariable(name, use_dynamic); 513316d498bSGreg Clayton } 514baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value); 51578a685aaSJim Ingham } 51678a685aaSJim Ingham 517b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name, 518b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 519baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable, 520baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType), name, use_dynamic); 521baf5664fSJonas Devlieghere 52269b582faSGreg Clayton VariableSP var_sp; 52358b59f95SJim Ingham SBValue sb_value; 5247730b9a4SJim Ingham 525b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') { 526baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 5277730b9a4SJim Ingham } 5287730b9a4SJim Ingham 52981e871edSGreg Clayton ValueObjectSP value_sp; 530bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 531bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5324fc6cb9cSJim Ingham 533dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 534d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5357730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 536b9c1b51eSKate Stone if (target && process) { 5377fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 538b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 5397730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 540b9c1b51eSKate Stone if (frame) { 541e23d0b63SShafik Yaghmour value_sp = frame->FindVariable(ConstString(name)); 54230fdc8d8SChris Lattner 543e23d0b63SShafik Yaghmour if (value_sp) 544e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 545c9858e4dSGreg Clayton } 546316d498bSGreg Clayton } 547581af8b0SJonas Devlieghere } 5484838131bSGreg Clayton 549baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 550dde9cff3SCaroline Tice } 551dde9cff3SCaroline Tice 552b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) { 553baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue, 554baf5664fSJonas Devlieghere (const char *, lldb::ValueType), name, value_type); 555baf5664fSJonas Devlieghere 556316d498bSGreg Clayton SBValue value; 557c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 558c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 559c481c7eeSJim Ingham 560b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 561d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 562b9c1b51eSKate Stone if (frame && target) { 563b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 564b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 565316d498bSGreg Clayton value = FindValue(name, value_type, use_dynamic); 566316d498bSGreg Clayton } 567baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value); 56878a685aaSJim Ingham } 56978a685aaSJim Ingham 570b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type, 571b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 572baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue, 573baf5664fSJonas Devlieghere (const char *, lldb::ValueType, lldb::DynamicValueType), 574baf5664fSJonas Devlieghere name, value_type, use_dynamic); 575baf5664fSJonas Devlieghere 57669b582faSGreg Clayton SBValue sb_value; 5777730b9a4SJim Ingham 578b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') { 579baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 5807730b9a4SJim Ingham } 5817730b9a4SJim Ingham 58281e871edSGreg Clayton ValueObjectSP value_sp; 583bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 584bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5854fc6cb9cSJim Ingham 586dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 587d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5887730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 589b9c1b51eSKate Stone if (target && process) { 5907fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 591b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 5927730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 593b9c1b51eSKate Stone if (frame) { 5948a2a0dfbSEnrico Granata VariableList variable_list; 5958a2a0dfbSEnrico Granata 596b9c1b51eSKate Stone switch (value_type) { 59769b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 59869b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 59969b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 60069b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 60163a27afaSGreg Clayton case eValueTypeVariableThreadLocal: // thread local variables 60269b582faSGreg Clayton { 603d9e416c0SGreg Clayton SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock)); 60472eff18aSGreg Clayton 60572eff18aSGreg Clayton const bool can_create = true; 60672eff18aSGreg Clayton const bool get_parent_variables = true; 60772eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 60872eff18aSGreg Clayton 6090efb51a0SChaoren Lin if (sc.block) 610b9c1b51eSKate Stone sc.block->AppendVariables( 611b9c1b51eSKate Stone can_create, get_parent_variables, 612b9c1b51eSKate Stone stop_if_block_is_inlined_function, 613b9c1b51eSKate Stone [frame](Variable *v) { return v->IsInScope(frame); }, 614b9c1b51eSKate Stone &variable_list); 615b9c1b51eSKate Stone if (value_type == eValueTypeVariableGlobal) { 6168a2a0dfbSEnrico Granata const bool get_file_globals = true; 6178a2a0dfbSEnrico Granata VariableList *frame_vars = frame->GetVariableList(get_file_globals); 6188a2a0dfbSEnrico Granata if (frame_vars) 6198a2a0dfbSEnrico Granata frame_vars->AppendVariablesIfUnique(variable_list); 6208a2a0dfbSEnrico Granata } 62169b582faSGreg Clayton ConstString const_name(name); 622b9c1b51eSKate Stone VariableSP variable_sp( 623b9c1b51eSKate Stone variable_list.FindVariable(const_name, value_type)); 624b9c1b51eSKate Stone if (variable_sp) { 625b9c1b51eSKate Stone value_sp = frame->GetValueObjectForFrameVariable(variable_sp, 626b9c1b51eSKate Stone eNoDynamicValues); 627e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 62830fdc8d8SChris Lattner } 629b9c1b51eSKate Stone } break; 63069b582faSGreg Clayton 63169b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 63269b582faSGreg Clayton { 633d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 634b9c1b51eSKate Stone if (reg_ctx) { 63569b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 636b9c1b51eSKate Stone for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 637b9c1b51eSKate Stone const RegisterInfo *reg_info = 638b9c1b51eSKate Stone reg_ctx->GetRegisterInfoAtIndex(reg_idx); 63969b582faSGreg Clayton if (reg_info && 64069b582faSGreg Clayton ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 641b9c1b51eSKate Stone (reg_info->alt_name && 642b9c1b51eSKate Stone strcasecmp(reg_info->alt_name, name) == 0))) { 643d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 64481e871edSGreg Clayton sb_value.SetSP(value_sp); 64581e871edSGreg Clayton break; 64669b582faSGreg Clayton } 64769b582faSGreg Clayton } 64869b582faSGreg Clayton } 649b9c1b51eSKate Stone } break; 65069b582faSGreg Clayton 651b9c1b51eSKate Stone case eValueTypeRegisterSet: // A collection of stack frame register 652b9c1b51eSKate Stone // values 65369b582faSGreg Clayton { 654d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 655b9c1b51eSKate Stone if (reg_ctx) { 65669b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 657b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 65869b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx); 65969b582faSGreg Clayton if (reg_set && 66069b582faSGreg Clayton ((reg_set->name && strcasecmp(reg_set->name, name) == 0) || 661b9c1b51eSKate Stone (reg_set->short_name && 662b9c1b51eSKate Stone strcasecmp(reg_set->short_name, name) == 0))) { 663b9c1b51eSKate Stone value_sp = 664b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx); 66581e871edSGreg Clayton sb_value.SetSP(value_sp); 66681e871edSGreg Clayton break; 66769b582faSGreg Clayton } 66869b582faSGreg Clayton } 66969b582faSGreg Clayton } 670b9c1b51eSKate Stone } break; 67169b582faSGreg Clayton 67269b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 67369b582faSGreg Clayton { 67469b582faSGreg Clayton ConstString const_name(name); 675b9c1b51eSKate Stone ExpressionVariableSP expr_var_sp( 676b9c1b51eSKate Stone target->GetPersistentVariable(const_name)); 677b9c1b51eSKate Stone if (expr_var_sp) { 67881e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 679e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 68081e871edSGreg Clayton } 681b9c1b51eSKate Stone } break; 68269b582faSGreg Clayton 68369b582faSGreg Clayton default: 68469b582faSGreg Clayton break; 68569b582faSGreg Clayton } 686c9858e4dSGreg Clayton } 6877fdf9ef1SGreg Clayton } 688581af8b0SJonas Devlieghere } 6894838131bSGreg Clayton 690baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 691dde9cff3SCaroline Tice } 692dde9cff3SCaroline Tice 693b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const { 694baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &), 695baf5664fSJonas Devlieghere that); 696baf5664fSJonas Devlieghere 697b57e4a1bSJason Molenda lldb::StackFrameSP this_sp = GetFrameSP(); 698b57e4a1bSJason Molenda lldb::StackFrameSP that_sp = that.GetFrameSP(); 69935e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 70035e2ab60SJohnny Chen } 70135e2ab60SJohnny Chen 702baf5664fSJonas Devlieghere bool SBFrame::operator==(const SBFrame &rhs) const { 703baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator==,(const lldb::SBFrame &), 704baf5664fSJonas Devlieghere rhs); 70530fdc8d8SChris Lattner 706baf5664fSJonas Devlieghere return IsEqual(rhs); 707baf5664fSJonas Devlieghere } 708baf5664fSJonas Devlieghere 709baf5664fSJonas Devlieghere bool SBFrame::operator!=(const SBFrame &rhs) const { 710baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator!=,(const lldb::SBFrame &), 711baf5664fSJonas Devlieghere rhs); 712baf5664fSJonas Devlieghere 713baf5664fSJonas Devlieghere return !IsEqual(rhs); 714baf5664fSJonas Devlieghere } 71530fdc8d8SChris Lattner 716b9c1b51eSKate Stone SBThread SBFrame::GetThread() const { 717baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBThread, SBFrame, GetThread); 718baf5664fSJonas Devlieghere 719c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 720c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 721c481c7eeSJim Ingham 722d9e416c0SGreg Clayton ThreadSP thread_sp(exe_ctx.GetThreadSP()); 723d9e416c0SGreg Clayton SBThread sb_thread(thread_sp); 724ceb6b139SCaroline Tice 725baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_thread); 72630fdc8d8SChris Lattner } 72730fdc8d8SChris Lattner 728b9c1b51eSKate Stone const char *SBFrame::Disassemble() const { 729baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, Disassemble); 730baf5664fSJonas Devlieghere 731dbb0abbfSEugene Zelenko const char *disassembly = nullptr; 732bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 733bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 7344fc6cb9cSJim Ingham 735dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 736d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7377730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 738b9c1b51eSKate Stone if (target && process) { 7397fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 740b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 7417730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 742b9c1b51eSKate Stone if (frame) { 743d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 7447fdf9ef1SGreg Clayton } 745c9858e4dSGreg Clayton } 746581af8b0SJonas Devlieghere } 7474838131bSGreg Clayton 7484838131bSGreg Clayton return disassembly; 74930fdc8d8SChris Lattner } 75030fdc8d8SChris Lattner 751b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics, 752b9c1b51eSKate Stone bool in_scope_only) { 753baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 754baf5664fSJonas Devlieghere (bool, bool, bool, bool), arguments, locals, statics, 755baf5664fSJonas Devlieghere in_scope_only); 756baf5664fSJonas Devlieghere 757316d498bSGreg Clayton SBValueList value_list; 758c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 759c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 760c481c7eeSJim Ingham 761b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 762d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 763b9c1b51eSKate Stone if (frame && target) { 764b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 765b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 766b9c1b51eSKate Stone const bool include_runtime_support_values = 767b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false; 76851f96eebSZachary Turner 76951f96eebSZachary Turner SBVariablesOptions options; 77051f96eebSZachary Turner options.SetIncludeArguments(arguments); 77151f96eebSZachary Turner options.SetIncludeLocals(locals); 77251f96eebSZachary Turner options.SetIncludeStatics(statics); 77351f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 77451f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 77551f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 77651f96eebSZachary Turner 77751f96eebSZachary Turner value_list = GetVariables(options); 778316d498bSGreg Clayton } 779baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value_list); 78078a685aaSJim Ingham } 78178a685aaSJim Ingham 782b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals, 783b9c1b51eSKate Stone bool statics, bool in_scope_only, 784b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 785baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 786baf5664fSJonas Devlieghere (bool, bool, bool, bool, lldb::DynamicValueType), 787baf5664fSJonas Devlieghere arguments, locals, statics, in_scope_only, use_dynamic); 788baf5664fSJonas Devlieghere 789c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 790c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 791c481c7eeSJim Ingham 792560558ebSEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 793b9c1b51eSKate Stone const bool include_runtime_support_values = 794b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false; 79551f96eebSZachary Turner SBVariablesOptions options; 79651f96eebSZachary Turner options.SetIncludeArguments(arguments); 79751f96eebSZachary Turner options.SetIncludeLocals(locals); 79851f96eebSZachary Turner options.SetIncludeStatics(statics); 79951f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 80051f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 80151f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 802baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(GetVariables(options)); 803560558ebSEnrico Granata } 804560558ebSEnrico Granata 805b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) { 806baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 807baf5664fSJonas Devlieghere (const lldb::SBVariablesOptions &), options); 808baf5664fSJonas Devlieghere 809b9556accSGreg Clayton SBValueList value_list; 810bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 811bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 8124fc6cb9cSJim Ingham 813dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 814d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 815b9556accSGreg Clayton 81651f96eebSZachary Turner const bool statics = options.GetIncludeStatics(); 81751f96eebSZachary Turner const bool arguments = options.GetIncludeArguments(); 8184c7f5d5cSKuba Mracek const bool recognized_arguments = 8194c7f5d5cSKuba Mracek options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP())); 82051f96eebSZachary Turner const bool locals = options.GetIncludeLocals(); 82151f96eebSZachary Turner const bool in_scope_only = options.GetInScopeOnly(); 822b9c1b51eSKate Stone const bool include_runtime_support_values = 823b9c1b51eSKate Stone options.GetIncludeRuntimeSupportValues(); 82451f96eebSZachary Turner const lldb::DynamicValueType use_dynamic = options.GetUseDynamic(); 82551f96eebSZachary Turner 826ceb6b139SCaroline Tice 827349213f9SGreg Clayton std::set<VariableSP> variable_set; 8287730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 829b9c1b51eSKate Stone if (target && process) { 8307fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 831b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 8327730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 833b9c1b51eSKate Stone if (frame) { 834dbb0abbfSEugene Zelenko VariableList *variable_list = nullptr; 835d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 836b9c1b51eSKate Stone if (variable_list) { 83730fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 838b9c1b51eSKate Stone if (num_variables) { 839d1782133SRaphael Isemann for (const VariableSP &variable_sp : *variable_list) { 840b9c1b51eSKate Stone if (variable_sp) { 84130fdc8d8SChris Lattner bool add_variable = false; 842b9c1b51eSKate Stone switch (variable_sp->GetScope()) { 84330fdc8d8SChris Lattner case eValueTypeVariableGlobal: 84430fdc8d8SChris Lattner case eValueTypeVariableStatic: 84563a27afaSGreg Clayton case eValueTypeVariableThreadLocal: 84630fdc8d8SChris Lattner add_variable = statics; 84730fdc8d8SChris Lattner break; 84830fdc8d8SChris Lattner 84930fdc8d8SChris Lattner case eValueTypeVariableArgument: 85030fdc8d8SChris Lattner add_variable = arguments; 85130fdc8d8SChris Lattner break; 85230fdc8d8SChris Lattner 85330fdc8d8SChris Lattner case eValueTypeVariableLocal: 85430fdc8d8SChris Lattner add_variable = locals; 85530fdc8d8SChris Lattner break; 856c982c768SGreg Clayton 857c982c768SGreg Clayton default: 858c982c768SGreg Clayton break; 85930fdc8d8SChris Lattner } 860b9c1b51eSKate Stone if (add_variable) { 861349213f9SGreg Clayton // Only add variables once so we don't end up with duplicates 862349213f9SGreg Clayton if (variable_set.find(variable_sp) == variable_set.end()) 863349213f9SGreg Clayton variable_set.insert(variable_sp); 864349213f9SGreg Clayton else 865349213f9SGreg Clayton continue; 866349213f9SGreg Clayton 867d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 86830fdc8d8SChris Lattner continue; 86930fdc8d8SChris Lattner 870b9c1b51eSKate Stone ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable( 871b9c1b51eSKate Stone variable_sp, eNoDynamicValues)); 872560558ebSEnrico Granata 873b9c1b51eSKate Stone if (!include_runtime_support_values && valobj_sp != nullptr && 874dbb0abbfSEugene Zelenko valobj_sp->IsRuntimeSupportValue()) 875560558ebSEnrico Granata continue; 876560558ebSEnrico Granata 877e3e91517SEnrico Granata SBValue value_sb; 878e3e91517SEnrico Granata value_sb.SetSP(valobj_sp, use_dynamic); 879e3e91517SEnrico Granata value_list.Append(value_sb); 88030fdc8d8SChris Lattner } 88130fdc8d8SChris Lattner } 88230fdc8d8SChris Lattner } 88330fdc8d8SChris Lattner } 88430fdc8d8SChris Lattner } 88541ae8e74SKuba Mracek if (recognized_arguments) { 88641ae8e74SKuba Mracek auto recognized_frame = frame->GetRecognizedFrame(); 88741ae8e74SKuba Mracek if (recognized_frame) { 88841ae8e74SKuba Mracek ValueObjectListSP recognized_arg_list = 88941ae8e74SKuba Mracek recognized_frame->GetRecognizedArguments(); 89041ae8e74SKuba Mracek if (recognized_arg_list) { 89141ae8e74SKuba Mracek for (auto &rec_value_sp : recognized_arg_list->GetObjects()) { 89241ae8e74SKuba Mracek SBValue value_sb; 89341ae8e74SKuba Mracek value_sb.SetSP(rec_value_sp, use_dynamic); 89441ae8e74SKuba Mracek value_list.Append(value_sb); 89541ae8e74SKuba Mracek } 89641ae8e74SKuba Mracek } 89741ae8e74SKuba Mracek } 89841ae8e74SKuba Mracek } 899c9858e4dSGreg Clayton } 9007fdf9ef1SGreg Clayton } 901581af8b0SJonas Devlieghere } 902ceb6b139SCaroline Tice 903baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value_list); 90430fdc8d8SChris Lattner } 90530fdc8d8SChris Lattner 906b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() { 907baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBValueList, SBFrame, GetRegisters); 908baf5664fSJonas Devlieghere 90930fdc8d8SChris Lattner SBValueList value_list; 910bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 911bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 9124fc6cb9cSJim Ingham 913dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 914d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 9157730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 916b9c1b51eSKate Stone if (target && process) { 9177fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 918b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 9197730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 920b9c1b51eSKate Stone if (frame) { 921d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 922b9c1b51eSKate Stone if (reg_ctx) { 92330fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 924b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 925b9c1b51eSKate Stone value_list.Append( 926b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx)); 92730fdc8d8SChris Lattner } 92830fdc8d8SChris Lattner } 929c9858e4dSGreg Clayton } 9307fdf9ef1SGreg Clayton } 931581af8b0SJonas Devlieghere } 932ceb6b139SCaroline Tice 933baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value_list); 93430fdc8d8SChris Lattner } 93530fdc8d8SChris Lattner 936b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) { 937baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *), 938baf5664fSJonas Devlieghere name); 939baf5664fSJonas Devlieghere 940ad9a53c5SJason Molenda SBValue result; 941ad9a53c5SJason Molenda ValueObjectSP value_sp; 942bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 943bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 944ad9a53c5SJason Molenda 945dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 946ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr(); 947ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 948b9c1b51eSKate Stone if (target && process) { 949ad9a53c5SJason Molenda Process::StopLocker stop_locker; 950b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 951ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr(); 952b9c1b51eSKate Stone if (frame) { 953ad9a53c5SJason Molenda RegisterContextSP reg_ctx(frame->GetRegisterContext()); 954b9c1b51eSKate Stone if (reg_ctx) { 955ad9a53c5SJason Molenda const uint32_t num_regs = reg_ctx->GetRegisterCount(); 956b9c1b51eSKate Stone for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 957b9c1b51eSKate Stone const RegisterInfo *reg_info = 958b9c1b51eSKate Stone reg_ctx->GetRegisterInfoAtIndex(reg_idx); 959ad9a53c5SJason Molenda if (reg_info && 960ad9a53c5SJason Molenda ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 961b9c1b51eSKate Stone (reg_info->alt_name && 962b9c1b51eSKate Stone strcasecmp(reg_info->alt_name, name) == 0))) { 963ad9a53c5SJason Molenda value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 964ad9a53c5SJason Molenda result.SetSP(value_sp); 965ad9a53c5SJason Molenda break; 966ad9a53c5SJason Molenda } 967ad9a53c5SJason Molenda } 968ad9a53c5SJason Molenda } 969ad9a53c5SJason Molenda } 970ad9a53c5SJason Molenda } 971581af8b0SJonas Devlieghere } 972ad9a53c5SJason Molenda 973baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(result); 974ad9a53c5SJason Molenda } 975ad9a53c5SJason Molenda 976b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) { 977baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &), 978baf5664fSJonas Devlieghere description); 979baf5664fSJonas Devlieghere 980da7bc7d0SGreg Clayton Stream &strm = description.ref(); 981da7bc7d0SGreg Clayton 982bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 983bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 9844fc6cb9cSJim Ingham 985b57e4a1bSJason Molenda StackFrame *frame; 986d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 9877730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 988b9c1b51eSKate Stone if (target && process) { 9897fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 990b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 9917730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 992b9c1b51eSKate Stone if (frame) { 993d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&strm); 9947730b9a4SJim Ingham } 995c9858e4dSGreg Clayton } 996c9858e4dSGreg Clayton 997b9c1b51eSKate Stone } else 998da7bc7d0SGreg Clayton strm.PutCString("No value"); 999dde9cff3SCaroline Tice 1000dde9cff3SCaroline Tice return true; 1001dde9cff3SCaroline Tice } 10021d3afba3SGreg Clayton 1003b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) { 1004baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, (const char *), 1005baf5664fSJonas Devlieghere expr); 1006baf5664fSJonas Devlieghere 1007316d498bSGreg Clayton SBValue result; 1008c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1009c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1010c481c7eeSJim Ingham 1011b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1012d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1013b9c1b51eSKate Stone if (frame && target) { 101435e1bda6SJim Ingham SBExpressionOptions options; 1015b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value = 1016b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 1017cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 101835e1bda6SJim Ingham options.SetUnwindOnError(true); 101924785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1020998c8a1cSRyan Brown if (target->GetLanguage() != eLanguageTypeUnknown) 1021998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1022998c8a1cSRyan Brown else 1023998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 1024baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 1025316d498bSGreg Clayton } 1026baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(result); 102778a685aaSJim Ingham } 102878a685aaSJim Ingham 102978a685aaSJim Ingham SBValue 1030b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr, 1031b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value) { 1032baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1033baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType), expr, 1034baf5664fSJonas Devlieghere fetch_dynamic_value); 1035baf5664fSJonas Devlieghere 103635e1bda6SJim Ingham SBExpressionOptions options; 1037cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 103835e1bda6SJim Ingham options.SetUnwindOnError(true); 103924785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1040c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1041c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1042c481c7eeSJim Ingham 1043998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1044998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1045998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1046998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1047998c8a1cSRyan Brown else if (frame) 1048998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 1049baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 10507ba6e991SJim Ingham } 10517ba6e991SJim Ingham 1052b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr, 1053b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value, 1054b9c1b51eSKate Stone bool unwind_on_error) { 1055baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1056baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType, bool), expr, 1057baf5664fSJonas Devlieghere fetch_dynamic_value, unwind_on_error); 1058baf5664fSJonas Devlieghere 105935e1bda6SJim Ingham SBExpressionOptions options; 1060c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1061c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1062c481c7eeSJim Ingham 1063cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 106435e1bda6SJim Ingham options.SetUnwindOnError(unwind_on_error); 106524785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1066998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1067998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1068998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1069998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1070998c8a1cSRyan Brown else if (frame) 1071998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 1072baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 107335e1bda6SJim Ingham } 107435e1bda6SJim Ingham 1075b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr, 1076b9c1b51eSKate Stone const SBExpressionOptions &options) { 1077baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1078baf5664fSJonas Devlieghere (const char *, const lldb::SBExpressionOptions &), expr, 1079baf5664fSJonas Devlieghere options); 1080baf5664fSJonas Devlieghere 10815160ce5cSGreg Clayton Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1082a162ebafSSean Callanan 108369b582faSGreg Clayton SBValue expr_result; 10847730b9a4SJim Ingham 1085b9c1b51eSKate Stone if (expr == nullptr || expr[0] == '\0') { 1086baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(expr_result); 10877730b9a4SJim Ingham } 10887730b9a4SJim Ingham 108981e871edSGreg Clayton ValueObjectSP expr_value_sp; 10904838131bSGreg Clayton 1091bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1092bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 10934fc6cb9cSJim Ingham 1094b9556accSGreg Clayton 1095dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 10967730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 10977730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 10987730b9a4SJim Ingham 1099b9c1b51eSKate Stone if (target && process) { 11007fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1101b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 11027730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1103b9c1b51eSKate Stone if (frame) { 11048f7db52dSJim Ingham std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace; 1105b9c1b51eSKate Stone if (target->GetDisplayExpressionsInCrashlogs()) { 11061ba7c4d0SGreg Clayton StreamString frame_description; 1107d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&frame_description); 1108a8f3ae7cSJonas Devlieghere stack_trace = std::make_unique<llvm::PrettyStackTraceFormat>( 1109b9c1b51eSKate Stone "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value " 1110b9c1b51eSKate Stone "= %u) %s", 1111b9c1b51eSKate Stone expr, options.GetFetchDynamicValue(), 1112c156427dSZachary Turner frame_description.GetData()); 1113fb6621efSGreg Clayton } 1114fb6621efSGreg Clayton 1115370e5dbaSPavel Labath target->EvaluateExpression(expr, frame, expr_value_sp, options.ref()); 1116e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 11177730b9a4SJim Ingham } 1118c9858e4dSGreg Clayton } 11197fdf9ef1SGreg Clayton } 11204838131bSGreg Clayton 112163e5fb76SJonas Devlieghere LLDB_LOGF(expr_log, 112263e5fb76SJonas Devlieghere "** [SBFrame::EvaluateExpression] Expression result is " 1123b9c1b51eSKate Stone "%s, summary %s **", 1124324a1036SSaleem Abdulrasool expr_result.GetValue(), expr_result.GetSummary()); 11254838131bSGreg Clayton 1126baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(expr_result); 11271d3afba3SGreg Clayton } 1128316d498bSGreg Clayton 1129b9c1b51eSKate Stone bool SBFrame::IsInlined() { 1130baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsInlined); 1131baf5664fSJonas Devlieghere 113205f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->IsInlined(); 113305f75e9fSOleksiy Vyalov } 113405f75e9fSOleksiy Vyalov 1135b9c1b51eSKate Stone bool SBFrame::IsInlined() const { 1136baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsInlined); 1137baf5664fSJonas Devlieghere 1138c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1139c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1140c481c7eeSJim Ingham 1141dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1142d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 11437730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1144b9c1b51eSKate Stone if (target && process) { 11457fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1146b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 11477730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1148b9c1b51eSKate Stone if (frame) { 11497fdf9ef1SGreg Clayton 1150d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1151316d498bSGreg Clayton if (block) 1152dbb0abbfSEugene Zelenko return block->GetContainingInlinedBlock() != nullptr; 11537730b9a4SJim Ingham } 1154c9858e4dSGreg Clayton } 11557fdf9ef1SGreg Clayton } 1156316d498bSGreg Clayton return false; 1157316d498bSGreg Clayton } 1158316d498bSGreg Clayton 11594b36f791SVedant Kumar bool SBFrame::IsArtificial() { 1160baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsArtificial); 1161baf5664fSJonas Devlieghere 11624b36f791SVedant Kumar return static_cast<const SBFrame *>(this)->IsArtificial(); 11634b36f791SVedant Kumar } 11644b36f791SVedant Kumar 11654b36f791SVedant Kumar bool SBFrame::IsArtificial() const { 1166baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsArtificial); 1167baf5664fSJonas Devlieghere 11684b36f791SVedant Kumar std::unique_lock<std::recursive_mutex> lock; 11694b36f791SVedant Kumar ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 11704b36f791SVedant Kumar 11714b36f791SVedant Kumar StackFrame *frame = exe_ctx.GetFramePtr(); 11724b36f791SVedant Kumar if (frame) 11734b36f791SVedant Kumar return frame->IsArtificial(); 11744b36f791SVedant Kumar 11754b36f791SVedant Kumar return false; 11764b36f791SVedant Kumar } 11774b36f791SVedant Kumar 1178b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() { 1179baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetFunctionName); 1180baf5664fSJonas Devlieghere 118105f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->GetFunctionName(); 118205f75e9fSOleksiy Vyalov } 118305f75e9fSOleksiy Vyalov 1184bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const { 1185baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::LanguageType, SBFrame, GuessLanguage); 1186baf5664fSJonas Devlieghere 1187bdbdd229SJim Ingham std::unique_lock<std::recursive_mutex> lock; 1188bdbdd229SJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1189bdbdd229SJim Ingham 1190bdbdd229SJim Ingham StackFrame *frame = nullptr; 1191bdbdd229SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 1192bdbdd229SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1193bdbdd229SJim Ingham if (target && process) { 1194bdbdd229SJim Ingham Process::StopLocker stop_locker; 1195bdbdd229SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) { 1196bdbdd229SJim Ingham frame = exe_ctx.GetFramePtr(); 1197bdbdd229SJim Ingham if (frame) { 1198bdbdd229SJim Ingham return frame->GuessLanguage(); 1199bdbdd229SJim Ingham } 1200bdbdd229SJim Ingham } 1201bdbdd229SJim Ingham } 1202bdbdd229SJim Ingham return eLanguageTypeUnknown; 1203bdbdd229SJim Ingham } 1204bdbdd229SJim Ingham 1205b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const { 1206baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, GetFunctionName); 1207baf5664fSJonas Devlieghere 1208dbb0abbfSEugene Zelenko const char *name = nullptr; 1209c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1210c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1211c481c7eeSJim Ingham 1212dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1213d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 12147730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1215b9c1b51eSKate Stone if (target && process) { 12167fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1217b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 12187730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1219b9c1b51eSKate Stone if (frame) { 1220b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1221b9c1b51eSKate Stone eSymbolContextBlock | 1222b9c1b51eSKate Stone eSymbolContextSymbol)); 1223b9c1b51eSKate Stone if (sc.block) { 1224316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1225b9c1b51eSKate Stone if (inlined_block) { 1226b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1227b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 1228*22b04487SAlex Langford name = inlined_info->GetName().AsCString(); 1229316d498bSGreg Clayton } 1230316d498bSGreg Clayton } 1231316d498bSGreg Clayton 1232b9c1b51eSKate Stone if (name == nullptr) { 1233316d498bSGreg Clayton if (sc.function) 1234316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1235316d498bSGreg Clayton } 1236316d498bSGreg Clayton 1237b9c1b51eSKate Stone if (name == nullptr) { 1238316d498bSGreg Clayton if (sc.symbol) 1239316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1240316d498bSGreg Clayton } 12417730b9a4SJim Ingham } 1242c9858e4dSGreg Clayton } 12437fdf9ef1SGreg Clayton } 1244316d498bSGreg Clayton return name; 1245316d498bSGreg Clayton } 1246c1f705c2SEnrico Granata 1247b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() { 1248baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetDisplayFunctionName); 1249baf5664fSJonas Devlieghere 1250dbb0abbfSEugene Zelenko const char *name = nullptr; 1251c481c7eeSJim Ingham 1252c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1253c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1254c481c7eeSJim Ingham 1255dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1256c1f705c2SEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 1257c1f705c2SEnrico Granata Process *process = exe_ctx.GetProcessPtr(); 1258b9c1b51eSKate Stone if (target && process) { 1259c1f705c2SEnrico Granata Process::StopLocker stop_locker; 1260b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1261c1f705c2SEnrico Granata frame = exe_ctx.GetFramePtr(); 1262b9c1b51eSKate Stone if (frame) { 1263b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1264b9c1b51eSKate Stone eSymbolContextBlock | 1265b9c1b51eSKate Stone eSymbolContextSymbol)); 1266b9c1b51eSKate Stone if (sc.block) { 1267c1f705c2SEnrico Granata Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1268b9c1b51eSKate Stone if (inlined_block) { 1269b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1270b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 1271*22b04487SAlex Langford name = inlined_info->GetDisplayName().AsCString(); 1272c1f705c2SEnrico Granata } 1273c1f705c2SEnrico Granata } 1274c1f705c2SEnrico Granata 1275b9c1b51eSKate Stone if (name == nullptr) { 1276c1f705c2SEnrico Granata if (sc.function) 1277c1f705c2SEnrico Granata name = sc.function->GetDisplayName().GetCString(); 1278c1f705c2SEnrico Granata } 1279c1f705c2SEnrico Granata 1280b9c1b51eSKate Stone if (name == nullptr) { 1281c1f705c2SEnrico Granata if (sc.symbol) 1282c1f705c2SEnrico Granata name = sc.symbol->GetDisplayName().GetCString(); 1283c1f705c2SEnrico Granata } 1284c1f705c2SEnrico Granata } 1285c1f705c2SEnrico Granata } 1286c1f705c2SEnrico Granata } 1287c1f705c2SEnrico Granata return name; 1288c1f705c2SEnrico Granata } 1289ae211eceSMichal Gorny 1290ae211eceSMichal Gorny namespace lldb_private { 1291ae211eceSMichal Gorny namespace repro { 1292ae211eceSMichal Gorny 1293ae211eceSMichal Gorny template <> 1294ae211eceSMichal Gorny void RegisterMethods<SBFrame>(Registry &R) { 1295ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBFrame, ()); 1296ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBFrame, (const lldb::StackFrameSP &)); 1297ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBFrame, (const lldb::SBFrame &)); 1298ae211eceSMichal Gorny LLDB_REGISTER_METHOD(const lldb::SBFrame &, 1299ae211eceSMichal Gorny SBFrame, operator=,(const lldb::SBFrame &)); 1300ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsValid, ()); 1301ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBFrame, operator bool, ()); 1302ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBSymbolContext, SBFrame, GetSymbolContext, 1303ae211eceSMichal Gorny (uint32_t)); 1304ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBModule, SBFrame, GetModule, ()); 1305ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBCompileUnit, SBFrame, GetCompileUnit, 1306ae211eceSMichal Gorny ()); 1307ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBFunction, SBFrame, GetFunction, ()); 1308ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBSymbol, SBFrame, GetSymbol, ()); 1309ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBBlock, SBFrame, GetBlock, ()); 1310ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBBlock, SBFrame, GetFrameBlock, ()); 1311ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBLineEntry, SBFrame, GetLineEntry, ()); 1312ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(uint32_t, SBFrame, GetFrameID, ()); 1313ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetCFA, ()); 1314ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetPC, ()); 1315ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBFrame, SetPC, (lldb::addr_t)); 1316ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetSP, ()); 1317ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetFP, ()); 1318ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBFrame, GetPCAddress, ()); 1319ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBFrame, Clear, ()); 1320ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 1321ae211eceSMichal Gorny (const char *)); 1322ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 1323ae211eceSMichal Gorny (const char *, lldb::DynamicValueType)); 1324ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *)); 1325ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindVariable, 1326ae211eceSMichal Gorny (const char *, lldb::DynamicValueType)); 1327ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindValue, 1328ae211eceSMichal Gorny (const char *, lldb::ValueType)); 1329ae211eceSMichal Gorny LLDB_REGISTER_METHOD( 1330ae211eceSMichal Gorny lldb::SBValue, SBFrame, FindValue, 1331ae211eceSMichal Gorny (const char *, lldb::ValueType, lldb::DynamicValueType)); 1332ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &)); 1333ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, 1334ae211eceSMichal Gorny SBFrame, operator==,(const lldb::SBFrame &)); 1335ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, 1336ae211eceSMichal Gorny SBFrame, operator!=,(const lldb::SBFrame &)); 1337ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBThread, SBFrame, GetThread, ()); 1338ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(const char *, SBFrame, Disassemble, ()); 1339ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables, 1340ae211eceSMichal Gorny (bool, bool, bool, bool)); 1341ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables, 1342ae211eceSMichal Gorny (bool, bool, bool, bool, lldb::DynamicValueType)); 1343ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables, 1344ae211eceSMichal Gorny (const lldb::SBVariablesOptions &)); 1345ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetRegisters, ()); 1346ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *)); 1347ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &)); 1348ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1349ae211eceSMichal Gorny (const char *)); 1350ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1351ae211eceSMichal Gorny (const char *, lldb::DynamicValueType)); 1352ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1353ae211eceSMichal Gorny (const char *, lldb::DynamicValueType, bool)); 1354ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1355ae211eceSMichal Gorny (const char *, const lldb::SBExpressionOptions &)); 1356ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBFrame, IsInlined, ()); 1357ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsInlined, ()); 1358ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBFrame, IsArtificial, ()); 1359ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsArtificial, ()); 1360ae211eceSMichal Gorny LLDB_REGISTER_METHOD(const char *, SBFrame, GetFunctionName, ()); 1361ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::LanguageType, SBFrame, GuessLanguage, ()); 1362ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(const char *, SBFrame, GetFunctionName, ()); 1363ae211eceSMichal Gorny LLDB_REGISTER_METHOD(const char *, SBFrame, GetDisplayFunctionName, ()); 1364ae211eceSMichal Gorny } 1365ae211eceSMichal Gorny 1366ae211eceSMichal Gorny } 1367ae211eceSMichal Gorny } 1368