180814287SRaphael Isemann //===-- SBFrame.cpp -------------------------------------------------------===//
230fdc8d8SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner 
930fdc8d8SChris Lattner #include <algorithm>
10349213f9SGreg Clayton #include <set>
11dbb0abbfSEugene Zelenko #include <string>
12dbb0abbfSEugene Zelenko 
13dbb0abbfSEugene Zelenko #include "lldb/API/SBFrame.h"
1430fdc8d8SChris Lattner 
1530fdc8d8SChris Lattner #include "lldb/lldb-types.h"
1630fdc8d8SChris Lattner 
17bd4bf82aSJonas Devlieghere #include "Utils.h"
1830fdc8d8SChris Lattner #include "lldb/Core/Address.h"
1930fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2030fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h"
2130fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h"
22347ec0faSAlex Langford #include "lldb/Expression/ExpressionVariable.h"
23151c032cSJim Ingham #include "lldb/Expression/UserExpression.h"
241ba7c4d0SGreg Clayton #include "lldb/Host/Host.h"
2530fdc8d8SChris Lattner #include "lldb/Symbol/Block.h"
261f746071SGreg Clayton #include "lldb/Symbol/Function.h"
271f746071SGreg Clayton #include "lldb/Symbol/Symbol.h"
2830fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h"
2930fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h"
30b9c1b51eSKate Stone #include "lldb/Symbol/VariableList.h"
3130fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h"
3230fdc8d8SChris Lattner #include "lldb/Target/Process.h"
3330fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
34b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h"
3541ae8e74SKuba Mracek #include "lldb/Target/StackFrameRecognizer.h"
36b9556accSGreg Clayton #include "lldb/Target/StackID.h"
37b9c1b51eSKate Stone #include "lldb/Target/Target.h"
3830fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
39bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h"
401755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
41bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
4230fdc8d8SChris Lattner 
434c5de699SEli Friedman #include "lldb/API/SBAddress.h"
44b9c1b51eSKate Stone #include "lldb/API/SBDebugger.h"
4535e1bda6SJim Ingham #include "lldb/API/SBExpressionOptions.h"
46dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
474c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h"
484c5de699SEli Friedman #include "lldb/API/SBThread.h"
49b9c1b51eSKate Stone #include "lldb/API/SBValue.h"
5051f96eebSZachary Turner #include "lldb/API/SBVariablesOptions.h"
5130fdc8d8SChris Lattner 
52237c3ed9SSean Callanan #include "llvm/Support/PrettyStackTrace.h"
53237c3ed9SSean Callanan 
5430fdc8d8SChris Lattner using namespace lldb;
5530fdc8d8SChris Lattner using namespace lldb_private;
5630fdc8d8SChris Lattner 
57baf5664fSJonas Devlieghere SBFrame::SBFrame() : m_opaque_sp(new ExecutionContextRef()) {
581755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
59baf5664fSJonas Devlieghere }
6030fdc8d8SChris Lattner 
61b9c1b51eSKate Stone SBFrame::SBFrame(const StackFrameSP &lldb_object_sp)
62b9c1b51eSKate Stone     : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) {
631755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, lldb_object_sp);
6430fdc8d8SChris Lattner }
6530fdc8d8SChris Lattner 
66a3436f73SKazu Hirata SBFrame::SBFrame(const SBFrame &rhs) {
671755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
68baf5664fSJonas Devlieghere 
69bd4bf82aSJonas Devlieghere   m_opaque_sp = clone(rhs.m_opaque_sp);
70bd4bf82aSJonas Devlieghere }
71efabb123SGreg Clayton 
72dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default;
73dbb0abbfSEugene Zelenko 
74b9c1b51eSKate Stone const SBFrame &SBFrame::operator=(const SBFrame &rhs) {
751755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
76baf5664fSJonas Devlieghere 
77efabb123SGreg Clayton   if (this != &rhs)
78bd4bf82aSJonas Devlieghere     m_opaque_sp = clone(rhs.m_opaque_sp);
79d232abc3SJonas Devlieghere   return *this;
80efabb123SGreg Clayton }
81efabb123SGreg Clayton 
82b9c1b51eSKate Stone StackFrameSP SBFrame::GetFrameSP() const {
83dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetFrameSP() : StackFrameSP());
84b9556accSGreg Clayton }
8530fdc8d8SChris Lattner 
86b9c1b51eSKate Stone void SBFrame::SetFrameSP(const StackFrameSP &lldb_object_sp) {
877fdf9ef1SGreg Clayton   return m_opaque_sp->SetFrameSP(lldb_object_sp);
88b9556accSGreg Clayton }
8930fdc8d8SChris Lattner 
90b9c1b51eSKate Stone bool SBFrame::IsValid() const {
911755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
927f5237bcSPavel Labath   return this->operator bool();
937f5237bcSPavel Labath }
947f5237bcSPavel Labath SBFrame::operator bool() const {
951755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
96baf5664fSJonas Devlieghere 
97bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
98bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
997fa7dc36SJim Ingham 
1007fa7dc36SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
1017fa7dc36SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
102b9c1b51eSKate Stone   if (target && process) {
1037fa7dc36SJim Ingham     Process::StopLocker stop_locker;
1047fa7dc36SJim Ingham     if (stop_locker.TryLock(&process->GetRunLock()))
105dbb0abbfSEugene Zelenko       return GetFrameSP().get() != nullptr;
10630fdc8d8SChris Lattner   }
10730fdc8d8SChris Lattner 
1087fa7dc36SJim Ingham   // Without a target & process we can't have a valid stack frame.
1097fa7dc36SJim Ingham   return false;
1107fa7dc36SJim Ingham }
1117fa7dc36SJim Ingham 
112b9c1b51eSKate Stone SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const {
1131755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, resolve_scope);
114baf5664fSJonas Devlieghere 
11530fdc8d8SChris Lattner   SBSymbolContext sb_sym_ctx;
116bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
117bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
118991e4453SZachary Turner   SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope);
119d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1207730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
121b9c1b51eSKate Stone   if (target && process) {
1227fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
123b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1242efc6892SPavel Labath       if (StackFrame *frame = exe_ctx.GetFramePtr())
1252efc6892SPavel Labath         sb_sym_ctx = frame->GetSymbolContext(scope);
126c9858e4dSGreg Clayton     }
1277fdf9ef1SGreg Clayton   }
128ceb6b139SCaroline Tice 
129d232abc3SJonas Devlieghere   return sb_sym_ctx;
13030fdc8d8SChris Lattner }
13130fdc8d8SChris Lattner 
132b9c1b51eSKate Stone SBModule SBFrame::GetModule() const {
1331755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
134baf5664fSJonas Devlieghere 
13572eff18aSGreg Clayton   SBModule sb_module;
136acdbe816SGreg Clayton   ModuleSP module_sp;
137bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
138bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1394fc6cb9cSJim Ingham 
140dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
141d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1427730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
143b9c1b51eSKate Stone   if (target && process) {
1447fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
145b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1467730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
147b9c1b51eSKate Stone       if (frame) {
148d9e416c0SGreg Clayton         module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp;
149acdbe816SGreg Clayton         sb_module.SetSP(module_sp);
150c9858e4dSGreg Clayton       }
1517fdf9ef1SGreg Clayton     }
152581af8b0SJonas Devlieghere   }
1534838131bSGreg Clayton 
154d232abc3SJonas Devlieghere   return sb_module;
15530fdc8d8SChris Lattner }
15630fdc8d8SChris Lattner 
157b9c1b51eSKate Stone SBCompileUnit SBFrame::GetCompileUnit() const {
1581755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
159baf5664fSJonas Devlieghere 
16072eff18aSGreg Clayton   SBCompileUnit sb_comp_unit;
161bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
162bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1634fc6cb9cSJim Ingham 
164dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
165d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1667730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
167b9c1b51eSKate Stone   if (target && process) {
1687fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
169b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1707730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
171b9c1b51eSKate Stone       if (frame) {
172b9c1b51eSKate Stone         sb_comp_unit.reset(
173b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit);
174c9858e4dSGreg Clayton       }
175c9858e4dSGreg Clayton     }
176581af8b0SJonas Devlieghere   }
177ceb6b139SCaroline Tice 
178d232abc3SJonas Devlieghere   return sb_comp_unit;
17930fdc8d8SChris Lattner }
18030fdc8d8SChris Lattner 
181b9c1b51eSKate Stone SBFunction SBFrame::GetFunction() const {
1821755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
183baf5664fSJonas Devlieghere 
18472eff18aSGreg Clayton   SBFunction sb_function;
185bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
186bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1874fc6cb9cSJim Ingham 
188dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
189d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1907730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
191b9c1b51eSKate Stone   if (target && process) {
1927fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
193b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1947730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
195b9c1b51eSKate Stone       if (frame) {
196b9c1b51eSKate Stone         sb_function.reset(
197b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextFunction).function);
1987fdf9ef1SGreg Clayton       }
199c9858e4dSGreg Clayton     }
200581af8b0SJonas Devlieghere   }
2014838131bSGreg Clayton 
202d232abc3SJonas Devlieghere   return sb_function;
20330fdc8d8SChris Lattner }
20430fdc8d8SChris Lattner 
205b9c1b51eSKate Stone SBSymbol SBFrame::GetSymbol() const {
2061755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
207baf5664fSJonas Devlieghere 
20872eff18aSGreg Clayton   SBSymbol sb_symbol;
209bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
210bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2114fc6cb9cSJim Ingham 
212dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
213d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2147730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
215b9c1b51eSKate Stone   if (target && process) {
2167fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
217b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2187730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
219b9c1b51eSKate Stone       if (frame) {
220d9e416c0SGreg Clayton         sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol);
2217fdf9ef1SGreg Clayton       }
222c9858e4dSGreg Clayton     }
223581af8b0SJonas Devlieghere   }
224581af8b0SJonas Devlieghere 
225d232abc3SJonas Devlieghere   return sb_symbol;
2263b06557eSGreg Clayton }
2273b06557eSGreg Clayton 
228b9c1b51eSKate Stone SBBlock SBFrame::GetBlock() const {
2291755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
230baf5664fSJonas Devlieghere 
23172eff18aSGreg Clayton   SBBlock sb_block;
232bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
233bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2344fc6cb9cSJim Ingham 
235dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
236d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2377730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
238b9c1b51eSKate Stone   if (target && process) {
2397fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
240b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2417730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
242581af8b0SJonas Devlieghere       if (frame)
243d9e416c0SGreg Clayton         sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block);
2447fdf9ef1SGreg Clayton     }
245c9858e4dSGreg Clayton   }
246d232abc3SJonas Devlieghere   return sb_block;
24730fdc8d8SChris Lattner }
24830fdc8d8SChris Lattner 
249b9c1b51eSKate Stone SBBlock SBFrame::GetFrameBlock() const {
2501755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
251baf5664fSJonas Devlieghere 
25272eff18aSGreg Clayton   SBBlock sb_block;
253bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
254bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2554fc6cb9cSJim Ingham 
256dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
257d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2587730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
259b9c1b51eSKate Stone   if (target && process) {
2607fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
261b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2627730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
263581af8b0SJonas Devlieghere       if (frame)
264d9e416c0SGreg Clayton         sb_block.SetPtr(frame->GetFrameBlock());
2657fdf9ef1SGreg Clayton     }
266c9858e4dSGreg Clayton   }
267d232abc3SJonas Devlieghere   return sb_block;
26895897c6aSGreg Clayton }
26995897c6aSGreg Clayton 
270b9c1b51eSKate Stone SBLineEntry SBFrame::GetLineEntry() const {
2711755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
272baf5664fSJonas Devlieghere 
27372eff18aSGreg Clayton   SBLineEntry sb_line_entry;
274bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
275bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2764fc6cb9cSJim Ingham 
277dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
278d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2797730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
280b9c1b51eSKate Stone   if (target && process) {
2817fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
282b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2837730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
284b9c1b51eSKate Stone       if (frame) {
285b9c1b51eSKate Stone         sb_line_entry.SetLineEntry(
286b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextLineEntry).line_entry);
2877fdf9ef1SGreg Clayton       }
288c9858e4dSGreg Clayton     }
289581af8b0SJonas Devlieghere   }
290d232abc3SJonas Devlieghere   return sb_line_entry;
29130fdc8d8SChris Lattner }
29230fdc8d8SChris Lattner 
293b9c1b51eSKate Stone uint32_t SBFrame::GetFrameID() const {
2941755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
295baf5664fSJonas Devlieghere 
296b9556accSGreg Clayton   uint32_t frame_idx = UINT32_MAX;
297b9556accSGreg Clayton 
298c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
299c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
300c481c7eeSJim Ingham 
301b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
3027fdf9ef1SGreg Clayton   if (frame)
303d9e416c0SGreg Clayton     frame_idx = frame->GetFrameIndex();
3044838131bSGreg Clayton 
3054838131bSGreg Clayton   return frame_idx;
30630fdc8d8SChris Lattner }
30730fdc8d8SChris Lattner 
308b9c1b51eSKate Stone lldb::addr_t SBFrame::GetCFA() const {
3091755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
310baf5664fSJonas Devlieghere 
311c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
312c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
313c481c7eeSJim Ingham 
314424a5dbcSGreg Clayton   StackFrame *frame = exe_ctx.GetFramePtr();
315424a5dbcSGreg Clayton   if (frame)
316424a5dbcSGreg Clayton     return frame->GetStackID().GetCallFrameAddress();
317424a5dbcSGreg Clayton   return LLDB_INVALID_ADDRESS;
318424a5dbcSGreg Clayton }
319424a5dbcSGreg Clayton 
320b9c1b51eSKate Stone addr_t SBFrame::GetPC() const {
3211755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
322baf5664fSJonas Devlieghere 
32369b582faSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
324bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
325bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3264fc6cb9cSJim Ingham 
327dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
328d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3297730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
330b9c1b51eSKate Stone   if (target && process) {
3317fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
332b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3337730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
334b9c1b51eSKate Stone       if (frame) {
335b9c1b51eSKate Stone         addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress(
33604803b3eSTatyana Krasnukha             target, AddressClass::eCode);
337c9858e4dSGreg Clayton       }
3387fdf9ef1SGreg Clayton     }
339581af8b0SJonas Devlieghere   }
340ceb6b139SCaroline Tice 
341ceb6b139SCaroline Tice   return addr;
34230fdc8d8SChris Lattner }
34330fdc8d8SChris Lattner 
344b9c1b51eSKate Stone bool SBFrame::SetPC(addr_t new_pc) {
3451755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, new_pc);
346baf5664fSJonas Devlieghere 
347ceb6b139SCaroline Tice   bool ret_val = false;
348bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
349bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3504fc6cb9cSJim Ingham 
351d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3527730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
353b9c1b51eSKate Stone   if (target && process) {
3547fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
355b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3560d7401cfSMed Ismail Bennani       if (StackFrame *frame = exe_ctx.GetFramePtr()) {
3570d7401cfSMed Ismail Bennani         if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
3580d7401cfSMed Ismail Bennani           ret_val = reg_ctx_sp->SetPC(new_pc);
3590d7401cfSMed Ismail Bennani         }
360c9858e4dSGreg Clayton       }
3617fdf9ef1SGreg Clayton     }
362581af8b0SJonas Devlieghere   }
363ceb6b139SCaroline Tice 
364ceb6b139SCaroline Tice   return ret_val;
36530fdc8d8SChris Lattner }
36630fdc8d8SChris Lattner 
367b9c1b51eSKate Stone addr_t SBFrame::GetSP() const {
3681755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
369baf5664fSJonas Devlieghere 
3704838131bSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
371bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
372bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3734fc6cb9cSJim Ingham 
374d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3757730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
376b9c1b51eSKate Stone   if (target && process) {
3777fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
378b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3790d7401cfSMed Ismail Bennani       if (StackFrame *frame = exe_ctx.GetFramePtr()) {
3800d7401cfSMed Ismail Bennani         if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
3810d7401cfSMed Ismail Bennani           addr = reg_ctx_sp->GetSP();
3820d7401cfSMed Ismail Bennani         }
3837fdf9ef1SGreg Clayton       }
384c9858e4dSGreg Clayton     }
385581af8b0SJonas Devlieghere   }
3864838131bSGreg Clayton 
3874838131bSGreg Clayton   return addr;
38830fdc8d8SChris Lattner }
38930fdc8d8SChris Lattner 
390b9c1b51eSKate Stone addr_t SBFrame::GetFP() const {
3911755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
392baf5664fSJonas Devlieghere 
39369b582faSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
394bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
395bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3964fc6cb9cSJim Ingham 
397d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3987730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
399b9c1b51eSKate Stone   if (target && process) {
4007fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
401b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4020d7401cfSMed Ismail Bennani       if (StackFrame *frame = exe_ctx.GetFramePtr()) {
4030d7401cfSMed Ismail Bennani         if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
4040d7401cfSMed Ismail Bennani           addr = reg_ctx_sp->GetFP();
4050d7401cfSMed Ismail Bennani         }
4060d7401cfSMed Ismail Bennani       }
407c9858e4dSGreg Clayton     }
4087fdf9ef1SGreg Clayton   }
409ceb6b139SCaroline Tice 
410ceb6b139SCaroline Tice   return addr;
41130fdc8d8SChris Lattner }
41230fdc8d8SChris Lattner 
413b9c1b51eSKate Stone SBAddress SBFrame::GetPCAddress() const {
4141755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
415baf5664fSJonas Devlieghere 
41630fdc8d8SChris Lattner   SBAddress sb_addr;
417bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
418bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4194fc6cb9cSJim Ingham 
420b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
421d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4227730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
423b9c1b51eSKate Stone   if (target && process) {
4247fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
425b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4267730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
427581af8b0SJonas Devlieghere       if (frame)
4286cd4a4cdSJonas Devlieghere         sb_addr.SetAddress(frame->GetFrameCodeAddress());
4297fdf9ef1SGreg Clayton     }
430c9858e4dSGreg Clayton   }
431d232abc3SJonas Devlieghere   return sb_addr;
43230fdc8d8SChris Lattner }
43330fdc8d8SChris Lattner 
434baf5664fSJonas Devlieghere void SBFrame::Clear() {
4351755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
436baf5664fSJonas Devlieghere 
437baf5664fSJonas Devlieghere   m_opaque_sp->Clear();
438baf5664fSJonas Devlieghere }
43930fdc8d8SChris Lattner 
440b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) {
4411755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, var_path);
442baf5664fSJonas Devlieghere 
4437edbdfc9SGreg Clayton   SBValue sb_value;
444c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
445c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
446c481c7eeSJim Ingham 
447b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
448d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
449b9c1b51eSKate Stone   if (frame && target) {
450b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
451b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
4527edbdfc9SGreg Clayton     sb_value = GetValueForVariablePath(var_path, use_dynamic);
4537edbdfc9SGreg Clayton   }
454d232abc3SJonas Devlieghere   return sb_value;
4557edbdfc9SGreg Clayton }
4567edbdfc9SGreg Clayton 
457b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path,
458b9c1b51eSKate Stone                                                DynamicValueType use_dynamic) {
4591755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, var_path, use_dynamic);
460baf5664fSJonas Devlieghere 
4617edbdfc9SGreg Clayton   SBValue sb_value;
462b9c1b51eSKate Stone   if (var_path == nullptr || var_path[0] == '\0') {
463d232abc3SJonas Devlieghere     return sb_value;
4647730b9a4SJim Ingham   }
4657730b9a4SJim Ingham 
466bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
467bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4684fc6cb9cSJim Ingham 
469dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
470d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4717730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
472b9c1b51eSKate Stone   if (target && process) {
4737fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
474b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4757730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
476b9c1b51eSKate Stone       if (frame) {
4777edbdfc9SGreg Clayton         VariableSP var_sp;
47897206d57SZachary Turner         Status error;
479b9c1b51eSKate Stone         ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath(
480b9c1b51eSKate Stone             var_path, eNoDynamicValues,
481b9c1b51eSKate Stone             StackFrame::eExpressionPathOptionCheckPtrVsMember |
482b9c1b51eSKate Stone                 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
483b9c1b51eSKate Stone             var_sp, error));
484e3e91517SEnrico Granata         sb_value.SetSP(value_sp, use_dynamic);
4857730b9a4SJim Ingham       }
486c9858e4dSGreg Clayton     }
4877fdf9ef1SGreg Clayton   }
488d232abc3SJonas Devlieghere   return sb_value;
4897edbdfc9SGreg Clayton }
4907edbdfc9SGreg Clayton 
491b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name) {
4921755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, name);
493baf5664fSJonas Devlieghere 
494316d498bSGreg Clayton   SBValue value;
495c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
496c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
497c481c7eeSJim Ingham 
498b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
499d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
500b9c1b51eSKate Stone   if (frame && target) {
501b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
502b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
503316d498bSGreg Clayton     value = FindVariable(name, use_dynamic);
504316d498bSGreg Clayton   }
505d232abc3SJonas Devlieghere   return value;
50678a685aaSJim Ingham }
50778a685aaSJim Ingham 
508b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name,
509b9c1b51eSKate Stone                               lldb::DynamicValueType use_dynamic) {
5101755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, name, use_dynamic);
511baf5664fSJonas Devlieghere 
51269b582faSGreg Clayton   VariableSP var_sp;
51358b59f95SJim Ingham   SBValue sb_value;
5147730b9a4SJim Ingham 
515b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
516d232abc3SJonas Devlieghere     return sb_value;
5177730b9a4SJim Ingham   }
5187730b9a4SJim Ingham 
51981e871edSGreg Clayton   ValueObjectSP value_sp;
520bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
521bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5224fc6cb9cSJim Ingham 
523dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
524d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5257730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
526b9c1b51eSKate Stone   if (target && process) {
5277fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
528b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5297730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
530b9c1b51eSKate Stone       if (frame) {
531e23d0b63SShafik Yaghmour         value_sp = frame->FindVariable(ConstString(name));
53230fdc8d8SChris Lattner 
533e23d0b63SShafik Yaghmour         if (value_sp)
534e3e91517SEnrico Granata           sb_value.SetSP(value_sp, use_dynamic);
535c9858e4dSGreg Clayton       }
536316d498bSGreg Clayton     }
537581af8b0SJonas Devlieghere   }
5384838131bSGreg Clayton 
539d232abc3SJonas Devlieghere   return sb_value;
540dde9cff3SCaroline Tice }
541dde9cff3SCaroline Tice 
542b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) {
5431755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, name, value_type);
544baf5664fSJonas Devlieghere 
545316d498bSGreg Clayton   SBValue value;
546c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
547c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
548c481c7eeSJim Ingham 
549b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
550d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
551b9c1b51eSKate Stone   if (frame && target) {
552b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
553b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
554316d498bSGreg Clayton     value = FindValue(name, value_type, use_dynamic);
555316d498bSGreg Clayton   }
556d232abc3SJonas Devlieghere   return value;
55778a685aaSJim Ingham }
55878a685aaSJim Ingham 
559b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type,
560b9c1b51eSKate Stone                            lldb::DynamicValueType use_dynamic) {
5611755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, name, value_type, use_dynamic);
562baf5664fSJonas Devlieghere 
56369b582faSGreg Clayton   SBValue sb_value;
5647730b9a4SJim Ingham 
565b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
566d232abc3SJonas Devlieghere     return sb_value;
5677730b9a4SJim Ingham   }
5687730b9a4SJim Ingham 
56981e871edSGreg Clayton   ValueObjectSP value_sp;
570bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
571bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5724fc6cb9cSJim Ingham 
573dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
574d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5757730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
576b9c1b51eSKate Stone   if (target && process) {
5777fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
578b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5797730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
580b9c1b51eSKate Stone       if (frame) {
5818a2a0dfbSEnrico Granata         VariableList variable_list;
5828a2a0dfbSEnrico Granata 
583b9c1b51eSKate Stone         switch (value_type) {
58469b582faSGreg Clayton         case eValueTypeVariableGlobal:      // global variable
58569b582faSGreg Clayton         case eValueTypeVariableStatic:      // static variable
58669b582faSGreg Clayton         case eValueTypeVariableArgument:    // function argument variables
58769b582faSGreg Clayton         case eValueTypeVariableLocal:       // function local variables
58863a27afaSGreg Clayton         case eValueTypeVariableThreadLocal: // thread local variables
58969b582faSGreg Clayton         {
590d9e416c0SGreg Clayton           SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock));
59172eff18aSGreg Clayton 
59272eff18aSGreg Clayton           const bool can_create = true;
59372eff18aSGreg Clayton           const bool get_parent_variables = true;
59472eff18aSGreg Clayton           const bool stop_if_block_is_inlined_function = true;
59572eff18aSGreg Clayton 
5960efb51a0SChaoren Lin           if (sc.block)
597b9c1b51eSKate Stone             sc.block->AppendVariables(
598b9c1b51eSKate Stone                 can_create, get_parent_variables,
599b9c1b51eSKate Stone                 stop_if_block_is_inlined_function,
600b9c1b51eSKate Stone                 [frame](Variable *v) { return v->IsInScope(frame); },
601b9c1b51eSKate Stone                 &variable_list);
602b9c1b51eSKate Stone           if (value_type == eValueTypeVariableGlobal) {
6038a2a0dfbSEnrico Granata             const bool get_file_globals = true;
6048a2a0dfbSEnrico Granata             VariableList *frame_vars = frame->GetVariableList(get_file_globals);
6058a2a0dfbSEnrico Granata             if (frame_vars)
6068a2a0dfbSEnrico Granata               frame_vars->AppendVariablesIfUnique(variable_list);
6078a2a0dfbSEnrico Granata           }
60869b582faSGreg Clayton           ConstString const_name(name);
609b9c1b51eSKate Stone           VariableSP variable_sp(
610b9c1b51eSKate Stone               variable_list.FindVariable(const_name, value_type));
611b9c1b51eSKate Stone           if (variable_sp) {
612b9c1b51eSKate Stone             value_sp = frame->GetValueObjectForFrameVariable(variable_sp,
613b9c1b51eSKate Stone                                                              eNoDynamicValues);
614e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
61530fdc8d8SChris Lattner           }
616b9c1b51eSKate Stone         } break;
61769b582faSGreg Clayton 
61869b582faSGreg Clayton         case eValueTypeRegister: // stack frame register value
61969b582faSGreg Clayton         {
620d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
621b9c1b51eSKate Stone           if (reg_ctx) {
6228567f4d4SMichał Górny             if (const RegisterInfo *reg_info =
6238567f4d4SMichał Górny                     reg_ctx->GetRegisterInfoByName(name)) {
6248567f4d4SMichał Górny               value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_info);
62581e871edSGreg Clayton               sb_value.SetSP(value_sp);
62669b582faSGreg Clayton             }
62769b582faSGreg Clayton           }
628b9c1b51eSKate Stone         } break;
62969b582faSGreg Clayton 
630b9c1b51eSKate Stone         case eValueTypeRegisterSet: // A collection of stack frame register
631b9c1b51eSKate Stone                                     // values
63269b582faSGreg Clayton         {
633d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
634b9c1b51eSKate Stone           if (reg_ctx) {
63569b582faSGreg Clayton             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
636b9c1b51eSKate Stone             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
63769b582faSGreg Clayton               const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx);
63869b582faSGreg Clayton               if (reg_set &&
63969b582faSGreg Clayton                   ((reg_set->name && strcasecmp(reg_set->name, name) == 0) ||
640b9c1b51eSKate Stone                    (reg_set->short_name &&
641b9c1b51eSKate Stone                     strcasecmp(reg_set->short_name, name) == 0))) {
642b9c1b51eSKate Stone                 value_sp =
643b9c1b51eSKate Stone                     ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx);
64481e871edSGreg Clayton                 sb_value.SetSP(value_sp);
64581e871edSGreg Clayton                 break;
64669b582faSGreg Clayton               }
64769b582faSGreg Clayton             }
64869b582faSGreg Clayton           }
649b9c1b51eSKate Stone         } break;
65069b582faSGreg Clayton 
65169b582faSGreg Clayton         case eValueTypeConstResult: // constant result variables
65269b582faSGreg Clayton         {
65369b582faSGreg Clayton           ConstString const_name(name);
654b9c1b51eSKate Stone           ExpressionVariableSP expr_var_sp(
655b9c1b51eSKate Stone               target->GetPersistentVariable(const_name));
656b9c1b51eSKate Stone           if (expr_var_sp) {
65781e871edSGreg Clayton             value_sp = expr_var_sp->GetValueObject();
658e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
65981e871edSGreg Clayton           }
660b9c1b51eSKate Stone         } break;
66169b582faSGreg Clayton 
66269b582faSGreg Clayton         default:
66369b582faSGreg Clayton           break;
66469b582faSGreg Clayton         }
665c9858e4dSGreg Clayton       }
6667fdf9ef1SGreg Clayton     }
667581af8b0SJonas Devlieghere   }
6684838131bSGreg Clayton 
669d232abc3SJonas Devlieghere   return sb_value;
670dde9cff3SCaroline Tice }
671dde9cff3SCaroline Tice 
672b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const {
6731755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, that);
674baf5664fSJonas Devlieghere 
675b57e4a1bSJason Molenda   lldb::StackFrameSP this_sp = GetFrameSP();
676b57e4a1bSJason Molenda   lldb::StackFrameSP that_sp = that.GetFrameSP();
67735e2ab60SJohnny Chen   return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
67835e2ab60SJohnny Chen }
67935e2ab60SJohnny Chen 
680baf5664fSJonas Devlieghere bool SBFrame::operator==(const SBFrame &rhs) const {
6811755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
68230fdc8d8SChris Lattner 
683baf5664fSJonas Devlieghere   return IsEqual(rhs);
684baf5664fSJonas Devlieghere }
685baf5664fSJonas Devlieghere 
686baf5664fSJonas Devlieghere bool SBFrame::operator!=(const SBFrame &rhs) const {
6871755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
688baf5664fSJonas Devlieghere 
689baf5664fSJonas Devlieghere   return !IsEqual(rhs);
690baf5664fSJonas Devlieghere }
69130fdc8d8SChris Lattner 
692b9c1b51eSKate Stone SBThread SBFrame::GetThread() const {
6931755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
694baf5664fSJonas Devlieghere 
695c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
696c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
697c481c7eeSJim Ingham 
698d9e416c0SGreg Clayton   ThreadSP thread_sp(exe_ctx.GetThreadSP());
699d9e416c0SGreg Clayton   SBThread sb_thread(thread_sp);
700ceb6b139SCaroline Tice 
701d232abc3SJonas Devlieghere   return sb_thread;
70230fdc8d8SChris Lattner }
70330fdc8d8SChris Lattner 
704b9c1b51eSKate Stone const char *SBFrame::Disassemble() const {
7051755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
706baf5664fSJonas Devlieghere 
707dbb0abbfSEugene Zelenko   const char *disassembly = nullptr;
708bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
709bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
7104fc6cb9cSJim Ingham 
711dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
712d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
7137730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
714b9c1b51eSKate Stone   if (target && process) {
7157fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
716b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
7177730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
718b9c1b51eSKate Stone       if (frame) {
719d9e416c0SGreg Clayton         disassembly = frame->Disassemble();
7207fdf9ef1SGreg Clayton       }
721c9858e4dSGreg Clayton     }
722581af8b0SJonas Devlieghere   }
7234838131bSGreg Clayton 
7244838131bSGreg Clayton   return disassembly;
72530fdc8d8SChris Lattner }
72630fdc8d8SChris Lattner 
727b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics,
728b9c1b51eSKate Stone                                   bool in_scope_only) {
7291755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, arguments, locals, statics, in_scope_only);
730baf5664fSJonas Devlieghere 
731316d498bSGreg Clayton   SBValueList value_list;
732c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
733c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
734c481c7eeSJim Ingham 
735b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
736d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
737b9c1b51eSKate Stone   if (frame && target) {
738b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
739b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
740b9c1b51eSKate Stone     const bool include_runtime_support_values =
741b9c1b51eSKate Stone         target ? target->GetDisplayRuntimeSupportValues() : false;
74251f96eebSZachary Turner 
74351f96eebSZachary Turner     SBVariablesOptions options;
74451f96eebSZachary Turner     options.SetIncludeArguments(arguments);
74551f96eebSZachary Turner     options.SetIncludeLocals(locals);
74651f96eebSZachary Turner     options.SetIncludeStatics(statics);
74751f96eebSZachary Turner     options.SetInScopeOnly(in_scope_only);
74851f96eebSZachary Turner     options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
74951f96eebSZachary Turner     options.SetUseDynamic(use_dynamic);
75051f96eebSZachary Turner 
75151f96eebSZachary Turner     value_list = GetVariables(options);
752316d498bSGreg Clayton   }
753d232abc3SJonas Devlieghere   return value_list;
75478a685aaSJim Ingham }
75578a685aaSJim Ingham 
756b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals,
757b9c1b51eSKate Stone                                         bool statics, bool in_scope_only,
758b9c1b51eSKate Stone                                         lldb::DynamicValueType use_dynamic) {
7591755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, arguments, locals, statics, in_scope_only,
7601755f5b1SJonas Devlieghere                      use_dynamic);
761baf5664fSJonas Devlieghere 
762c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
763c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
764c481c7eeSJim Ingham 
765560558ebSEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
766b9c1b51eSKate Stone   const bool include_runtime_support_values =
767b9c1b51eSKate Stone       target ? target->GetDisplayRuntimeSupportValues() : false;
76851f96eebSZachary Turner   SBVariablesOptions options;
76951f96eebSZachary Turner   options.SetIncludeArguments(arguments);
77051f96eebSZachary Turner   options.SetIncludeLocals(locals);
77151f96eebSZachary Turner   options.SetIncludeStatics(statics);
77251f96eebSZachary Turner   options.SetInScopeOnly(in_scope_only);
77351f96eebSZachary Turner   options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
77451f96eebSZachary Turner   options.SetUseDynamic(use_dynamic);
775d232abc3SJonas Devlieghere   return GetVariables(options);
776560558ebSEnrico Granata }
777560558ebSEnrico Granata 
778b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) {
7791755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, options);
780baf5664fSJonas Devlieghere 
781b9556accSGreg Clayton   SBValueList value_list;
782bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
783bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
7844fc6cb9cSJim Ingham 
785dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
786d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
787b9556accSGreg Clayton 
78851f96eebSZachary Turner   const bool statics = options.GetIncludeStatics();
78951f96eebSZachary Turner   const bool arguments = options.GetIncludeArguments();
7904c7f5d5cSKuba Mracek   const bool recognized_arguments =
7914c7f5d5cSKuba Mracek         options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP()));
79251f96eebSZachary Turner   const bool locals = options.GetIncludeLocals();
79351f96eebSZachary Turner   const bool in_scope_only = options.GetInScopeOnly();
794b9c1b51eSKate Stone   const bool include_runtime_support_values =
795b9c1b51eSKate Stone       options.GetIncludeRuntimeSupportValues();
79651f96eebSZachary Turner   const lldb::DynamicValueType use_dynamic = options.GetUseDynamic();
79751f96eebSZachary Turner 
798ceb6b139SCaroline Tice 
799349213f9SGreg Clayton   std::set<VariableSP> variable_set;
8007730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
801b9c1b51eSKate Stone   if (target && process) {
8027fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
803b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
8047730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
805b9c1b51eSKate Stone       if (frame) {
806dbb0abbfSEugene Zelenko         VariableList *variable_list = nullptr;
807d9e416c0SGreg Clayton         variable_list = frame->GetVariableList(true);
808b9c1b51eSKate Stone         if (variable_list) {
80930fdc8d8SChris Lattner           const size_t num_variables = variable_list->GetSize();
810b9c1b51eSKate Stone           if (num_variables) {
811d1782133SRaphael Isemann             for (const VariableSP &variable_sp : *variable_list) {
812b9c1b51eSKate Stone               if (variable_sp) {
81330fdc8d8SChris Lattner                 bool add_variable = false;
814b9c1b51eSKate Stone                 switch (variable_sp->GetScope()) {
81530fdc8d8SChris Lattner                 case eValueTypeVariableGlobal:
81630fdc8d8SChris Lattner                 case eValueTypeVariableStatic:
81763a27afaSGreg Clayton                 case eValueTypeVariableThreadLocal:
81830fdc8d8SChris Lattner                   add_variable = statics;
81930fdc8d8SChris Lattner                   break;
82030fdc8d8SChris Lattner 
82130fdc8d8SChris Lattner                 case eValueTypeVariableArgument:
82230fdc8d8SChris Lattner                   add_variable = arguments;
82330fdc8d8SChris Lattner                   break;
82430fdc8d8SChris Lattner 
82530fdc8d8SChris Lattner                 case eValueTypeVariableLocal:
82630fdc8d8SChris Lattner                   add_variable = locals;
82730fdc8d8SChris Lattner                   break;
828c982c768SGreg Clayton 
829c982c768SGreg Clayton                 default:
830c982c768SGreg Clayton                   break;
83130fdc8d8SChris Lattner                 }
832b9c1b51eSKate Stone                 if (add_variable) {
833349213f9SGreg Clayton                   // Only add variables once so we don't end up with duplicates
834349213f9SGreg Clayton                   if (variable_set.find(variable_sp) == variable_set.end())
835349213f9SGreg Clayton                     variable_set.insert(variable_sp);
836349213f9SGreg Clayton                   else
837349213f9SGreg Clayton                     continue;
838349213f9SGreg Clayton 
839d9e416c0SGreg Clayton                   if (in_scope_only && !variable_sp->IsInScope(frame))
84030fdc8d8SChris Lattner                     continue;
84130fdc8d8SChris Lattner 
842b9c1b51eSKate Stone                   ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable(
843b9c1b51eSKate Stone                       variable_sp, eNoDynamicValues));
844560558ebSEnrico Granata 
845b9c1b51eSKate Stone                   if (!include_runtime_support_values && valobj_sp != nullptr &&
846dbb0abbfSEugene Zelenko                       valobj_sp->IsRuntimeSupportValue())
847560558ebSEnrico Granata                     continue;
848560558ebSEnrico Granata 
849e3e91517SEnrico Granata                   SBValue value_sb;
850e3e91517SEnrico Granata                   value_sb.SetSP(valobj_sp, use_dynamic);
851e3e91517SEnrico Granata                   value_list.Append(value_sb);
85230fdc8d8SChris Lattner                 }
85330fdc8d8SChris Lattner               }
85430fdc8d8SChris Lattner             }
85530fdc8d8SChris Lattner           }
85630fdc8d8SChris Lattner         }
85741ae8e74SKuba Mracek         if (recognized_arguments) {
85841ae8e74SKuba Mracek           auto recognized_frame = frame->GetRecognizedFrame();
85941ae8e74SKuba Mracek           if (recognized_frame) {
86041ae8e74SKuba Mracek             ValueObjectListSP recognized_arg_list =
86141ae8e74SKuba Mracek                 recognized_frame->GetRecognizedArguments();
86241ae8e74SKuba Mracek             if (recognized_arg_list) {
86341ae8e74SKuba Mracek               for (auto &rec_value_sp : recognized_arg_list->GetObjects()) {
86441ae8e74SKuba Mracek                 SBValue value_sb;
86541ae8e74SKuba Mracek                 value_sb.SetSP(rec_value_sp, use_dynamic);
86641ae8e74SKuba Mracek                 value_list.Append(value_sb);
86741ae8e74SKuba Mracek               }
86841ae8e74SKuba Mracek             }
86941ae8e74SKuba Mracek           }
87041ae8e74SKuba Mracek         }
871c9858e4dSGreg Clayton       }
8727fdf9ef1SGreg Clayton     }
873581af8b0SJonas Devlieghere   }
874ceb6b139SCaroline Tice 
875d232abc3SJonas Devlieghere   return value_list;
87630fdc8d8SChris Lattner }
87730fdc8d8SChris Lattner 
878b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() {
8791755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
880baf5664fSJonas Devlieghere 
88130fdc8d8SChris Lattner   SBValueList value_list;
882bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
883bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
8844fc6cb9cSJim Ingham 
885dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
886d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
8877730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
888b9c1b51eSKate Stone   if (target && process) {
8897fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
890b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
8917730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
892b9c1b51eSKate Stone       if (frame) {
893d9e416c0SGreg Clayton         RegisterContextSP reg_ctx(frame->GetRegisterContext());
894b9c1b51eSKate Stone         if (reg_ctx) {
89530fdc8d8SChris Lattner           const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
896b9c1b51eSKate Stone           for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
897b9c1b51eSKate Stone             value_list.Append(
898b9c1b51eSKate Stone                 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx));
89930fdc8d8SChris Lattner           }
90030fdc8d8SChris Lattner         }
901c9858e4dSGreg Clayton       }
9027fdf9ef1SGreg Clayton     }
903581af8b0SJonas Devlieghere   }
904ceb6b139SCaroline Tice 
905d232abc3SJonas Devlieghere   return value_list;
90630fdc8d8SChris Lattner }
90730fdc8d8SChris Lattner 
908b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) {
9091755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, name);
910baf5664fSJonas Devlieghere 
911ad9a53c5SJason Molenda   SBValue result;
912ad9a53c5SJason Molenda   ValueObjectSP value_sp;
913bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
914bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
915ad9a53c5SJason Molenda 
916dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
917ad9a53c5SJason Molenda   Target *target = exe_ctx.GetTargetPtr();
918ad9a53c5SJason Molenda   Process *process = exe_ctx.GetProcessPtr();
919b9c1b51eSKate Stone   if (target && process) {
920ad9a53c5SJason Molenda     Process::StopLocker stop_locker;
921b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
922ad9a53c5SJason Molenda       frame = exe_ctx.GetFramePtr();
923b9c1b51eSKate Stone       if (frame) {
924ad9a53c5SJason Molenda         RegisterContextSP reg_ctx(frame->GetRegisterContext());
925b9c1b51eSKate Stone         if (reg_ctx) {
9268567f4d4SMichał Górny           if (const RegisterInfo *reg_info =
9278567f4d4SMichał Górny                   reg_ctx->GetRegisterInfoByName(name)) {
9288567f4d4SMichał Górny             value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_info);
929ad9a53c5SJason Molenda             result.SetSP(value_sp);
930ad9a53c5SJason Molenda           }
931ad9a53c5SJason Molenda         }
932ad9a53c5SJason Molenda       }
933ad9a53c5SJason Molenda     }
934581af8b0SJonas Devlieghere   }
935ad9a53c5SJason Molenda 
936d232abc3SJonas Devlieghere   return result;
937ad9a53c5SJason Molenda }
938ad9a53c5SJason Molenda 
939b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) {
9401755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, description);
941baf5664fSJonas Devlieghere 
942da7bc7d0SGreg Clayton   Stream &strm = description.ref();
943da7bc7d0SGreg Clayton 
944bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
945bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
9464fc6cb9cSJim Ingham 
947b57e4a1bSJason Molenda   StackFrame *frame;
948d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
9497730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
950b9c1b51eSKate Stone   if (target && process) {
9517fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
952b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
9537730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
954b9c1b51eSKate Stone       if (frame) {
955d9e416c0SGreg Clayton         frame->DumpUsingSettingsFormat(&strm);
9567730b9a4SJim Ingham       }
957c9858e4dSGreg Clayton     }
958c9858e4dSGreg Clayton 
959b9c1b51eSKate Stone   } else
960da7bc7d0SGreg Clayton     strm.PutCString("No value");
961dde9cff3SCaroline Tice 
962dde9cff3SCaroline Tice   return true;
963dde9cff3SCaroline Tice }
9641d3afba3SGreg Clayton 
965b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) {
9661755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, expr);
967baf5664fSJonas Devlieghere 
968316d498bSGreg Clayton   SBValue result;
969c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
970c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
971c481c7eeSJim Ingham 
972b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
973d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
974b9c1b51eSKate Stone   if (frame && target) {
97535e1bda6SJim Ingham     SBExpressionOptions options;
976b9c1b51eSKate Stone     lldb::DynamicValueType fetch_dynamic_value =
977b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
978cced1566SGreg Clayton     options.SetFetchDynamicValue(fetch_dynamic_value);
97935e1bda6SJim Ingham     options.SetUnwindOnError(true);
98024785bd0SEugene Leviant     options.SetIgnoreBreakpoints(true);
981998c8a1cSRyan Brown     if (target->GetLanguage() != eLanguageTypeUnknown)
982998c8a1cSRyan Brown       options.SetLanguage(target->GetLanguage());
983998c8a1cSRyan Brown     else
984998c8a1cSRyan Brown       options.SetLanguage(frame->GetLanguage());
985d232abc3SJonas Devlieghere     return EvaluateExpression(expr, options);
986316d498bSGreg Clayton   }
987d232abc3SJonas Devlieghere   return result;
98878a685aaSJim Ingham }
98978a685aaSJim Ingham 
99078a685aaSJim Ingham SBValue
991b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr,
992b9c1b51eSKate Stone                             lldb::DynamicValueType fetch_dynamic_value) {
9931755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, expr, fetch_dynamic_value);
994baf5664fSJonas Devlieghere 
99535e1bda6SJim Ingham   SBExpressionOptions options;
996cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
99735e1bda6SJim Ingham   options.SetUnwindOnError(true);
99824785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
999c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1000c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1001c481c7eeSJim Ingham 
1002998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1003998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1004998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1005998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1006998c8a1cSRyan Brown   else if (frame)
1007998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
1008d232abc3SJonas Devlieghere   return EvaluateExpression(expr, options);
10097ba6e991SJim Ingham }
10107ba6e991SJim Ingham 
1011b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr,
1012b9c1b51eSKate Stone                                     lldb::DynamicValueType fetch_dynamic_value,
1013b9c1b51eSKate Stone                                     bool unwind_on_error) {
10141755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, expr, fetch_dynamic_value, unwind_on_error);
1015baf5664fSJonas Devlieghere 
101635e1bda6SJim Ingham   SBExpressionOptions options;
1017c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1018c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1019c481c7eeSJim Ingham 
1020cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
102135e1bda6SJim Ingham   options.SetUnwindOnError(unwind_on_error);
102224785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1023998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1024998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1025998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1026998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1027998c8a1cSRyan Brown   else if (frame)
1028998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
1029d232abc3SJonas Devlieghere   return EvaluateExpression(expr, options);
103035e1bda6SJim Ingham }
103135e1bda6SJim Ingham 
1032b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr,
1033b9c1b51eSKate Stone                                           const SBExpressionOptions &options) {
10341755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, expr, options);
1035baf5664fSJonas Devlieghere 
1036*a007a6d8SPavel Labath   Log *expr_log = GetLog(LLDBLog::Expressions);
1037a162ebafSSean Callanan 
103869b582faSGreg Clayton   SBValue expr_result;
10397730b9a4SJim Ingham 
1040b9c1b51eSKate Stone   if (expr == nullptr || expr[0] == '\0') {
1041d232abc3SJonas Devlieghere     return expr_result;
10427730b9a4SJim Ingham   }
10437730b9a4SJim Ingham 
104481e871edSGreg Clayton   ValueObjectSP expr_value_sp;
10454838131bSGreg Clayton 
1046bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1047bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
10484fc6cb9cSJim Ingham 
1049b9556accSGreg Clayton 
1050dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
10517730b9a4SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
10527730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
10537730b9a4SJim Ingham 
1054b9c1b51eSKate Stone   if (target && process) {
10557fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1056b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
10577730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1058b9c1b51eSKate Stone       if (frame) {
10598f7db52dSJim Ingham         std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace;
1060b9c1b51eSKate Stone         if (target->GetDisplayExpressionsInCrashlogs()) {
10611ba7c4d0SGreg Clayton           StreamString frame_description;
1062d9e416c0SGreg Clayton           frame->DumpUsingSettingsFormat(&frame_description);
1063a8f3ae7cSJonas Devlieghere           stack_trace = std::make_unique<llvm::PrettyStackTraceFormat>(
1064b9c1b51eSKate Stone               "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value "
1065b9c1b51eSKate Stone               "= %u) %s",
1066b9c1b51eSKate Stone               expr, options.GetFetchDynamicValue(),
1067c156427dSZachary Turner               frame_description.GetData());
1068fb6621efSGreg Clayton         }
1069fb6621efSGreg Clayton 
1070370e5dbaSPavel Labath         target->EvaluateExpression(expr, frame, expr_value_sp, options.ref());
1071e3e91517SEnrico Granata         expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
10727730b9a4SJim Ingham       }
1073c9858e4dSGreg Clayton     }
10747fdf9ef1SGreg Clayton   }
10754838131bSGreg Clayton 
107663e5fb76SJonas Devlieghere   LLDB_LOGF(expr_log,
107763e5fb76SJonas Devlieghere             "** [SBFrame::EvaluateExpression] Expression result is "
1078b9c1b51eSKate Stone             "%s, summary %s **",
1079324a1036SSaleem Abdulrasool             expr_result.GetValue(), expr_result.GetSummary());
10804838131bSGreg Clayton 
1081d232abc3SJonas Devlieghere   return expr_result;
10821d3afba3SGreg Clayton }
1083316d498bSGreg Clayton 
1084b9c1b51eSKate Stone bool SBFrame::IsInlined() {
10851755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1086baf5664fSJonas Devlieghere 
108705f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->IsInlined();
108805f75e9fSOleksiy Vyalov }
108905f75e9fSOleksiy Vyalov 
1090b9c1b51eSKate Stone bool SBFrame::IsInlined() const {
10911755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1092baf5664fSJonas Devlieghere 
1093c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1094c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1095c481c7eeSJim Ingham 
1096dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1097d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
10987730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1099b9c1b51eSKate Stone   if (target && process) {
11007fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1101b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
11027730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1103b9c1b51eSKate Stone       if (frame) {
11047fdf9ef1SGreg Clayton 
1105d9e416c0SGreg Clayton         Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1106316d498bSGreg Clayton         if (block)
1107dbb0abbfSEugene Zelenko           return block->GetContainingInlinedBlock() != nullptr;
11087730b9a4SJim Ingham       }
1109c9858e4dSGreg Clayton     }
11107fdf9ef1SGreg Clayton   }
1111316d498bSGreg Clayton   return false;
1112316d498bSGreg Clayton }
1113316d498bSGreg Clayton 
11144b36f791SVedant Kumar bool SBFrame::IsArtificial() {
11151755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1116baf5664fSJonas Devlieghere 
11174b36f791SVedant Kumar   return static_cast<const SBFrame *>(this)->IsArtificial();
11184b36f791SVedant Kumar }
11194b36f791SVedant Kumar 
11204b36f791SVedant Kumar bool SBFrame::IsArtificial() const {
11211755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1122baf5664fSJonas Devlieghere 
11234b36f791SVedant Kumar   std::unique_lock<std::recursive_mutex> lock;
11244b36f791SVedant Kumar   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
11254b36f791SVedant Kumar 
11264b36f791SVedant Kumar   StackFrame *frame = exe_ctx.GetFramePtr();
11274b36f791SVedant Kumar   if (frame)
11284b36f791SVedant Kumar     return frame->IsArtificial();
11294b36f791SVedant Kumar 
11304b36f791SVedant Kumar   return false;
11314b36f791SVedant Kumar }
11324b36f791SVedant Kumar 
1133b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() {
11341755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1135baf5664fSJonas Devlieghere 
113605f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->GetFunctionName();
113705f75e9fSOleksiy Vyalov }
113805f75e9fSOleksiy Vyalov 
1139bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const {
11401755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1141baf5664fSJonas Devlieghere 
1142bdbdd229SJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1143bdbdd229SJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1144bdbdd229SJim Ingham 
1145bdbdd229SJim Ingham   StackFrame *frame = nullptr;
1146bdbdd229SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
1147bdbdd229SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1148bdbdd229SJim Ingham   if (target && process) {
1149bdbdd229SJim Ingham     Process::StopLocker stop_locker;
1150bdbdd229SJim Ingham     if (stop_locker.TryLock(&process->GetRunLock())) {
1151bdbdd229SJim Ingham       frame = exe_ctx.GetFramePtr();
1152bdbdd229SJim Ingham       if (frame) {
1153bdbdd229SJim Ingham         return frame->GuessLanguage();
1154bdbdd229SJim Ingham       }
1155bdbdd229SJim Ingham     }
1156bdbdd229SJim Ingham   }
1157bdbdd229SJim Ingham   return eLanguageTypeUnknown;
1158bdbdd229SJim Ingham }
1159bdbdd229SJim Ingham 
1160b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const {
11611755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1162baf5664fSJonas Devlieghere 
1163dbb0abbfSEugene Zelenko   const char *name = nullptr;
1164c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1165c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1166c481c7eeSJim Ingham 
1167dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1168d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
11697730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1170b9c1b51eSKate Stone   if (target && process) {
11717fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1172b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
11737730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1174b9c1b51eSKate Stone       if (frame) {
1175b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1176b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1177b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1178b9c1b51eSKate Stone         if (sc.block) {
1179316d498bSGreg Clayton           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1180b9c1b51eSKate Stone           if (inlined_block) {
1181b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1182b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
118322b04487SAlex Langford             name = inlined_info->GetName().AsCString();
1184316d498bSGreg Clayton           }
1185316d498bSGreg Clayton         }
1186316d498bSGreg Clayton 
1187b9c1b51eSKate Stone         if (name == nullptr) {
1188316d498bSGreg Clayton           if (sc.function)
1189316d498bSGreg Clayton             name = sc.function->GetName().GetCString();
1190316d498bSGreg Clayton         }
1191316d498bSGreg Clayton 
1192b9c1b51eSKate Stone         if (name == nullptr) {
1193316d498bSGreg Clayton           if (sc.symbol)
1194316d498bSGreg Clayton             name = sc.symbol->GetName().GetCString();
1195316d498bSGreg Clayton         }
11967730b9a4SJim Ingham       }
1197c9858e4dSGreg Clayton     }
11987fdf9ef1SGreg Clayton   }
1199316d498bSGreg Clayton   return name;
1200316d498bSGreg Clayton }
1201c1f705c2SEnrico Granata 
1202b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() {
12031755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1204baf5664fSJonas Devlieghere 
1205dbb0abbfSEugene Zelenko   const char *name = nullptr;
1206c481c7eeSJim Ingham 
1207c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1208c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1209c481c7eeSJim Ingham 
1210dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1211c1f705c2SEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
1212c1f705c2SEnrico Granata   Process *process = exe_ctx.GetProcessPtr();
1213b9c1b51eSKate Stone   if (target && process) {
1214c1f705c2SEnrico Granata     Process::StopLocker stop_locker;
1215b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1216c1f705c2SEnrico Granata       frame = exe_ctx.GetFramePtr();
1217b9c1b51eSKate Stone       if (frame) {
1218b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1219b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1220b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1221b9c1b51eSKate Stone         if (sc.block) {
1222c1f705c2SEnrico Granata           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1223b9c1b51eSKate Stone           if (inlined_block) {
1224b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1225b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
122622b04487SAlex Langford             name = inlined_info->GetDisplayName().AsCString();
1227c1f705c2SEnrico Granata           }
1228c1f705c2SEnrico Granata         }
1229c1f705c2SEnrico Granata 
1230b9c1b51eSKate Stone         if (name == nullptr) {
1231c1f705c2SEnrico Granata           if (sc.function)
1232c1f705c2SEnrico Granata             name = sc.function->GetDisplayName().GetCString();
1233c1f705c2SEnrico Granata         }
1234c1f705c2SEnrico Granata 
1235b9c1b51eSKate Stone         if (name == nullptr) {
1236c1f705c2SEnrico Granata           if (sc.symbol)
1237c1f705c2SEnrico Granata             name = sc.symbol->GetDisplayName().GetCString();
1238c1f705c2SEnrico Granata         }
1239c1f705c2SEnrico Granata       }
1240c1f705c2SEnrico Granata     }
1241c1f705c2SEnrico Granata   }
1242c1f705c2SEnrico Granata   return name;
1243c1f705c2SEnrico Granata }
1244