130fdc8d8SChris Lattner //===-- SBFrame.cpp ---------------------------------------------*- C++ -*-===// 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 17b9c1b51eSKate Stone #include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h" 18baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h" 19bd4bf82aSJonas Devlieghere #include "Utils.h" 2030fdc8d8SChris Lattner #include "lldb/Core/Address.h" 2130fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2230fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h" 2330fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.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); 81efabb123SGreg Clayton return *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) { 83430fdc8d8SChris Lattner size_t i; 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) { 840b9c1b51eSKate Stone for (i = 0; i < num_variables; ++i) { 84130fdc8d8SChris Lattner VariableSP variable_sp(variable_list->GetVariableAtIndex(i)); 842b9c1b51eSKate Stone if (variable_sp) { 84330fdc8d8SChris Lattner bool add_variable = false; 844b9c1b51eSKate Stone switch (variable_sp->GetScope()) { 84530fdc8d8SChris Lattner case eValueTypeVariableGlobal: 84630fdc8d8SChris Lattner case eValueTypeVariableStatic: 84763a27afaSGreg Clayton case eValueTypeVariableThreadLocal: 84830fdc8d8SChris Lattner add_variable = statics; 84930fdc8d8SChris Lattner break; 85030fdc8d8SChris Lattner 85130fdc8d8SChris Lattner case eValueTypeVariableArgument: 85230fdc8d8SChris Lattner add_variable = arguments; 85330fdc8d8SChris Lattner break; 85430fdc8d8SChris Lattner 85530fdc8d8SChris Lattner case eValueTypeVariableLocal: 85630fdc8d8SChris Lattner add_variable = locals; 85730fdc8d8SChris Lattner break; 858c982c768SGreg Clayton 859c982c768SGreg Clayton default: 860c982c768SGreg Clayton break; 86130fdc8d8SChris Lattner } 862b9c1b51eSKate Stone if (add_variable) { 863349213f9SGreg Clayton // Only add variables once so we don't end up with duplicates 864349213f9SGreg Clayton if (variable_set.find(variable_sp) == variable_set.end()) 865349213f9SGreg Clayton variable_set.insert(variable_sp); 866349213f9SGreg Clayton else 867349213f9SGreg Clayton continue; 868349213f9SGreg Clayton 869d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 87030fdc8d8SChris Lattner continue; 87130fdc8d8SChris Lattner 872b9c1b51eSKate Stone ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable( 873b9c1b51eSKate Stone variable_sp, eNoDynamicValues)); 874560558ebSEnrico Granata 875b9c1b51eSKate Stone if (!include_runtime_support_values && valobj_sp != nullptr && 876dbb0abbfSEugene Zelenko valobj_sp->IsRuntimeSupportValue()) 877560558ebSEnrico Granata continue; 878560558ebSEnrico Granata 879e3e91517SEnrico Granata SBValue value_sb; 880e3e91517SEnrico Granata value_sb.SetSP(valobj_sp, use_dynamic); 881e3e91517SEnrico Granata value_list.Append(value_sb); 88230fdc8d8SChris Lattner } 88330fdc8d8SChris Lattner } 88430fdc8d8SChris Lattner } 88530fdc8d8SChris Lattner } 88630fdc8d8SChris Lattner } 88741ae8e74SKuba Mracek if (recognized_arguments) { 88841ae8e74SKuba Mracek auto recognized_frame = frame->GetRecognizedFrame(); 88941ae8e74SKuba Mracek if (recognized_frame) { 89041ae8e74SKuba Mracek ValueObjectListSP recognized_arg_list = 89141ae8e74SKuba Mracek recognized_frame->GetRecognizedArguments(); 89241ae8e74SKuba Mracek if (recognized_arg_list) { 89341ae8e74SKuba Mracek for (auto &rec_value_sp : recognized_arg_list->GetObjects()) { 89441ae8e74SKuba Mracek SBValue value_sb; 89541ae8e74SKuba Mracek value_sb.SetSP(rec_value_sp, use_dynamic); 89641ae8e74SKuba Mracek value_list.Append(value_sb); 89741ae8e74SKuba Mracek } 89841ae8e74SKuba Mracek } 89941ae8e74SKuba Mracek } 90041ae8e74SKuba Mracek } 901c9858e4dSGreg Clayton } 9027fdf9ef1SGreg Clayton } 903581af8b0SJonas Devlieghere } 904ceb6b139SCaroline Tice 905baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value_list); 90630fdc8d8SChris Lattner } 90730fdc8d8SChris Lattner 908b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() { 909baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBValueList, SBFrame, GetRegisters); 910baf5664fSJonas Devlieghere 91130fdc8d8SChris Lattner SBValueList value_list; 912bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 913bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 9144fc6cb9cSJim Ingham 915dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 916d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 9177730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 918b9c1b51eSKate Stone if (target && process) { 9197fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 920b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 9217730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 922b9c1b51eSKate Stone if (frame) { 923d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 924b9c1b51eSKate Stone if (reg_ctx) { 92530fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 926b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 927b9c1b51eSKate Stone value_list.Append( 928b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx)); 92930fdc8d8SChris Lattner } 93030fdc8d8SChris Lattner } 931c9858e4dSGreg Clayton } 9327fdf9ef1SGreg Clayton } 933581af8b0SJonas Devlieghere } 934ceb6b139SCaroline Tice 935baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value_list); 93630fdc8d8SChris Lattner } 93730fdc8d8SChris Lattner 938b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) { 939baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *), 940baf5664fSJonas Devlieghere name); 941baf5664fSJonas Devlieghere 942ad9a53c5SJason Molenda SBValue result; 943ad9a53c5SJason Molenda ValueObjectSP value_sp; 944bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 945bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 946ad9a53c5SJason Molenda 947dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 948ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr(); 949ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 950b9c1b51eSKate Stone if (target && process) { 951ad9a53c5SJason Molenda Process::StopLocker stop_locker; 952b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 953ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr(); 954b9c1b51eSKate Stone if (frame) { 955ad9a53c5SJason Molenda RegisterContextSP reg_ctx(frame->GetRegisterContext()); 956b9c1b51eSKate Stone if (reg_ctx) { 957ad9a53c5SJason Molenda const uint32_t num_regs = reg_ctx->GetRegisterCount(); 958b9c1b51eSKate Stone for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 959b9c1b51eSKate Stone const RegisterInfo *reg_info = 960b9c1b51eSKate Stone reg_ctx->GetRegisterInfoAtIndex(reg_idx); 961ad9a53c5SJason Molenda if (reg_info && 962ad9a53c5SJason Molenda ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 963b9c1b51eSKate Stone (reg_info->alt_name && 964b9c1b51eSKate Stone strcasecmp(reg_info->alt_name, name) == 0))) { 965ad9a53c5SJason Molenda value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 966ad9a53c5SJason Molenda result.SetSP(value_sp); 967ad9a53c5SJason Molenda break; 968ad9a53c5SJason Molenda } 969ad9a53c5SJason Molenda } 970ad9a53c5SJason Molenda } 971ad9a53c5SJason Molenda } 972ad9a53c5SJason Molenda } 973581af8b0SJonas Devlieghere } 974ad9a53c5SJason Molenda 975baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(result); 976ad9a53c5SJason Molenda } 977ad9a53c5SJason Molenda 978b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) { 979baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &), 980baf5664fSJonas Devlieghere description); 981baf5664fSJonas Devlieghere 982da7bc7d0SGreg Clayton Stream &strm = description.ref(); 983da7bc7d0SGreg Clayton 984bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 985bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 9864fc6cb9cSJim Ingham 987b57e4a1bSJason Molenda StackFrame *frame; 988d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 9897730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 990b9c1b51eSKate Stone if (target && process) { 9917fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 992b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 9937730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 994b9c1b51eSKate Stone if (frame) { 995d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&strm); 9967730b9a4SJim Ingham } 997c9858e4dSGreg Clayton } 998c9858e4dSGreg Clayton 999b9c1b51eSKate Stone } else 1000da7bc7d0SGreg Clayton strm.PutCString("No value"); 1001dde9cff3SCaroline Tice 1002dde9cff3SCaroline Tice return true; 1003dde9cff3SCaroline Tice } 10041d3afba3SGreg Clayton 1005b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) { 1006baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, (const char *), 1007baf5664fSJonas Devlieghere expr); 1008baf5664fSJonas Devlieghere 1009316d498bSGreg Clayton SBValue result; 1010c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1011c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1012c481c7eeSJim Ingham 1013b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1014d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1015b9c1b51eSKate Stone if (frame && target) { 101635e1bda6SJim Ingham SBExpressionOptions options; 1017b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value = 1018b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 1019cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 102035e1bda6SJim Ingham options.SetUnwindOnError(true); 102124785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1022998c8a1cSRyan Brown if (target->GetLanguage() != eLanguageTypeUnknown) 1023998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1024998c8a1cSRyan Brown else 1025998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 1026baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 1027316d498bSGreg Clayton } 1028baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(result); 102978a685aaSJim Ingham } 103078a685aaSJim Ingham 103178a685aaSJim Ingham SBValue 1032b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr, 1033b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value) { 1034baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1035baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType), expr, 1036baf5664fSJonas Devlieghere fetch_dynamic_value); 1037baf5664fSJonas Devlieghere 103835e1bda6SJim Ingham SBExpressionOptions options; 1039cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 104035e1bda6SJim Ingham options.SetUnwindOnError(true); 104124785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1042c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1043c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1044c481c7eeSJim Ingham 1045998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1046998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1047998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1048998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1049998c8a1cSRyan Brown else if (frame) 1050998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 1051baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 10527ba6e991SJim Ingham } 10537ba6e991SJim Ingham 1054b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr, 1055b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value, 1056b9c1b51eSKate Stone bool unwind_on_error) { 1057baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1058baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType, bool), expr, 1059baf5664fSJonas Devlieghere fetch_dynamic_value, unwind_on_error); 1060baf5664fSJonas Devlieghere 106135e1bda6SJim Ingham SBExpressionOptions options; 1062c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1063c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1064c481c7eeSJim Ingham 1065cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 106635e1bda6SJim Ingham options.SetUnwindOnError(unwind_on_error); 106724785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1068998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1069998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1070998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1071998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1072998c8a1cSRyan Brown else if (frame) 1073998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 1074baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 107535e1bda6SJim Ingham } 107635e1bda6SJim Ingham 1077b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr, 1078b9c1b51eSKate Stone const SBExpressionOptions &options) { 1079baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1080baf5664fSJonas Devlieghere (const char *, const lldb::SBExpressionOptions &), expr, 1081baf5664fSJonas Devlieghere options); 1082baf5664fSJonas Devlieghere 10835160ce5cSGreg Clayton Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1084a162ebafSSean Callanan 108569b582faSGreg Clayton SBValue expr_result; 10867730b9a4SJim Ingham 1087b9c1b51eSKate Stone if (expr == nullptr || expr[0] == '\0') { 1088baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(expr_result); 10897730b9a4SJim Ingham } 10907730b9a4SJim Ingham 109181e871edSGreg Clayton ValueObjectSP expr_value_sp; 10924838131bSGreg Clayton 1093bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1094bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 10954fc6cb9cSJim Ingham 1096b9556accSGreg Clayton 1097dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 10987730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 10997730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 11007730b9a4SJim Ingham 1101b9c1b51eSKate Stone if (target && process) { 11027fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1103b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 11047730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1105b9c1b51eSKate Stone if (frame) { 11068f7db52dSJim Ingham std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace; 1107b9c1b51eSKate Stone if (target->GetDisplayExpressionsInCrashlogs()) { 11081ba7c4d0SGreg Clayton StreamString frame_description; 1109d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&frame_description); 11108f7db52dSJim Ingham stack_trace = llvm::make_unique<llvm::PrettyStackTraceFormat>( 1111b9c1b51eSKate Stone "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value " 1112b9c1b51eSKate Stone "= %u) %s", 1113b9c1b51eSKate Stone expr, options.GetFetchDynamicValue(), 1114c156427dSZachary Turner frame_description.GetData()); 1115fb6621efSGreg Clayton } 1116fb6621efSGreg Clayton 1117370e5dbaSPavel Labath target->EvaluateExpression(expr, frame, expr_value_sp, options.ref()); 1118e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 11197730b9a4SJim Ingham } 1120c9858e4dSGreg Clayton } 11217fdf9ef1SGreg Clayton } 11224838131bSGreg Clayton 1123a162ebafSSean Callanan if (expr_log) 1124b9c1b51eSKate Stone expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is " 1125b9c1b51eSKate Stone "%s, summary %s **", 1126324a1036SSaleem Abdulrasool expr_result.GetValue(), expr_result.GetSummary()); 11274838131bSGreg Clayton 1128baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(expr_result); 11291d3afba3SGreg Clayton } 1130316d498bSGreg Clayton 1131b9c1b51eSKate Stone bool SBFrame::IsInlined() { 1132baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsInlined); 1133baf5664fSJonas Devlieghere 113405f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->IsInlined(); 113505f75e9fSOleksiy Vyalov } 113605f75e9fSOleksiy Vyalov 1137b9c1b51eSKate Stone bool SBFrame::IsInlined() const { 1138baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsInlined); 1139baf5664fSJonas Devlieghere 1140c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1141c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1142c481c7eeSJim Ingham 1143dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1144d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 11457730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1146b9c1b51eSKate Stone if (target && process) { 11477fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1148b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 11497730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1150b9c1b51eSKate Stone if (frame) { 11517fdf9ef1SGreg Clayton 1152d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1153316d498bSGreg Clayton if (block) 1154dbb0abbfSEugene Zelenko return block->GetContainingInlinedBlock() != nullptr; 11557730b9a4SJim Ingham } 1156c9858e4dSGreg Clayton } 11577fdf9ef1SGreg Clayton } 1158316d498bSGreg Clayton return false; 1159316d498bSGreg Clayton } 1160316d498bSGreg Clayton 11614b36f791SVedant Kumar bool SBFrame::IsArtificial() { 1162baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsArtificial); 1163baf5664fSJonas Devlieghere 11644b36f791SVedant Kumar return static_cast<const SBFrame *>(this)->IsArtificial(); 11654b36f791SVedant Kumar } 11664b36f791SVedant Kumar 11674b36f791SVedant Kumar bool SBFrame::IsArtificial() const { 1168baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsArtificial); 1169baf5664fSJonas Devlieghere 11704b36f791SVedant Kumar std::unique_lock<std::recursive_mutex> lock; 11714b36f791SVedant Kumar ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 11724b36f791SVedant Kumar 11734b36f791SVedant Kumar StackFrame *frame = exe_ctx.GetFramePtr(); 11744b36f791SVedant Kumar if (frame) 11754b36f791SVedant Kumar return frame->IsArtificial(); 11764b36f791SVedant Kumar 11774b36f791SVedant Kumar return false; 11784b36f791SVedant Kumar } 11794b36f791SVedant Kumar 1180b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() { 1181baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetFunctionName); 1182baf5664fSJonas Devlieghere 118305f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->GetFunctionName(); 118405f75e9fSOleksiy Vyalov } 118505f75e9fSOleksiy Vyalov 1186bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const { 1187baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::LanguageType, SBFrame, GuessLanguage); 1188baf5664fSJonas Devlieghere 1189bdbdd229SJim Ingham std::unique_lock<std::recursive_mutex> lock; 1190bdbdd229SJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1191bdbdd229SJim Ingham 1192bdbdd229SJim Ingham StackFrame *frame = nullptr; 1193bdbdd229SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 1194bdbdd229SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1195bdbdd229SJim Ingham if (target && process) { 1196bdbdd229SJim Ingham Process::StopLocker stop_locker; 1197bdbdd229SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) { 1198bdbdd229SJim Ingham frame = exe_ctx.GetFramePtr(); 1199bdbdd229SJim Ingham if (frame) { 1200bdbdd229SJim Ingham return frame->GuessLanguage(); 1201bdbdd229SJim Ingham } 1202bdbdd229SJim Ingham } 1203bdbdd229SJim Ingham } 1204bdbdd229SJim Ingham return eLanguageTypeUnknown; 1205bdbdd229SJim Ingham } 1206bdbdd229SJim Ingham 1207b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const { 1208baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, GetFunctionName); 1209baf5664fSJonas Devlieghere 1210dbb0abbfSEugene Zelenko const char *name = nullptr; 1211c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1212c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1213c481c7eeSJim Ingham 1214dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1215d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 12167730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1217b9c1b51eSKate Stone if (target && process) { 12187fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1219b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 12207730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1221b9c1b51eSKate Stone if (frame) { 1222b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1223b9c1b51eSKate Stone eSymbolContextBlock | 1224b9c1b51eSKate Stone eSymbolContextSymbol)); 1225b9c1b51eSKate Stone if (sc.block) { 1226316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1227b9c1b51eSKate Stone if (inlined_block) { 1228b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1229b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 1230b9c1b51eSKate Stone name = 1231b9c1b51eSKate Stone inlined_info->GetName(sc.function->GetLanguage()).AsCString(); 1232316d498bSGreg Clayton } 1233316d498bSGreg Clayton } 1234316d498bSGreg Clayton 1235b9c1b51eSKate Stone if (name == nullptr) { 1236316d498bSGreg Clayton if (sc.function) 1237316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1238316d498bSGreg Clayton } 1239316d498bSGreg Clayton 1240b9c1b51eSKate Stone if (name == nullptr) { 1241316d498bSGreg Clayton if (sc.symbol) 1242316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1243316d498bSGreg Clayton } 12447730b9a4SJim Ingham } 1245c9858e4dSGreg Clayton } 12467fdf9ef1SGreg Clayton } 1247316d498bSGreg Clayton return name; 1248316d498bSGreg Clayton } 1249c1f705c2SEnrico Granata 1250b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() { 1251baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetDisplayFunctionName); 1252baf5664fSJonas Devlieghere 1253dbb0abbfSEugene Zelenko const char *name = nullptr; 1254c481c7eeSJim Ingham 1255c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1256c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1257c481c7eeSJim Ingham 1258dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1259c1f705c2SEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 1260c1f705c2SEnrico Granata Process *process = exe_ctx.GetProcessPtr(); 1261b9c1b51eSKate Stone if (target && process) { 1262c1f705c2SEnrico Granata Process::StopLocker stop_locker; 1263b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1264c1f705c2SEnrico Granata frame = exe_ctx.GetFramePtr(); 1265b9c1b51eSKate Stone if (frame) { 1266b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1267b9c1b51eSKate Stone eSymbolContextBlock | 1268b9c1b51eSKate Stone eSymbolContextSymbol)); 1269b9c1b51eSKate Stone if (sc.block) { 1270c1f705c2SEnrico Granata Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1271b9c1b51eSKate Stone if (inlined_block) { 1272b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1273b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 1274b9c1b51eSKate Stone name = inlined_info->GetDisplayName(sc.function->GetLanguage()) 1275b9c1b51eSKate Stone .AsCString(); 1276c1f705c2SEnrico Granata } 1277c1f705c2SEnrico Granata } 1278c1f705c2SEnrico Granata 1279b9c1b51eSKate Stone if (name == nullptr) { 1280c1f705c2SEnrico Granata if (sc.function) 1281c1f705c2SEnrico Granata name = sc.function->GetDisplayName().GetCString(); 1282c1f705c2SEnrico Granata } 1283c1f705c2SEnrico Granata 1284b9c1b51eSKate Stone if (name == nullptr) { 1285c1f705c2SEnrico Granata if (sc.symbol) 1286c1f705c2SEnrico Granata name = sc.symbol->GetDisplayName().GetCString(); 1287c1f705c2SEnrico Granata } 1288c1f705c2SEnrico Granata } 1289c1f705c2SEnrico Granata } 1290c1f705c2SEnrico Granata } 1291c1f705c2SEnrico Granata return name; 1292c1f705c2SEnrico Granata } 1293*ae211eceSMichal Gorny 1294*ae211eceSMichal Gorny namespace lldb_private { 1295*ae211eceSMichal Gorny namespace repro { 1296*ae211eceSMichal Gorny 1297*ae211eceSMichal Gorny template <> 1298*ae211eceSMichal Gorny void RegisterMethods<SBFrame>(Registry &R) { 1299*ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBFrame, ()); 1300*ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBFrame, (const lldb::StackFrameSP &)); 1301*ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBFrame, (const lldb::SBFrame &)); 1302*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(const lldb::SBFrame &, 1303*ae211eceSMichal Gorny SBFrame, operator=,(const lldb::SBFrame &)); 1304*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsValid, ()); 1305*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBFrame, operator bool, ()); 1306*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBSymbolContext, SBFrame, GetSymbolContext, 1307*ae211eceSMichal Gorny (uint32_t)); 1308*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBModule, SBFrame, GetModule, ()); 1309*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBCompileUnit, SBFrame, GetCompileUnit, 1310*ae211eceSMichal Gorny ()); 1311*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBFunction, SBFrame, GetFunction, ()); 1312*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBSymbol, SBFrame, GetSymbol, ()); 1313*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBBlock, SBFrame, GetBlock, ()); 1314*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBBlock, SBFrame, GetFrameBlock, ()); 1315*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBLineEntry, SBFrame, GetLineEntry, ()); 1316*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(uint32_t, SBFrame, GetFrameID, ()); 1317*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetCFA, ()); 1318*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetPC, ()); 1319*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBFrame, SetPC, (lldb::addr_t)); 1320*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetSP, ()); 1321*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetFP, ()); 1322*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBFrame, GetPCAddress, ()); 1323*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBFrame, Clear, ()); 1324*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 1325*ae211eceSMichal Gorny (const char *)); 1326*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 1327*ae211eceSMichal Gorny (const char *, lldb::DynamicValueType)); 1328*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *)); 1329*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindVariable, 1330*ae211eceSMichal Gorny (const char *, lldb::DynamicValueType)); 1331*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindValue, 1332*ae211eceSMichal Gorny (const char *, lldb::ValueType)); 1333*ae211eceSMichal Gorny LLDB_REGISTER_METHOD( 1334*ae211eceSMichal Gorny lldb::SBValue, SBFrame, FindValue, 1335*ae211eceSMichal Gorny (const char *, lldb::ValueType, lldb::DynamicValueType)); 1336*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &)); 1337*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, 1338*ae211eceSMichal Gorny SBFrame, operator==,(const lldb::SBFrame &)); 1339*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, 1340*ae211eceSMichal Gorny SBFrame, operator!=,(const lldb::SBFrame &)); 1341*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBThread, SBFrame, GetThread, ()); 1342*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(const char *, SBFrame, Disassemble, ()); 1343*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables, 1344*ae211eceSMichal Gorny (bool, bool, bool, bool)); 1345*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables, 1346*ae211eceSMichal Gorny (bool, bool, bool, bool, lldb::DynamicValueType)); 1347*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables, 1348*ae211eceSMichal Gorny (const lldb::SBVariablesOptions &)); 1349*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetRegisters, ()); 1350*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *)); 1351*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &)); 1352*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1353*ae211eceSMichal Gorny (const char *)); 1354*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1355*ae211eceSMichal Gorny (const char *, lldb::DynamicValueType)); 1356*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1357*ae211eceSMichal Gorny (const char *, lldb::DynamicValueType, bool)); 1358*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1359*ae211eceSMichal Gorny (const char *, const lldb::SBExpressionOptions &)); 1360*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBFrame, IsInlined, ()); 1361*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsInlined, ()); 1362*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBFrame, IsArtificial, ()); 1363*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsArtificial, ()); 1364*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(const char *, SBFrame, GetFunctionName, ()); 1365*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::LanguageType, SBFrame, GuessLanguage, ()); 1366*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(const char *, SBFrame, GetFunctionName, ()); 1367*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(const char *, SBFrame, GetDisplayFunctionName, ()); 1368*ae211eceSMichal Gorny } 1369*ae211eceSMichal Gorny 1370*ae211eceSMichal Gorny } 1371*ae211eceSMichal Gorny } 1372