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"
18*baf5664fSJonas 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"
416f9e6901SZachary Turner #include "lldb/Utility/Log.h"
42bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
4330fdc8d8SChris Lattner 
444c5de699SEli Friedman #include "lldb/API/SBAddress.h"
45b9c1b51eSKate Stone #include "lldb/API/SBDebugger.h"
4635e1bda6SJim Ingham #include "lldb/API/SBExpressionOptions.h"
47dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
484c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h"
494c5de699SEli Friedman #include "lldb/API/SBThread.h"
50b9c1b51eSKate Stone #include "lldb/API/SBValue.h"
5151f96eebSZachary Turner #include "lldb/API/SBVariablesOptions.h"
5230fdc8d8SChris Lattner 
53237c3ed9SSean Callanan #include "llvm/Support/PrettyStackTrace.h"
54237c3ed9SSean Callanan 
5530fdc8d8SChris Lattner using namespace lldb;
5630fdc8d8SChris Lattner using namespace lldb_private;
5730fdc8d8SChris Lattner 
58*baf5664fSJonas Devlieghere SBFrame::SBFrame() : m_opaque_sp(new ExecutionContextRef()) {
59*baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBFrame);
60*baf5664fSJonas Devlieghere }
6130fdc8d8SChris Lattner 
62b9c1b51eSKate Stone SBFrame::SBFrame(const StackFrameSP &lldb_object_sp)
63b9c1b51eSKate Stone     : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) {
64*baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBFrame, (const lldb::StackFrameSP &),
65*baf5664fSJonas Devlieghere                           lldb_object_sp);
66*baf5664fSJonas Devlieghere 
675160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
68ceb6b139SCaroline Tice 
69b9c1b51eSKate Stone   if (log) {
70ceb6b139SCaroline Tice     SBStream sstr;
71ceb6b139SCaroline Tice     GetDescription(sstr);
724838131bSGreg Clayton     log->Printf("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s",
73324a1036SSaleem Abdulrasool                 static_cast<void *>(lldb_object_sp.get()),
74324a1036SSaleem Abdulrasool                 static_cast<void *>(lldb_object_sp.get()), sstr.GetData());
75ceb6b139SCaroline Tice   }
7630fdc8d8SChris Lattner }
7730fdc8d8SChris Lattner 
78bd4bf82aSJonas Devlieghere SBFrame::SBFrame(const SBFrame &rhs) : m_opaque_sp() {
79*baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBFrame, (const lldb::SBFrame &), rhs);
80*baf5664fSJonas Devlieghere 
81bd4bf82aSJonas Devlieghere   m_opaque_sp = clone(rhs.m_opaque_sp);
82bd4bf82aSJonas Devlieghere }
83efabb123SGreg Clayton 
84dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default;
85dbb0abbfSEugene Zelenko 
86b9c1b51eSKate Stone const SBFrame &SBFrame::operator=(const SBFrame &rhs) {
87*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(const lldb::SBFrame &,
88*baf5664fSJonas Devlieghere                      SBFrame, operator=,(const lldb::SBFrame &), rhs);
89*baf5664fSJonas Devlieghere 
90efabb123SGreg Clayton   if (this != &rhs)
91bd4bf82aSJonas Devlieghere     m_opaque_sp = clone(rhs.m_opaque_sp);
92efabb123SGreg Clayton   return *this;
93efabb123SGreg Clayton }
94efabb123SGreg Clayton 
95b9c1b51eSKate Stone StackFrameSP SBFrame::GetFrameSP() const {
96dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetFrameSP() : StackFrameSP());
97b9556accSGreg Clayton }
9830fdc8d8SChris Lattner 
99b9c1b51eSKate Stone void SBFrame::SetFrameSP(const StackFrameSP &lldb_object_sp) {
1007fdf9ef1SGreg Clayton   return m_opaque_sp->SetFrameSP(lldb_object_sp);
101b9556accSGreg Clayton }
10230fdc8d8SChris Lattner 
103b9c1b51eSKate Stone bool SBFrame::IsValid() const {
104*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsValid);
105*baf5664fSJonas Devlieghere 
106bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
107bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1087fa7dc36SJim Ingham 
1097fa7dc36SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
1107fa7dc36SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
111b9c1b51eSKate Stone   if (target && process) {
1127fa7dc36SJim Ingham     Process::StopLocker stop_locker;
1137fa7dc36SJim Ingham     if (stop_locker.TryLock(&process->GetRunLock()))
114dbb0abbfSEugene Zelenko       return GetFrameSP().get() != nullptr;
11530fdc8d8SChris Lattner   }
11630fdc8d8SChris Lattner 
1177fa7dc36SJim Ingham   // Without a target & process we can't have a valid stack frame.
1187fa7dc36SJim Ingham   return false;
1197fa7dc36SJim Ingham }
1207fa7dc36SJim Ingham 
121b9c1b51eSKate Stone SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const {
122*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(lldb::SBSymbolContext, SBFrame, GetSymbolContext,
123*baf5664fSJonas Devlieghere                            (uint32_t), resolve_scope);
124*baf5664fSJonas Devlieghere 
1255160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
12630fdc8d8SChris Lattner   SBSymbolContext sb_sym_ctx;
127bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
128bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
129991e4453SZachary Turner   SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope);
130dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
131d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1327730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
133b9c1b51eSKate Stone   if (target && process) {
1347fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
135b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1367730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
137b9c1b51eSKate Stone       if (frame) {
138991e4453SZachary Turner         sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext(scope));
139b9c1b51eSKate Stone       } else {
140c9858e4dSGreg Clayton         if (log)
141b9c1b51eSKate Stone           log->Printf("SBFrame::GetVariables () => error: could not "
142b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
1437730b9a4SJim Ingham       }
144b9c1b51eSKate Stone     } else {
1457730b9a4SJim Ingham       if (log)
146b9c1b51eSKate Stone         log->Printf(
147b9c1b51eSKate Stone             "SBFrame::GetSymbolContext () => error: process is running");
148c9858e4dSGreg Clayton     }
1497fdf9ef1SGreg Clayton   }
150ceb6b139SCaroline Tice 
151ceb6b139SCaroline Tice   if (log)
152b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => "
153b9c1b51eSKate Stone                 "SBSymbolContext(%p)",
154324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), resolve_scope,
155324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_sym_ctx.get()));
156ceb6b139SCaroline Tice 
157*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_sym_ctx);
15830fdc8d8SChris Lattner }
15930fdc8d8SChris Lattner 
160b9c1b51eSKate Stone SBModule SBFrame::GetModule() const {
161*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBModule, SBFrame, GetModule);
162*baf5664fSJonas Devlieghere 
1635160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
16472eff18aSGreg Clayton   SBModule sb_module;
165acdbe816SGreg Clayton   ModuleSP module_sp;
166bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
167bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1684fc6cb9cSJim Ingham 
169dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
170d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1717730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
172b9c1b51eSKate Stone   if (target && process) {
1737fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
174b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1757730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
176b9c1b51eSKate Stone       if (frame) {
177d9e416c0SGreg Clayton         module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp;
178acdbe816SGreg Clayton         sb_module.SetSP(module_sp);
179b9c1b51eSKate Stone       } else {
180c9858e4dSGreg Clayton         if (log)
181b9c1b51eSKate Stone           log->Printf("SBFrame::GetModule () => error: could not reconstruct "
182b9c1b51eSKate Stone                       "frame object for this SBFrame.");
1837730b9a4SJim Ingham       }
184b9c1b51eSKate Stone     } else {
1857730b9a4SJim Ingham       if (log)
1867730b9a4SJim Ingham         log->Printf("SBFrame::GetModule () => error: process is running");
187c9858e4dSGreg Clayton     }
1887fdf9ef1SGreg Clayton   }
18972eff18aSGreg Clayton 
1904838131bSGreg Clayton   if (log)
1914838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetModule () => SBModule(%p)",
192324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
193324a1036SSaleem Abdulrasool                 static_cast<void *>(module_sp.get()));
1944838131bSGreg Clayton 
195*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_module);
19630fdc8d8SChris Lattner }
19730fdc8d8SChris Lattner 
198b9c1b51eSKate Stone SBCompileUnit SBFrame::GetCompileUnit() const {
199*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBCompileUnit, SBFrame,
200*baf5664fSJonas Devlieghere                                    GetCompileUnit);
201*baf5664fSJonas Devlieghere 
2025160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
20372eff18aSGreg Clayton   SBCompileUnit sb_comp_unit;
204bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
205bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2064fc6cb9cSJim Ingham 
207dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
208d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2097730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
210b9c1b51eSKate Stone   if (target && process) {
2117fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
212b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2137730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
214b9c1b51eSKate Stone       if (frame) {
215b9c1b51eSKate Stone         sb_comp_unit.reset(
216b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit);
217b9c1b51eSKate Stone       } else {
218ceb6b139SCaroline Tice         if (log)
219b9c1b51eSKate Stone           log->Printf("SBFrame::GetCompileUnit () => error: could not "
220b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
2217730b9a4SJim Ingham       }
222b9c1b51eSKate Stone     } else {
2237730b9a4SJim Ingham       if (log)
2247730b9a4SJim Ingham         log->Printf("SBFrame::GetCompileUnit () => error: process is running");
225c9858e4dSGreg Clayton     }
226c9858e4dSGreg Clayton   }
227c9858e4dSGreg Clayton   if (log)
228c9858e4dSGreg Clayton     log->Printf("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)",
229324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
230324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_comp_unit.get()));
231ceb6b139SCaroline Tice 
232*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_comp_unit);
23330fdc8d8SChris Lattner }
23430fdc8d8SChris Lattner 
235b9c1b51eSKate Stone SBFunction SBFrame::GetFunction() const {
236*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFunction, SBFrame, GetFunction);
237*baf5664fSJonas Devlieghere 
2385160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
23972eff18aSGreg Clayton   SBFunction sb_function;
240bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
241bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2424fc6cb9cSJim Ingham 
243dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
244d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2457730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
246b9c1b51eSKate Stone   if (target && process) {
2477fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
248b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2497730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
250b9c1b51eSKate Stone       if (frame) {
251b9c1b51eSKate Stone         sb_function.reset(
252b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextFunction).function);
253b9c1b51eSKate Stone       } else {
254c9858e4dSGreg Clayton         if (log)
255b9c1b51eSKate Stone           log->Printf("SBFrame::GetFunction () => error: could not reconstruct "
256b9c1b51eSKate Stone                       "frame object for this SBFrame.");
2577730b9a4SJim Ingham       }
258b9c1b51eSKate Stone     } else {
2597730b9a4SJim Ingham       if (log)
2607730b9a4SJim Ingham         log->Printf("SBFrame::GetFunction () => error: process is running");
2617fdf9ef1SGreg Clayton     }
262c9858e4dSGreg Clayton   }
2634838131bSGreg Clayton   if (log)
2644838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetFunction () => SBFunction(%p)",
265324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
266324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_function.get()));
2674838131bSGreg Clayton 
268*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_function);
26930fdc8d8SChris Lattner }
27030fdc8d8SChris Lattner 
271b9c1b51eSKate Stone SBSymbol SBFrame::GetSymbol() const {
272*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBSymbol, SBFrame, GetSymbol);
273*baf5664fSJonas Devlieghere 
2745160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
27572eff18aSGreg Clayton   SBSymbol sb_symbol;
276bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
277bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2784fc6cb9cSJim Ingham 
279dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
280d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2817730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
282b9c1b51eSKate Stone   if (target && process) {
2837fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
284b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2857730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
286b9c1b51eSKate Stone       if (frame) {
287d9e416c0SGreg Clayton         sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol);
288b9c1b51eSKate Stone       } else {
289c9858e4dSGreg Clayton         if (log)
290b9c1b51eSKate Stone           log->Printf("SBFrame::GetSymbol () => error: could not reconstruct "
291b9c1b51eSKate Stone                       "frame object for this SBFrame.");
2927730b9a4SJim Ingham       }
293b9c1b51eSKate Stone     } else {
2947730b9a4SJim Ingham       if (log)
2957730b9a4SJim Ingham         log->Printf("SBFrame::GetSymbol () => error: process is running");
2967fdf9ef1SGreg Clayton     }
297c9858e4dSGreg Clayton   }
2984838131bSGreg Clayton   if (log)
2994838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetSymbol () => SBSymbol(%p)",
300324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
301324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_symbol.get()));
302*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_symbol);
3033b06557eSGreg Clayton }
3043b06557eSGreg Clayton 
305b9c1b51eSKate Stone SBBlock SBFrame::GetBlock() const {
306*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBlock, SBFrame, GetBlock);
307*baf5664fSJonas Devlieghere 
3085160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
30972eff18aSGreg Clayton   SBBlock sb_block;
310bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
311bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3124fc6cb9cSJim Ingham 
313dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
314d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3157730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
316b9c1b51eSKate Stone   if (target && process) {
3177fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
318b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3197730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
320b9c1b51eSKate Stone       if (frame) {
321d9e416c0SGreg Clayton         sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block);
322b9c1b51eSKate Stone       } else {
323c9858e4dSGreg Clayton         if (log)
324b9c1b51eSKate Stone           log->Printf("SBFrame::GetBlock () => error: could not reconstruct "
325b9c1b51eSKate Stone                       "frame object for this SBFrame.");
3267730b9a4SJim Ingham       }
327b9c1b51eSKate Stone     } else {
3287730b9a4SJim Ingham       if (log)
329324a1036SSaleem Abdulrasool         log->Printf("SBFrame(%p)::GetBlock () => error: process is running",
330324a1036SSaleem Abdulrasool                     static_cast<void *>(frame));
3317fdf9ef1SGreg Clayton     }
332c9858e4dSGreg Clayton   }
3334838131bSGreg Clayton   if (log)
3344838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetBlock () => SBBlock(%p)",
335324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
336324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_block.GetPtr()));
337*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_block);
33830fdc8d8SChris Lattner }
33930fdc8d8SChris Lattner 
340b9c1b51eSKate Stone SBBlock SBFrame::GetFrameBlock() const {
341*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBlock, SBFrame, GetFrameBlock);
342*baf5664fSJonas Devlieghere 
34372eff18aSGreg Clayton   SBBlock sb_block;
344bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
345bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3464fc6cb9cSJim Ingham 
347dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
348d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3495160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
3507730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
351b9c1b51eSKate Stone   if (target && process) {
3527fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
353b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3547730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
355b9c1b51eSKate Stone       if (frame) {
356d9e416c0SGreg Clayton         sb_block.SetPtr(frame->GetFrameBlock());
357b9c1b51eSKate Stone       } else {
358c9858e4dSGreg Clayton         if (log)
359b9c1b51eSKate Stone           log->Printf("SBFrame::GetFrameBlock () => error: could not "
360b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
3617730b9a4SJim Ingham       }
362b9c1b51eSKate Stone     } else {
3637730b9a4SJim Ingham       if (log)
3647730b9a4SJim Ingham         log->Printf("SBFrame::GetFrameBlock () => error: process is running");
3657fdf9ef1SGreg Clayton     }
366c9858e4dSGreg Clayton   }
3674838131bSGreg Clayton   if (log)
3684838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)",
369324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
370324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_block.GetPtr()));
371*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_block);
37295897c6aSGreg Clayton }
37395897c6aSGreg Clayton 
374b9c1b51eSKate Stone SBLineEntry SBFrame::GetLineEntry() const {
375*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBLineEntry, SBFrame, GetLineEntry);
376*baf5664fSJonas Devlieghere 
3775160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
37872eff18aSGreg Clayton   SBLineEntry sb_line_entry;
379bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
380bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3814fc6cb9cSJim Ingham 
382dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
383d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3847730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
385b9c1b51eSKate Stone   if (target && process) {
3867fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
387b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3887730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
389b9c1b51eSKate Stone       if (frame) {
390b9c1b51eSKate Stone         sb_line_entry.SetLineEntry(
391b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextLineEntry).line_entry);
392b9c1b51eSKate Stone       } else {
393c9858e4dSGreg Clayton         if (log)
394b9c1b51eSKate Stone           log->Printf("SBFrame::GetLineEntry () => error: could not "
395b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
3967730b9a4SJim Ingham       }
397b9c1b51eSKate Stone     } else {
3987730b9a4SJim Ingham       if (log)
3997730b9a4SJim Ingham         log->Printf("SBFrame::GetLineEntry () => error: process is running");
4007fdf9ef1SGreg Clayton     }
401c9858e4dSGreg Clayton   }
4024838131bSGreg Clayton   if (log)
4034838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)",
404324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
405324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_line_entry.get()));
406*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_line_entry);
40730fdc8d8SChris Lattner }
40830fdc8d8SChris Lattner 
409b9c1b51eSKate Stone uint32_t SBFrame::GetFrameID() const {
410*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBFrame, GetFrameID);
411*baf5664fSJonas Devlieghere 
412b9556accSGreg Clayton   uint32_t frame_idx = UINT32_MAX;
413b9556accSGreg Clayton 
414c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
415c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
416c481c7eeSJim Ingham 
417b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
4187fdf9ef1SGreg Clayton   if (frame)
419d9e416c0SGreg Clayton     frame_idx = frame->GetFrameIndex();
4204838131bSGreg Clayton 
4215160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
4224838131bSGreg Clayton   if (log)
423b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::GetFrameID () => %u", static_cast<void *>(frame),
424b9c1b51eSKate Stone                 frame_idx);
4254838131bSGreg Clayton   return frame_idx;
42630fdc8d8SChris Lattner }
42730fdc8d8SChris Lattner 
428b9c1b51eSKate Stone lldb::addr_t SBFrame::GetCFA() const {
429*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetCFA);
430*baf5664fSJonas Devlieghere 
431c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
432c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
433c481c7eeSJim Ingham 
434424a5dbcSGreg Clayton   StackFrame *frame = exe_ctx.GetFramePtr();
435424a5dbcSGreg Clayton   if (frame)
436424a5dbcSGreg Clayton     return frame->GetStackID().GetCallFrameAddress();
437424a5dbcSGreg Clayton   return LLDB_INVALID_ADDRESS;
438424a5dbcSGreg Clayton }
439424a5dbcSGreg Clayton 
440b9c1b51eSKate Stone addr_t SBFrame::GetPC() const {
441*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetPC);
442*baf5664fSJonas Devlieghere 
4435160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
44469b582faSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
445bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
446bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4474fc6cb9cSJim Ingham 
448dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
449d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4507730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
451b9c1b51eSKate Stone   if (target && process) {
4527fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
453b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4547730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
455b9c1b51eSKate Stone       if (frame) {
456b9c1b51eSKate Stone         addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress(
45704803b3eSTatyana Krasnukha             target, AddressClass::eCode);
458b9c1b51eSKate Stone       } else {
459c9858e4dSGreg Clayton         if (log)
460b9c1b51eSKate Stone           log->Printf("SBFrame::GetPC () => error: could not reconstruct frame "
461b9c1b51eSKate Stone                       "object for this SBFrame.");
4627730b9a4SJim Ingham       }
463b9c1b51eSKate Stone     } else {
4647730b9a4SJim Ingham       if (log)
4657730b9a4SJim Ingham         log->Printf("SBFrame::GetPC () => error: process is running");
466c9858e4dSGreg Clayton     }
4677fdf9ef1SGreg Clayton   }
468ceb6b139SCaroline Tice 
469ceb6b139SCaroline Tice   if (log)
470324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetPC () => 0x%" PRIx64,
471324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), addr);
472ceb6b139SCaroline Tice 
473ceb6b139SCaroline Tice   return addr;
47430fdc8d8SChris Lattner }
47530fdc8d8SChris Lattner 
476b9c1b51eSKate Stone bool SBFrame::SetPC(addr_t new_pc) {
477*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBFrame, SetPC, (lldb::addr_t), new_pc);
478*baf5664fSJonas Devlieghere 
4795160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
480ceb6b139SCaroline Tice   bool ret_val = false;
481bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
482bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4834fc6cb9cSJim Ingham 
484dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
485d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4867730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
487b9c1b51eSKate Stone   if (target && process) {
4887fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
489b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4907730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
491b9c1b51eSKate Stone       if (frame) {
492d9e416c0SGreg Clayton         ret_val = frame->GetRegisterContext()->SetPC(new_pc);
493b9c1b51eSKate Stone       } else {
494c9858e4dSGreg Clayton         if (log)
495b9c1b51eSKate Stone           log->Printf("SBFrame::SetPC () => error: could not reconstruct frame "
496b9c1b51eSKate Stone                       "object for this SBFrame.");
4977730b9a4SJim Ingham       }
498b9c1b51eSKate Stone     } else {
4997730b9a4SJim Ingham       if (log)
5007730b9a4SJim Ingham         log->Printf("SBFrame::SetPC () => error: process is running");
501c9858e4dSGreg Clayton     }
5027fdf9ef1SGreg Clayton   }
503ceb6b139SCaroline Tice 
504ceb6b139SCaroline Tice   if (log)
505d01b2953SDaniel Malea     log->Printf("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i",
506324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), new_pc, ret_val);
507ceb6b139SCaroline Tice 
508ceb6b139SCaroline Tice   return ret_val;
50930fdc8d8SChris Lattner }
51030fdc8d8SChris Lattner 
511b9c1b51eSKate Stone addr_t SBFrame::GetSP() const {
512*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetSP);
513*baf5664fSJonas Devlieghere 
5145160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
5154838131bSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
516bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
517bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5184fc6cb9cSJim Ingham 
519dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
520d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5217730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
522b9c1b51eSKate Stone   if (target && process) {
5237fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
524b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5257730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
526b9c1b51eSKate Stone       if (frame) {
527d9e416c0SGreg Clayton         addr = frame->GetRegisterContext()->GetSP();
528b9c1b51eSKate Stone       } else {
529c9858e4dSGreg Clayton         if (log)
530b9c1b51eSKate Stone           log->Printf("SBFrame::GetSP () => error: could not reconstruct frame "
531b9c1b51eSKate Stone                       "object for this SBFrame.");
5327730b9a4SJim Ingham       }
533b9c1b51eSKate Stone     } else {
5347730b9a4SJim Ingham       if (log)
5357730b9a4SJim Ingham         log->Printf("SBFrame::GetSP () => error: process is running");
5367fdf9ef1SGreg Clayton     }
537c9858e4dSGreg Clayton   }
5384838131bSGreg Clayton   if (log)
539324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetSP () => 0x%" PRIx64,
540324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), addr);
5414838131bSGreg Clayton 
5424838131bSGreg Clayton   return addr;
54330fdc8d8SChris Lattner }
54430fdc8d8SChris Lattner 
545b9c1b51eSKate Stone addr_t SBFrame::GetFP() const {
546*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetFP);
547*baf5664fSJonas Devlieghere 
5485160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
54969b582faSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
550bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
551bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5524fc6cb9cSJim Ingham 
553dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
554d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5557730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
556b9c1b51eSKate Stone   if (target && process) {
5577fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
558b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5597730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
560b9c1b51eSKate Stone       if (frame) {
561d9e416c0SGreg Clayton         addr = frame->GetRegisterContext()->GetFP();
562b9c1b51eSKate Stone       } else {
563c9858e4dSGreg Clayton         if (log)
564b9c1b51eSKate Stone           log->Printf("SBFrame::GetFP () => error: could not reconstruct frame "
565b9c1b51eSKate Stone                       "object for this SBFrame.");
5667730b9a4SJim Ingham       }
567b9c1b51eSKate Stone     } else {
5687730b9a4SJim Ingham       if (log)
5697730b9a4SJim Ingham         log->Printf("SBFrame::GetFP () => error: process is running");
570c9858e4dSGreg Clayton     }
5717fdf9ef1SGreg Clayton   }
572ceb6b139SCaroline Tice 
573ceb6b139SCaroline Tice   if (log)
574324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetFP () => 0x%" PRIx64,
575324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), addr);
576ceb6b139SCaroline Tice   return addr;
57730fdc8d8SChris Lattner }
57830fdc8d8SChris Lattner 
579b9c1b51eSKate Stone SBAddress SBFrame::GetPCAddress() const {
580*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBFrame, GetPCAddress);
581*baf5664fSJonas Devlieghere 
5825160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
58330fdc8d8SChris Lattner   SBAddress sb_addr;
584bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
585bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5864fc6cb9cSJim Ingham 
587b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
588d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5897730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
590b9c1b51eSKate Stone   if (target && process) {
5917fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
592b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5937730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
594b9c1b51eSKate Stone       if (frame) {
595d9e416c0SGreg Clayton         sb_addr.SetAddress(&frame->GetFrameCodeAddress());
596b9c1b51eSKate Stone       } else {
597c9858e4dSGreg Clayton         if (log)
598b9c1b51eSKate Stone           log->Printf("SBFrame::GetPCAddress () => error: could not "
599b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
6007730b9a4SJim Ingham       }
601b9c1b51eSKate Stone     } else {
6027730b9a4SJim Ingham       if (log)
6037730b9a4SJim Ingham         log->Printf("SBFrame::GetPCAddress () => error: process is running");
6047fdf9ef1SGreg Clayton     }
605c9858e4dSGreg Clayton   }
6064838131bSGreg Clayton   if (log)
607324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetPCAddress () => SBAddress(%p)",
608b9c1b51eSKate Stone                 static_cast<void *>(frame), static_cast<void *>(sb_addr.get()));
609*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_addr);
61030fdc8d8SChris Lattner }
61130fdc8d8SChris Lattner 
612*baf5664fSJonas Devlieghere void SBFrame::Clear() {
613*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBFrame, Clear);
614*baf5664fSJonas Devlieghere 
615*baf5664fSJonas Devlieghere   m_opaque_sp->Clear();
616*baf5664fSJonas Devlieghere }
61730fdc8d8SChris Lattner 
618b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) {
619*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath,
620*baf5664fSJonas Devlieghere                      (const char *), var_path);
621*baf5664fSJonas Devlieghere 
6227edbdfc9SGreg Clayton   SBValue sb_value;
623c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
624c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
625c481c7eeSJim Ingham 
626b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
627d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
628b9c1b51eSKate Stone   if (frame && target) {
629b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
630b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
6317edbdfc9SGreg Clayton     sb_value = GetValueForVariablePath(var_path, use_dynamic);
6327edbdfc9SGreg Clayton   }
633*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value);
6347edbdfc9SGreg Clayton }
6357edbdfc9SGreg Clayton 
636b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path,
637b9c1b51eSKate Stone                                                DynamicValueType use_dynamic) {
638*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath,
639*baf5664fSJonas Devlieghere                      (const char *, lldb::DynamicValueType), var_path,
640*baf5664fSJonas Devlieghere                      use_dynamic);
641*baf5664fSJonas Devlieghere 
6427edbdfc9SGreg Clayton   SBValue sb_value;
6435160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
644b9c1b51eSKate Stone   if (var_path == nullptr || var_path[0] == '\0') {
6457730b9a4SJim Ingham     if (log)
646b9c1b51eSKate Stone       log->Printf(
647b9c1b51eSKate Stone           "SBFrame::GetValueForVariablePath called with empty variable path.");
648*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_value);
6497730b9a4SJim Ingham   }
6507730b9a4SJim Ingham 
651bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
652bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
6534fc6cb9cSJim Ingham 
654dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
655d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
6567730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
657b9c1b51eSKate Stone   if (target && process) {
6587fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
659b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
6607730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
661b9c1b51eSKate Stone       if (frame) {
6627edbdfc9SGreg Clayton         VariableSP var_sp;
66397206d57SZachary Turner         Status error;
664b9c1b51eSKate Stone         ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath(
665b9c1b51eSKate Stone             var_path, eNoDynamicValues,
666b9c1b51eSKate Stone             StackFrame::eExpressionPathOptionCheckPtrVsMember |
667b9c1b51eSKate Stone                 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
668b9c1b51eSKate Stone             var_sp, error));
669e3e91517SEnrico Granata         sb_value.SetSP(value_sp, use_dynamic);
670b9c1b51eSKate Stone       } else {
671c9858e4dSGreg Clayton         if (log)
672b9c1b51eSKate Stone           log->Printf("SBFrame::GetValueForVariablePath () => error: could not "
673b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
6747730b9a4SJim Ingham       }
675b9c1b51eSKate Stone     } else {
6767730b9a4SJim Ingham       if (log)
677b9c1b51eSKate Stone         log->Printf(
678b9c1b51eSKate Stone             "SBFrame::GetValueForVariablePath () => error: process is running");
679c9858e4dSGreg Clayton     }
6807fdf9ef1SGreg Clayton   }
681*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value);
6827edbdfc9SGreg Clayton }
6837edbdfc9SGreg Clayton 
684b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name) {
685*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *),
686*baf5664fSJonas Devlieghere                      name);
687*baf5664fSJonas Devlieghere 
688316d498bSGreg Clayton   SBValue value;
689c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
690c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
691c481c7eeSJim Ingham 
692b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
693d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
694b9c1b51eSKate Stone   if (frame && target) {
695b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
696b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
697316d498bSGreg Clayton     value = FindVariable(name, use_dynamic);
698316d498bSGreg Clayton   }
699*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value);
70078a685aaSJim Ingham }
70178a685aaSJim Ingham 
702b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name,
703b9c1b51eSKate Stone                               lldb::DynamicValueType use_dynamic) {
704*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable,
705*baf5664fSJonas Devlieghere                      (const char *, lldb::DynamicValueType), name, use_dynamic);
706*baf5664fSJonas Devlieghere 
7075160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
70869b582faSGreg Clayton   VariableSP var_sp;
70958b59f95SJim Ingham   SBValue sb_value;
7107730b9a4SJim Ingham 
711b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
7127730b9a4SJim Ingham     if (log)
7137730b9a4SJim Ingham       log->Printf("SBFrame::FindVariable called with empty name");
714*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_value);
7157730b9a4SJim Ingham   }
7167730b9a4SJim Ingham 
71781e871edSGreg Clayton   ValueObjectSP value_sp;
718bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
719bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
7204fc6cb9cSJim Ingham 
721dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
722d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
7237730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
724b9c1b51eSKate Stone   if (target && process) {
7257fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
726b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
7277730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
728b9c1b51eSKate Stone       if (frame) {
729e23d0b63SShafik Yaghmour         value_sp = frame->FindVariable(ConstString(name));
73030fdc8d8SChris Lattner 
731e23d0b63SShafik Yaghmour         if (value_sp)
732e3e91517SEnrico Granata           sb_value.SetSP(value_sp, use_dynamic);
733b9c1b51eSKate Stone       } else {
734c9858e4dSGreg Clayton         if (log)
735b9c1b51eSKate Stone           log->Printf("SBFrame::FindVariable () => error: could not "
736b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
7377730b9a4SJim Ingham       }
738b9c1b51eSKate Stone     } else {
7397730b9a4SJim Ingham       if (log)
7407730b9a4SJim Ingham         log->Printf("SBFrame::FindVariable () => error: process is running");
741c9858e4dSGreg Clayton     }
742316d498bSGreg Clayton   }
743316d498bSGreg Clayton 
7444838131bSGreg Clayton   if (log)
74569b582faSGreg Clayton     log->Printf("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
746324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), name,
747324a1036SSaleem Abdulrasool                 static_cast<void *>(value_sp.get()));
7484838131bSGreg Clayton 
749*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value);
750dde9cff3SCaroline Tice }
751dde9cff3SCaroline Tice 
752b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) {
753*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue,
754*baf5664fSJonas Devlieghere                      (const char *, lldb::ValueType), name, value_type);
755*baf5664fSJonas Devlieghere 
756316d498bSGreg Clayton   SBValue value;
757c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
758c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
759c481c7eeSJim Ingham 
760b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
761d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
762b9c1b51eSKate Stone   if (frame && target) {
763b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
764b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
765316d498bSGreg Clayton     value = FindValue(name, value_type, use_dynamic);
766316d498bSGreg Clayton   }
767*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value);
76878a685aaSJim Ingham }
76978a685aaSJim Ingham 
770b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type,
771b9c1b51eSKate Stone                            lldb::DynamicValueType use_dynamic) {
772*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue,
773*baf5664fSJonas Devlieghere                      (const char *, lldb::ValueType, lldb::DynamicValueType),
774*baf5664fSJonas Devlieghere                      name, value_type, use_dynamic);
775*baf5664fSJonas Devlieghere 
7765160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
77769b582faSGreg Clayton   SBValue sb_value;
7787730b9a4SJim Ingham 
779b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
7807730b9a4SJim Ingham     if (log)
7817730b9a4SJim Ingham       log->Printf("SBFrame::FindValue called with empty name.");
782*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_value);
7837730b9a4SJim Ingham   }
7847730b9a4SJim Ingham 
78581e871edSGreg Clayton   ValueObjectSP value_sp;
786bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
787bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
7884fc6cb9cSJim Ingham 
789dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
790d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
7917730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
792b9c1b51eSKate Stone   if (target && process) {
7937fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
794b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
7957730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
796b9c1b51eSKate Stone       if (frame) {
7978a2a0dfbSEnrico Granata         VariableList variable_list;
7988a2a0dfbSEnrico Granata 
799b9c1b51eSKate Stone         switch (value_type) {
80069b582faSGreg Clayton         case eValueTypeVariableGlobal:      // global variable
80169b582faSGreg Clayton         case eValueTypeVariableStatic:      // static variable
80269b582faSGreg Clayton         case eValueTypeVariableArgument:    // function argument variables
80369b582faSGreg Clayton         case eValueTypeVariableLocal:       // function local variables
80463a27afaSGreg Clayton         case eValueTypeVariableThreadLocal: // thread local variables
80569b582faSGreg Clayton         {
806d9e416c0SGreg Clayton           SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock));
80772eff18aSGreg Clayton 
80872eff18aSGreg Clayton           const bool can_create = true;
80972eff18aSGreg Clayton           const bool get_parent_variables = true;
81072eff18aSGreg Clayton           const bool stop_if_block_is_inlined_function = true;
81172eff18aSGreg Clayton 
8120efb51a0SChaoren Lin           if (sc.block)
813b9c1b51eSKate Stone             sc.block->AppendVariables(
814b9c1b51eSKate Stone                 can_create, get_parent_variables,
815b9c1b51eSKate Stone                 stop_if_block_is_inlined_function,
816b9c1b51eSKate Stone                 [frame](Variable *v) { return v->IsInScope(frame); },
817b9c1b51eSKate Stone                 &variable_list);
818b9c1b51eSKate Stone           if (value_type == eValueTypeVariableGlobal) {
8198a2a0dfbSEnrico Granata             const bool get_file_globals = true;
8208a2a0dfbSEnrico Granata             VariableList *frame_vars = frame->GetVariableList(get_file_globals);
8218a2a0dfbSEnrico Granata             if (frame_vars)
8228a2a0dfbSEnrico Granata               frame_vars->AppendVariablesIfUnique(variable_list);
8238a2a0dfbSEnrico Granata           }
82469b582faSGreg Clayton           ConstString const_name(name);
825b9c1b51eSKate Stone           VariableSP variable_sp(
826b9c1b51eSKate Stone               variable_list.FindVariable(const_name, value_type));
827b9c1b51eSKate Stone           if (variable_sp) {
828b9c1b51eSKate Stone             value_sp = frame->GetValueObjectForFrameVariable(variable_sp,
829b9c1b51eSKate Stone                                                              eNoDynamicValues);
830e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
83130fdc8d8SChris Lattner           }
832b9c1b51eSKate Stone         } break;
83369b582faSGreg Clayton 
83469b582faSGreg Clayton         case eValueTypeRegister: // stack frame register value
83569b582faSGreg Clayton         {
836d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
837b9c1b51eSKate Stone           if (reg_ctx) {
83869b582faSGreg Clayton             const uint32_t num_regs = reg_ctx->GetRegisterCount();
839b9c1b51eSKate Stone             for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) {
840b9c1b51eSKate Stone               const RegisterInfo *reg_info =
841b9c1b51eSKate Stone                   reg_ctx->GetRegisterInfoAtIndex(reg_idx);
84269b582faSGreg Clayton               if (reg_info &&
84369b582faSGreg Clayton                   ((reg_info->name && strcasecmp(reg_info->name, name) == 0) ||
844b9c1b51eSKate Stone                    (reg_info->alt_name &&
845b9c1b51eSKate Stone                     strcasecmp(reg_info->alt_name, name) == 0))) {
846d9e416c0SGreg Clayton                 value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx);
84781e871edSGreg Clayton                 sb_value.SetSP(value_sp);
84881e871edSGreg Clayton                 break;
84969b582faSGreg Clayton               }
85069b582faSGreg Clayton             }
85169b582faSGreg Clayton           }
852b9c1b51eSKate Stone         } break;
85369b582faSGreg Clayton 
854b9c1b51eSKate Stone         case eValueTypeRegisterSet: // A collection of stack frame register
855b9c1b51eSKate Stone                                     // values
85669b582faSGreg Clayton         {
857d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
858b9c1b51eSKate Stone           if (reg_ctx) {
85969b582faSGreg Clayton             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
860b9c1b51eSKate Stone             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
86169b582faSGreg Clayton               const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx);
86269b582faSGreg Clayton               if (reg_set &&
86369b582faSGreg Clayton                   ((reg_set->name && strcasecmp(reg_set->name, name) == 0) ||
864b9c1b51eSKate Stone                    (reg_set->short_name &&
865b9c1b51eSKate Stone                     strcasecmp(reg_set->short_name, name) == 0))) {
866b9c1b51eSKate Stone                 value_sp =
867b9c1b51eSKate Stone                     ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx);
86881e871edSGreg Clayton                 sb_value.SetSP(value_sp);
86981e871edSGreg Clayton                 break;
87069b582faSGreg Clayton               }
87169b582faSGreg Clayton             }
87269b582faSGreg Clayton           }
873b9c1b51eSKate Stone         } break;
87469b582faSGreg Clayton 
87569b582faSGreg Clayton         case eValueTypeConstResult: // constant result variables
87669b582faSGreg Clayton         {
87769b582faSGreg Clayton           ConstString const_name(name);
878b9c1b51eSKate Stone           ExpressionVariableSP expr_var_sp(
879b9c1b51eSKate Stone               target->GetPersistentVariable(const_name));
880b9c1b51eSKate Stone           if (expr_var_sp) {
88181e871edSGreg Clayton             value_sp = expr_var_sp->GetValueObject();
882e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
88381e871edSGreg Clayton           }
884b9c1b51eSKate Stone         } break;
88569b582faSGreg Clayton 
88669b582faSGreg Clayton         default:
88769b582faSGreg Clayton           break;
88869b582faSGreg Clayton         }
889b9c1b51eSKate Stone       } else {
890c9858e4dSGreg Clayton         if (log)
891b9c1b51eSKate Stone           log->Printf("SBFrame::FindValue () => error: could not reconstruct "
892b9c1b51eSKate Stone                       "frame object for this SBFrame.");
8937730b9a4SJim Ingham       }
894b9c1b51eSKate Stone     } else {
8957730b9a4SJim Ingham       if (log)
8967730b9a4SJim Ingham         log->Printf("SBFrame::FindValue () => error: process is running");
897c9858e4dSGreg Clayton     }
8987fdf9ef1SGreg Clayton   }
899dde9cff3SCaroline Tice 
9004838131bSGreg Clayton   if (log)
901b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) "
902b9c1b51eSKate Stone                 "=> SBValue(%p)",
903324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), name, value_type,
904324a1036SSaleem Abdulrasool                 static_cast<void *>(value_sp.get()));
9054838131bSGreg Clayton 
906*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value);
907dde9cff3SCaroline Tice }
908dde9cff3SCaroline Tice 
909b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const {
910*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &),
911*baf5664fSJonas Devlieghere                            that);
912*baf5664fSJonas Devlieghere 
913b57e4a1bSJason Molenda   lldb::StackFrameSP this_sp = GetFrameSP();
914b57e4a1bSJason Molenda   lldb::StackFrameSP that_sp = that.GetFrameSP();
91535e2ab60SJohnny Chen   return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
91635e2ab60SJohnny Chen }
91735e2ab60SJohnny Chen 
918*baf5664fSJonas Devlieghere bool SBFrame::operator==(const SBFrame &rhs) const {
919*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator==,(const lldb::SBFrame &),
920*baf5664fSJonas Devlieghere                            rhs);
92130fdc8d8SChris Lattner 
922*baf5664fSJonas Devlieghere   return IsEqual(rhs);
923*baf5664fSJonas Devlieghere }
924*baf5664fSJonas Devlieghere 
925*baf5664fSJonas Devlieghere bool SBFrame::operator!=(const SBFrame &rhs) const {
926*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator!=,(const lldb::SBFrame &),
927*baf5664fSJonas Devlieghere                            rhs);
928*baf5664fSJonas Devlieghere 
929*baf5664fSJonas Devlieghere   return !IsEqual(rhs);
930*baf5664fSJonas Devlieghere }
93130fdc8d8SChris Lattner 
932b9c1b51eSKate Stone SBThread SBFrame::GetThread() const {
933*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBThread, SBFrame, GetThread);
934*baf5664fSJonas Devlieghere 
9355160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
936ceb6b139SCaroline Tice 
937c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
938c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
939c481c7eeSJim Ingham 
940d9e416c0SGreg Clayton   ThreadSP thread_sp(exe_ctx.GetThreadSP());
941d9e416c0SGreg Clayton   SBThread sb_thread(thread_sp);
942ceb6b139SCaroline Tice 
943b9c1b51eSKate Stone   if (log) {
944750cd175SCaroline Tice     SBStream sstr;
945750cd175SCaroline Tice     sb_thread.GetDescription(sstr);
946d9e416c0SGreg Clayton     log->Printf("SBFrame(%p)::GetThread () => SBThread(%p): %s",
947324a1036SSaleem Abdulrasool                 static_cast<void *>(exe_ctx.GetFramePtr()),
948324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()), sstr.GetData());
949750cd175SCaroline Tice   }
950ceb6b139SCaroline Tice 
951*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_thread);
95230fdc8d8SChris Lattner }
95330fdc8d8SChris Lattner 
954b9c1b51eSKate Stone const char *SBFrame::Disassemble() const {
955*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, Disassemble);
956*baf5664fSJonas Devlieghere 
9575160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
958dbb0abbfSEugene Zelenko   const char *disassembly = nullptr;
959bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
960bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
9614fc6cb9cSJim Ingham 
962dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
963d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
9647730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
965b9c1b51eSKate Stone   if (target && process) {
9667fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
967b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
9687730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
969b9c1b51eSKate Stone       if (frame) {
970d9e416c0SGreg Clayton         disassembly = frame->Disassemble();
971b9c1b51eSKate Stone       } else {
972c9858e4dSGreg Clayton         if (log)
973b9c1b51eSKate Stone           log->Printf("SBFrame::Disassemble () => error: could not reconstruct "
974b9c1b51eSKate Stone                       "frame object for this SBFrame.");
9757730b9a4SJim Ingham       }
976b9c1b51eSKate Stone     } else {
9777730b9a4SJim Ingham       if (log)
9787730b9a4SJim Ingham         log->Printf("SBFrame::Disassemble () => error: process is running");
9797fdf9ef1SGreg Clayton     }
980c9858e4dSGreg Clayton   }
9814838131bSGreg Clayton 
9824838131bSGreg Clayton   if (log)
983b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::Disassemble () => %s", static_cast<void *>(frame),
984b9c1b51eSKate Stone                 disassembly);
9854838131bSGreg Clayton 
9864838131bSGreg Clayton   return disassembly;
98730fdc8d8SChris Lattner }
98830fdc8d8SChris Lattner 
989b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics,
990b9c1b51eSKate Stone                                   bool in_scope_only) {
991*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables,
992*baf5664fSJonas Devlieghere                      (bool, bool, bool, bool), arguments, locals, statics,
993*baf5664fSJonas Devlieghere                      in_scope_only);
994*baf5664fSJonas Devlieghere 
995316d498bSGreg Clayton   SBValueList value_list;
996c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
997c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
998c481c7eeSJim Ingham 
999b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
1000d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1001b9c1b51eSKate Stone   if (frame && target) {
1002b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
1003b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
1004b9c1b51eSKate Stone     const bool include_runtime_support_values =
1005b9c1b51eSKate Stone         target ? target->GetDisplayRuntimeSupportValues() : false;
100651f96eebSZachary Turner 
100751f96eebSZachary Turner     SBVariablesOptions options;
100851f96eebSZachary Turner     options.SetIncludeArguments(arguments);
100951f96eebSZachary Turner     options.SetIncludeLocals(locals);
101051f96eebSZachary Turner     options.SetIncludeStatics(statics);
101151f96eebSZachary Turner     options.SetInScopeOnly(in_scope_only);
101251f96eebSZachary Turner     options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
101351f96eebSZachary Turner     options.SetUseDynamic(use_dynamic);
101451f96eebSZachary Turner 
101551f96eebSZachary Turner     value_list = GetVariables(options);
1016316d498bSGreg Clayton   }
1017*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value_list);
101878a685aaSJim Ingham }
101978a685aaSJim Ingham 
1020b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals,
1021b9c1b51eSKate Stone                                         bool statics, bool in_scope_only,
1022b9c1b51eSKate Stone                                         lldb::DynamicValueType use_dynamic) {
1023*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables,
1024*baf5664fSJonas Devlieghere                      (bool, bool, bool, bool, lldb::DynamicValueType),
1025*baf5664fSJonas Devlieghere                      arguments, locals, statics, in_scope_only, use_dynamic);
1026*baf5664fSJonas Devlieghere 
1027c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1028c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1029c481c7eeSJim Ingham 
1030560558ebSEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
1031b9c1b51eSKate Stone   const bool include_runtime_support_values =
1032b9c1b51eSKate Stone       target ? target->GetDisplayRuntimeSupportValues() : false;
103351f96eebSZachary Turner   SBVariablesOptions options;
103451f96eebSZachary Turner   options.SetIncludeArguments(arguments);
103551f96eebSZachary Turner   options.SetIncludeLocals(locals);
103651f96eebSZachary Turner   options.SetIncludeStatics(statics);
103751f96eebSZachary Turner   options.SetInScopeOnly(in_scope_only);
103851f96eebSZachary Turner   options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
103951f96eebSZachary Turner   options.SetUseDynamic(use_dynamic);
1040*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(GetVariables(options));
1041560558ebSEnrico Granata }
1042560558ebSEnrico Granata 
1043b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) {
1044*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables,
1045*baf5664fSJonas Devlieghere                      (const lldb::SBVariablesOptions &), options);
1046*baf5664fSJonas Devlieghere 
10475160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1048ceb6b139SCaroline Tice 
1049b9556accSGreg Clayton   SBValueList value_list;
1050bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1051bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
10524fc6cb9cSJim Ingham 
1053dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1054d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1055b9556accSGreg Clayton 
105651f96eebSZachary Turner   const bool statics = options.GetIncludeStatics();
105751f96eebSZachary Turner   const bool arguments = options.GetIncludeArguments();
10584c7f5d5cSKuba Mracek   const bool recognized_arguments =
10594c7f5d5cSKuba Mracek         options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP()));
106051f96eebSZachary Turner   const bool locals = options.GetIncludeLocals();
106151f96eebSZachary Turner   const bool in_scope_only = options.GetInScopeOnly();
1062b9c1b51eSKate Stone   const bool include_runtime_support_values =
1063b9c1b51eSKate Stone       options.GetIncludeRuntimeSupportValues();
106451f96eebSZachary Turner   const lldb::DynamicValueType use_dynamic = options.GetUseDynamic();
106551f96eebSZachary Turner 
1066ceb6b139SCaroline Tice   if (log)
106741ae8e74SKuba Mracek     log->Printf(
106841ae8e74SKuba Mracek         "SBFrame::GetVariables (arguments=%i, recognized_arguments=%i, "
106941ae8e74SKuba Mracek         "locals=%i, statics=%i, in_scope_only=%i runtime=%i dynamic=%i)",
107041ae8e74SKuba Mracek         arguments, recognized_arguments, locals, statics, in_scope_only,
107151f96eebSZachary Turner         include_runtime_support_values, use_dynamic);
1072ceb6b139SCaroline Tice 
1073349213f9SGreg Clayton   std::set<VariableSP> variable_set;
10747730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1075b9c1b51eSKate Stone   if (target && process) {
10767fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1077b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
10787730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1079b9c1b51eSKate Stone       if (frame) {
108030fdc8d8SChris Lattner         size_t i;
1081dbb0abbfSEugene Zelenko         VariableList *variable_list = nullptr;
1082d9e416c0SGreg Clayton         variable_list = frame->GetVariableList(true);
1083b9c1b51eSKate Stone         if (variable_list) {
108430fdc8d8SChris Lattner           const size_t num_variables = variable_list->GetSize();
1085b9c1b51eSKate Stone           if (num_variables) {
1086b9c1b51eSKate Stone             for (i = 0; i < num_variables; ++i) {
108730fdc8d8SChris Lattner               VariableSP variable_sp(variable_list->GetVariableAtIndex(i));
1088b9c1b51eSKate Stone               if (variable_sp) {
108930fdc8d8SChris Lattner                 bool add_variable = false;
1090b9c1b51eSKate Stone                 switch (variable_sp->GetScope()) {
109130fdc8d8SChris Lattner                 case eValueTypeVariableGlobal:
109230fdc8d8SChris Lattner                 case eValueTypeVariableStatic:
109363a27afaSGreg Clayton                 case eValueTypeVariableThreadLocal:
109430fdc8d8SChris Lattner                   add_variable = statics;
109530fdc8d8SChris Lattner                   break;
109630fdc8d8SChris Lattner 
109730fdc8d8SChris Lattner                 case eValueTypeVariableArgument:
109830fdc8d8SChris Lattner                   add_variable = arguments;
109930fdc8d8SChris Lattner                   break;
110030fdc8d8SChris Lattner 
110130fdc8d8SChris Lattner                 case eValueTypeVariableLocal:
110230fdc8d8SChris Lattner                   add_variable = locals;
110330fdc8d8SChris Lattner                   break;
1104c982c768SGreg Clayton 
1105c982c768SGreg Clayton                 default:
1106c982c768SGreg Clayton                   break;
110730fdc8d8SChris Lattner                 }
1108b9c1b51eSKate Stone                 if (add_variable) {
1109349213f9SGreg Clayton                   // Only add variables once so we don't end up with duplicates
1110349213f9SGreg Clayton                   if (variable_set.find(variable_sp) == variable_set.end())
1111349213f9SGreg Clayton                     variable_set.insert(variable_sp);
1112349213f9SGreg Clayton                   else
1113349213f9SGreg Clayton                     continue;
1114349213f9SGreg Clayton 
1115d9e416c0SGreg Clayton                   if (in_scope_only && !variable_sp->IsInScope(frame))
111630fdc8d8SChris Lattner                     continue;
111730fdc8d8SChris Lattner 
1118b9c1b51eSKate Stone                   ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable(
1119b9c1b51eSKate Stone                       variable_sp, eNoDynamicValues));
1120560558ebSEnrico Granata 
1121b9c1b51eSKate Stone                   if (!include_runtime_support_values && valobj_sp != nullptr &&
1122dbb0abbfSEugene Zelenko                       valobj_sp->IsRuntimeSupportValue())
1123560558ebSEnrico Granata                     continue;
1124560558ebSEnrico Granata 
1125e3e91517SEnrico Granata                   SBValue value_sb;
1126e3e91517SEnrico Granata                   value_sb.SetSP(valobj_sp, use_dynamic);
1127e3e91517SEnrico Granata                   value_list.Append(value_sb);
112830fdc8d8SChris Lattner                 }
112930fdc8d8SChris Lattner               }
113030fdc8d8SChris Lattner             }
113130fdc8d8SChris Lattner           }
113230fdc8d8SChris Lattner         }
113341ae8e74SKuba Mracek         if (recognized_arguments) {
113441ae8e74SKuba Mracek           auto recognized_frame = frame->GetRecognizedFrame();
113541ae8e74SKuba Mracek           if (recognized_frame) {
113641ae8e74SKuba Mracek             ValueObjectListSP recognized_arg_list =
113741ae8e74SKuba Mracek                 recognized_frame->GetRecognizedArguments();
113841ae8e74SKuba Mracek             if (recognized_arg_list) {
113941ae8e74SKuba Mracek               for (auto &rec_value_sp : recognized_arg_list->GetObjects()) {
114041ae8e74SKuba Mracek                 SBValue value_sb;
114141ae8e74SKuba Mracek                 value_sb.SetSP(rec_value_sp, use_dynamic);
114241ae8e74SKuba Mracek                 value_list.Append(value_sb);
114341ae8e74SKuba Mracek               }
114441ae8e74SKuba Mracek             }
114541ae8e74SKuba Mracek           }
114641ae8e74SKuba Mracek         }
1147b9c1b51eSKate Stone       } else {
1148c9858e4dSGreg Clayton         if (log)
1149b9c1b51eSKate Stone           log->Printf("SBFrame::GetVariables () => error: could not "
1150b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
11517730b9a4SJim Ingham       }
1152b9c1b51eSKate Stone     } else {
11537730b9a4SJim Ingham       if (log)
11547730b9a4SJim Ingham         log->Printf("SBFrame::GetVariables () => error: process is running");
1155c9858e4dSGreg Clayton     }
11567fdf9ef1SGreg Clayton   }
1157ceb6b139SCaroline Tice 
1158ceb6b139SCaroline Tice   if (log)
1159324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetVariables (...) => SBValueList(%p)",
1160324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
1161324a1036SSaleem Abdulrasool                 static_cast<void *>(value_list.opaque_ptr()));
1162ceb6b139SCaroline Tice 
1163*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value_list);
116430fdc8d8SChris Lattner }
116530fdc8d8SChris Lattner 
1166b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() {
1167*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBValueList, SBFrame, GetRegisters);
1168*baf5664fSJonas Devlieghere 
11695160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1170ceb6b139SCaroline Tice 
117130fdc8d8SChris Lattner   SBValueList value_list;
1172bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1173bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
11744fc6cb9cSJim Ingham 
1175dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1176d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
11777730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1178b9c1b51eSKate Stone   if (target && process) {
11797fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1180b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
11817730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1182b9c1b51eSKate Stone       if (frame) {
1183d9e416c0SGreg Clayton         RegisterContextSP reg_ctx(frame->GetRegisterContext());
1184b9c1b51eSKate Stone         if (reg_ctx) {
118530fdc8d8SChris Lattner           const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
1186b9c1b51eSKate Stone           for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
1187b9c1b51eSKate Stone             value_list.Append(
1188b9c1b51eSKate Stone                 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx));
118930fdc8d8SChris Lattner           }
119030fdc8d8SChris Lattner         }
1191b9c1b51eSKate Stone       } else {
1192c9858e4dSGreg Clayton         if (log)
1193b9c1b51eSKate Stone           log->Printf("SBFrame::GetRegisters () => error: could not "
1194b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
11957730b9a4SJim Ingham       }
1196b9c1b51eSKate Stone     } else {
11977730b9a4SJim Ingham       if (log)
11987730b9a4SJim Ingham         log->Printf("SBFrame::GetRegisters () => error: process is running");
1199c9858e4dSGreg Clayton     }
12007fdf9ef1SGreg Clayton   }
1201ceb6b139SCaroline Tice 
1202ceb6b139SCaroline Tice   if (log)
1203324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetRegisters () => SBValueList(%p)",
1204324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
1205324a1036SSaleem Abdulrasool                 static_cast<void *>(value_list.opaque_ptr()));
1206ceb6b139SCaroline Tice 
1207*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value_list);
120830fdc8d8SChris Lattner }
120930fdc8d8SChris Lattner 
1210b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) {
1211*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *),
1212*baf5664fSJonas Devlieghere                      name);
1213*baf5664fSJonas Devlieghere 
1214ad9a53c5SJason Molenda   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1215ad9a53c5SJason Molenda 
1216ad9a53c5SJason Molenda   SBValue result;
1217ad9a53c5SJason Molenda   ValueObjectSP value_sp;
1218bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1219bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1220ad9a53c5SJason Molenda 
1221dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1222ad9a53c5SJason Molenda   Target *target = exe_ctx.GetTargetPtr();
1223ad9a53c5SJason Molenda   Process *process = exe_ctx.GetProcessPtr();
1224b9c1b51eSKate Stone   if (target && process) {
1225ad9a53c5SJason Molenda     Process::StopLocker stop_locker;
1226b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1227ad9a53c5SJason Molenda       frame = exe_ctx.GetFramePtr();
1228b9c1b51eSKate Stone       if (frame) {
1229ad9a53c5SJason Molenda         RegisterContextSP reg_ctx(frame->GetRegisterContext());
1230b9c1b51eSKate Stone         if (reg_ctx) {
1231ad9a53c5SJason Molenda           const uint32_t num_regs = reg_ctx->GetRegisterCount();
1232b9c1b51eSKate Stone           for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) {
1233b9c1b51eSKate Stone             const RegisterInfo *reg_info =
1234b9c1b51eSKate Stone                 reg_ctx->GetRegisterInfoAtIndex(reg_idx);
1235ad9a53c5SJason Molenda             if (reg_info &&
1236ad9a53c5SJason Molenda                 ((reg_info->name && strcasecmp(reg_info->name, name) == 0) ||
1237b9c1b51eSKate Stone                  (reg_info->alt_name &&
1238b9c1b51eSKate Stone                   strcasecmp(reg_info->alt_name, name) == 0))) {
1239ad9a53c5SJason Molenda               value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx);
1240ad9a53c5SJason Molenda               result.SetSP(value_sp);
1241ad9a53c5SJason Molenda               break;
1242ad9a53c5SJason Molenda             }
1243ad9a53c5SJason Molenda           }
1244ad9a53c5SJason Molenda         }
1245b9c1b51eSKate Stone       } else {
1246ad9a53c5SJason Molenda         if (log)
1247b9c1b51eSKate Stone           log->Printf("SBFrame::FindRegister () => error: could not "
1248b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
1249ad9a53c5SJason Molenda       }
1250b9c1b51eSKate Stone     } else {
1251ad9a53c5SJason Molenda       if (log)
12525d353842SJason Molenda         log->Printf("SBFrame::FindRegister () => error: process is running");
1253ad9a53c5SJason Molenda     }
1254ad9a53c5SJason Molenda   }
1255ad9a53c5SJason Molenda 
1256ad9a53c5SJason Molenda   if (log)
1257324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::FindRegister () => SBValue(%p)",
1258324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
1259324a1036SSaleem Abdulrasool                 static_cast<void *>(value_sp.get()));
1260ad9a53c5SJason Molenda 
1261*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(result);
1262ad9a53c5SJason Molenda }
1263ad9a53c5SJason Molenda 
1264b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) {
1265*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &),
1266*baf5664fSJonas Devlieghere                      description);
1267*baf5664fSJonas Devlieghere 
12685160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1269da7bc7d0SGreg Clayton   Stream &strm = description.ref();
1270da7bc7d0SGreg Clayton 
1271bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1272bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
12734fc6cb9cSJim Ingham 
1274b57e4a1bSJason Molenda   StackFrame *frame;
1275d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
12767730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1277b9c1b51eSKate Stone   if (target && process) {
12787fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1279b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
12807730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1281b9c1b51eSKate Stone       if (frame) {
1282d9e416c0SGreg Clayton         frame->DumpUsingSettingsFormat(&strm);
1283b9c1b51eSKate Stone       } else {
1284c9858e4dSGreg Clayton         if (log)
1285b9c1b51eSKate Stone           log->Printf("SBFrame::GetDescription () => error: could not "
1286b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
12877730b9a4SJim Ingham       }
1288b9c1b51eSKate Stone     } else {
12897730b9a4SJim Ingham       if (log)
12907730b9a4SJim Ingham         log->Printf("SBFrame::GetDescription () => error: process is running");
1291c9858e4dSGreg Clayton     }
1292c9858e4dSGreg Clayton 
1293b9c1b51eSKate Stone   } else
1294da7bc7d0SGreg Clayton     strm.PutCString("No value");
1295dde9cff3SCaroline Tice 
1296dde9cff3SCaroline Tice   return true;
1297dde9cff3SCaroline Tice }
12981d3afba3SGreg Clayton 
1299b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) {
1300*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, (const char *),
1301*baf5664fSJonas Devlieghere                      expr);
1302*baf5664fSJonas Devlieghere 
1303316d498bSGreg Clayton   SBValue result;
1304c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1305c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1306c481c7eeSJim Ingham 
1307b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
1308d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1309b9c1b51eSKate Stone   if (frame && target) {
131035e1bda6SJim Ingham     SBExpressionOptions options;
1311b9c1b51eSKate Stone     lldb::DynamicValueType fetch_dynamic_value =
1312b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
1313cced1566SGreg Clayton     options.SetFetchDynamicValue(fetch_dynamic_value);
131435e1bda6SJim Ingham     options.SetUnwindOnError(true);
131524785bd0SEugene Leviant     options.SetIgnoreBreakpoints(true);
1316998c8a1cSRyan Brown     if (target->GetLanguage() != eLanguageTypeUnknown)
1317998c8a1cSRyan Brown       options.SetLanguage(target->GetLanguage());
1318998c8a1cSRyan Brown     else
1319998c8a1cSRyan Brown       options.SetLanguage(frame->GetLanguage());
1320*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(EvaluateExpression(expr, options));
1321316d498bSGreg Clayton   }
1322*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(result);
132378a685aaSJim Ingham }
132478a685aaSJim Ingham 
132578a685aaSJim Ingham SBValue
1326b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr,
1327b9c1b51eSKate Stone                             lldb::DynamicValueType fetch_dynamic_value) {
1328*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1329*baf5664fSJonas Devlieghere                      (const char *, lldb::DynamicValueType), expr,
1330*baf5664fSJonas Devlieghere                      fetch_dynamic_value);
1331*baf5664fSJonas Devlieghere 
133235e1bda6SJim Ingham   SBExpressionOptions options;
1333cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
133435e1bda6SJim Ingham   options.SetUnwindOnError(true);
133524785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1336c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1337c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1338c481c7eeSJim Ingham 
1339998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1340998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1341998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1342998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1343998c8a1cSRyan Brown   else if (frame)
1344998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
1345*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(EvaluateExpression(expr, options));
13467ba6e991SJim Ingham }
13477ba6e991SJim Ingham 
1348b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr,
1349b9c1b51eSKate Stone                                     lldb::DynamicValueType fetch_dynamic_value,
1350b9c1b51eSKate Stone                                     bool unwind_on_error) {
1351*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1352*baf5664fSJonas Devlieghere                      (const char *, lldb::DynamicValueType, bool), expr,
1353*baf5664fSJonas Devlieghere                      fetch_dynamic_value, unwind_on_error);
1354*baf5664fSJonas Devlieghere 
135535e1bda6SJim Ingham   SBExpressionOptions options;
1356c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1357c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1358c481c7eeSJim Ingham 
1359cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
136035e1bda6SJim Ingham   options.SetUnwindOnError(unwind_on_error);
136124785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1362998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1363998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1364998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1365998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1366998c8a1cSRyan Brown   else if (frame)
1367998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
1368*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(EvaluateExpression(expr, options));
136935e1bda6SJim Ingham }
137035e1bda6SJim Ingham 
1371b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr,
1372b9c1b51eSKate Stone                                           const SBExpressionOptions &options) {
1373*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1374*baf5664fSJonas Devlieghere                      (const char *, const lldb::SBExpressionOptions &), expr,
1375*baf5664fSJonas Devlieghere                      options);
1376*baf5664fSJonas Devlieghere 
13775160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
13784838131bSGreg Clayton 
1379358efd65SSaleem Abdulrasool #ifndef LLDB_DISABLE_PYTHON
13805160ce5cSGreg Clayton   Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1381358efd65SSaleem Abdulrasool #endif
1382a162ebafSSean Callanan 
13838646d3c1SJim Ingham   ExpressionResults exe_results = eExpressionSetupError;
138469b582faSGreg Clayton   SBValue expr_result;
13857730b9a4SJim Ingham 
1386b9c1b51eSKate Stone   if (expr == nullptr || expr[0] == '\0') {
13877730b9a4SJim Ingham     if (log)
1388b9c1b51eSKate Stone       log->Printf(
1389b9c1b51eSKate Stone           "SBFrame::EvaluateExpression called with an empty expression");
1390*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(expr_result);
13917730b9a4SJim Ingham   }
13927730b9a4SJim Ingham 
139381e871edSGreg Clayton   ValueObjectSP expr_value_sp;
13944838131bSGreg Clayton 
1395bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1396bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
13974fc6cb9cSJim Ingham 
1398b9556accSGreg Clayton   if (log)
13997730b9a4SJim Ingham     log->Printf("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr);
1400b9556accSGreg Clayton 
1401dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
14027730b9a4SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
14037730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
14047730b9a4SJim Ingham 
1405b9c1b51eSKate Stone   if (target && process) {
14067fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1407b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
14087730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1409b9c1b51eSKate Stone       if (frame) {
14108f7db52dSJim Ingham         std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace;
1411b9c1b51eSKate Stone         if (target->GetDisplayExpressionsInCrashlogs()) {
14121ba7c4d0SGreg Clayton           StreamString frame_description;
1413d9e416c0SGreg Clayton           frame->DumpUsingSettingsFormat(&frame_description);
14148f7db52dSJim Ingham           stack_trace = llvm::make_unique<llvm::PrettyStackTraceFormat>(
1415b9c1b51eSKate Stone               "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value "
1416b9c1b51eSKate Stone               "= %u) %s",
1417b9c1b51eSKate Stone               expr, options.GetFetchDynamicValue(),
1418c156427dSZachary Turner               frame_description.GetData());
1419fb6621efSGreg Clayton         }
1420fb6621efSGreg Clayton 
1421b9c1b51eSKate Stone         exe_results = target->EvaluateExpression(expr, frame, expr_value_sp,
142235e1bda6SJim Ingham                                                  options.ref());
1423e3e91517SEnrico Granata         expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
1424b9c1b51eSKate Stone       } else {
1425c9858e4dSGreg Clayton         if (log)
1426b9c1b51eSKate Stone           log->Printf("SBFrame::EvaluateExpression () => error: could not "
1427b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
14287730b9a4SJim Ingham       }
1429b9c1b51eSKate Stone     } else {
14307730b9a4SJim Ingham       if (log)
1431b9c1b51eSKate Stone         log->Printf(
1432b9c1b51eSKate Stone             "SBFrame::EvaluateExpression () => error: process is running");
1433c9858e4dSGreg Clayton     }
14347fdf9ef1SGreg Clayton   }
14354838131bSGreg Clayton 
1436cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1437a162ebafSSean Callanan   if (expr_log)
1438b9c1b51eSKate Stone     expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is "
1439b9c1b51eSKate Stone                      "%s, summary %s **",
1440324a1036SSaleem Abdulrasool                      expr_result.GetValue(), expr_result.GetSummary());
1441a162ebafSSean Callanan 
14424838131bSGreg Clayton   if (log)
1443b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) "
1444b9c1b51eSKate Stone                 "(execution result=%d)",
1445324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), expr,
1446324a1036SSaleem Abdulrasool                 static_cast<void *>(expr_value_sp.get()), exe_results);
1447cf7e2dc0SJason Molenda #endif
14484838131bSGreg Clayton 
1449*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(expr_result);
14501d3afba3SGreg Clayton }
1451316d498bSGreg Clayton 
1452b9c1b51eSKate Stone bool SBFrame::IsInlined() {
1453*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsInlined);
1454*baf5664fSJonas Devlieghere 
145505f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->IsInlined();
145605f75e9fSOleksiy Vyalov }
145705f75e9fSOleksiy Vyalov 
1458b9c1b51eSKate Stone bool SBFrame::IsInlined() const {
1459*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsInlined);
1460*baf5664fSJonas Devlieghere 
14615160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1462c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1463c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1464c481c7eeSJim Ingham 
1465dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1466d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
14677730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1468b9c1b51eSKate Stone   if (target && process) {
14697fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1470b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
14717730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1472b9c1b51eSKate Stone       if (frame) {
14737fdf9ef1SGreg Clayton 
1474d9e416c0SGreg Clayton         Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1475316d498bSGreg Clayton         if (block)
1476dbb0abbfSEugene Zelenko           return block->GetContainingInlinedBlock() != nullptr;
1477b9c1b51eSKate Stone       } else {
1478c9858e4dSGreg Clayton         if (log)
1479b9c1b51eSKate Stone           log->Printf("SBFrame::IsInlined () => error: could not reconstruct "
1480b9c1b51eSKate Stone                       "frame object for this SBFrame.");
14817730b9a4SJim Ingham       }
1482b9c1b51eSKate Stone     } else {
14837730b9a4SJim Ingham       if (log)
14847730b9a4SJim Ingham         log->Printf("SBFrame::IsInlined () => error: process is running");
1485c9858e4dSGreg Clayton     }
14867fdf9ef1SGreg Clayton   }
1487316d498bSGreg Clayton   return false;
1488316d498bSGreg Clayton }
1489316d498bSGreg Clayton 
14904b36f791SVedant Kumar bool SBFrame::IsArtificial() {
1491*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsArtificial);
1492*baf5664fSJonas Devlieghere 
14934b36f791SVedant Kumar   return static_cast<const SBFrame *>(this)->IsArtificial();
14944b36f791SVedant Kumar }
14954b36f791SVedant Kumar 
14964b36f791SVedant Kumar bool SBFrame::IsArtificial() const {
1497*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsArtificial);
1498*baf5664fSJonas Devlieghere 
14994b36f791SVedant Kumar   std::unique_lock<std::recursive_mutex> lock;
15004b36f791SVedant Kumar   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
15014b36f791SVedant Kumar 
15024b36f791SVedant Kumar   StackFrame *frame = exe_ctx.GetFramePtr();
15034b36f791SVedant Kumar   if (frame)
15044b36f791SVedant Kumar     return frame->IsArtificial();
15054b36f791SVedant Kumar 
15064b36f791SVedant Kumar   return false;
15074b36f791SVedant Kumar }
15084b36f791SVedant Kumar 
1509b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() {
1510*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetFunctionName);
1511*baf5664fSJonas Devlieghere 
151205f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->GetFunctionName();
151305f75e9fSOleksiy Vyalov }
151405f75e9fSOleksiy Vyalov 
1515bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const {
1516*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::LanguageType, SBFrame, GuessLanguage);
1517*baf5664fSJonas Devlieghere 
1518bdbdd229SJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1519bdbdd229SJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1520bdbdd229SJim Ingham 
1521bdbdd229SJim Ingham   StackFrame *frame = nullptr;
1522bdbdd229SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
1523bdbdd229SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1524bdbdd229SJim Ingham   if (target && process) {
1525bdbdd229SJim Ingham     Process::StopLocker stop_locker;
1526bdbdd229SJim Ingham     if (stop_locker.TryLock(&process->GetRunLock())) {
1527bdbdd229SJim Ingham       frame = exe_ctx.GetFramePtr();
1528bdbdd229SJim Ingham       if (frame) {
1529bdbdd229SJim Ingham         return frame->GuessLanguage();
1530bdbdd229SJim Ingham       }
1531bdbdd229SJim Ingham     }
1532bdbdd229SJim Ingham   }
1533bdbdd229SJim Ingham   return eLanguageTypeUnknown;
1534bdbdd229SJim Ingham }
1535bdbdd229SJim Ingham 
1536b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const {
1537*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, GetFunctionName);
1538*baf5664fSJonas Devlieghere 
15395160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1540dbb0abbfSEugene Zelenko   const char *name = nullptr;
1541c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1542c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1543c481c7eeSJim Ingham 
1544dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1545d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
15467730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1547b9c1b51eSKate Stone   if (target && process) {
15487fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1549b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
15507730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1551b9c1b51eSKate Stone       if (frame) {
1552b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1553b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1554b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1555b9c1b51eSKate Stone         if (sc.block) {
1556316d498bSGreg Clayton           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1557b9c1b51eSKate Stone           if (inlined_block) {
1558b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1559b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
1560b9c1b51eSKate Stone             name =
1561b9c1b51eSKate Stone                 inlined_info->GetName(sc.function->GetLanguage()).AsCString();
1562316d498bSGreg Clayton           }
1563316d498bSGreg Clayton         }
1564316d498bSGreg Clayton 
1565b9c1b51eSKate Stone         if (name == nullptr) {
1566316d498bSGreg Clayton           if (sc.function)
1567316d498bSGreg Clayton             name = sc.function->GetName().GetCString();
1568316d498bSGreg Clayton         }
1569316d498bSGreg Clayton 
1570b9c1b51eSKate Stone         if (name == nullptr) {
1571316d498bSGreg Clayton           if (sc.symbol)
1572316d498bSGreg Clayton             name = sc.symbol->GetName().GetCString();
1573316d498bSGreg Clayton         }
1574b9c1b51eSKate Stone       } else {
1575c9858e4dSGreg Clayton         if (log)
1576b9c1b51eSKate Stone           log->Printf("SBFrame::GetFunctionName () => error: could not "
1577b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
15787730b9a4SJim Ingham       }
1579b9c1b51eSKate Stone     } else {
15807730b9a4SJim Ingham       if (log)
15817730b9a4SJim Ingham         log->Printf("SBFrame::GetFunctionName() => error: process is running");
1582c9858e4dSGreg Clayton     }
15837fdf9ef1SGreg Clayton   }
1584316d498bSGreg Clayton   return name;
1585316d498bSGreg Clayton }
1586c1f705c2SEnrico Granata 
1587b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() {
1588*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetDisplayFunctionName);
1589*baf5664fSJonas Devlieghere 
1590c1f705c2SEnrico Granata   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1591dbb0abbfSEugene Zelenko   const char *name = nullptr;
1592c481c7eeSJim Ingham 
1593c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1594c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1595c481c7eeSJim Ingham 
1596dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1597c1f705c2SEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
1598c1f705c2SEnrico Granata   Process *process = exe_ctx.GetProcessPtr();
1599b9c1b51eSKate Stone   if (target && process) {
1600c1f705c2SEnrico Granata     Process::StopLocker stop_locker;
1601b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1602c1f705c2SEnrico Granata       frame = exe_ctx.GetFramePtr();
1603b9c1b51eSKate Stone       if (frame) {
1604b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1605b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1606b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1607b9c1b51eSKate Stone         if (sc.block) {
1608c1f705c2SEnrico Granata           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1609b9c1b51eSKate Stone           if (inlined_block) {
1610b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1611b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
1612b9c1b51eSKate Stone             name = inlined_info->GetDisplayName(sc.function->GetLanguage())
1613b9c1b51eSKate Stone                        .AsCString();
1614c1f705c2SEnrico Granata           }
1615c1f705c2SEnrico Granata         }
1616c1f705c2SEnrico Granata 
1617b9c1b51eSKate Stone         if (name == nullptr) {
1618c1f705c2SEnrico Granata           if (sc.function)
1619c1f705c2SEnrico Granata             name = sc.function->GetDisplayName().GetCString();
1620c1f705c2SEnrico Granata         }
1621c1f705c2SEnrico Granata 
1622b9c1b51eSKate Stone         if (name == nullptr) {
1623c1f705c2SEnrico Granata           if (sc.symbol)
1624c1f705c2SEnrico Granata             name = sc.symbol->GetDisplayName().GetCString();
1625c1f705c2SEnrico Granata         }
1626b9c1b51eSKate Stone       } else {
1627c1f705c2SEnrico Granata         if (log)
1628b9c1b51eSKate Stone           log->Printf("SBFrame::GetDisplayFunctionName () => error: could not "
1629b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
1630c1f705c2SEnrico Granata       }
1631b9c1b51eSKate Stone     } else {
1632c1f705c2SEnrico Granata       if (log)
1633b9c1b51eSKate Stone         log->Printf(
1634b9c1b51eSKate Stone             "SBFrame::GetDisplayFunctionName() => error: process is running");
1635c1f705c2SEnrico Granata     }
1636c1f705c2SEnrico Granata   }
1637c1f705c2SEnrico Granata   return name;
1638c1f705c2SEnrico Granata }
1639