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"
41c34698a8SPavel Labath #include "lldb/Utility/LLDBLog.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 
SBFrame()58baf5664fSJonas Devlieghere SBFrame::SBFrame() : m_opaque_sp(new ExecutionContextRef()) {
591755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
60baf5664fSJonas Devlieghere }
6130fdc8d8SChris Lattner 
SBFrame(const StackFrameSP & lldb_object_sp)62b9c1b51eSKate Stone SBFrame::SBFrame(const StackFrameSP &lldb_object_sp)
63b9c1b51eSKate Stone     : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) {
641755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, lldb_object_sp);
6530fdc8d8SChris Lattner }
6630fdc8d8SChris Lattner 
SBFrame(const SBFrame & rhs)67a3436f73SKazu Hirata SBFrame::SBFrame(const SBFrame &rhs) {
681755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
69baf5664fSJonas Devlieghere 
70bd4bf82aSJonas Devlieghere   m_opaque_sp = clone(rhs.m_opaque_sp);
71bd4bf82aSJonas Devlieghere }
72efabb123SGreg Clayton 
73dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default;
74dbb0abbfSEugene Zelenko 
operator =(const SBFrame & rhs)75b9c1b51eSKate Stone const SBFrame &SBFrame::operator=(const SBFrame &rhs) {
761755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
77baf5664fSJonas Devlieghere 
78efabb123SGreg Clayton   if (this != &rhs)
79bd4bf82aSJonas Devlieghere     m_opaque_sp = clone(rhs.m_opaque_sp);
80d232abc3SJonas Devlieghere   return *this;
81efabb123SGreg Clayton }
82efabb123SGreg Clayton 
GetFrameSP() const83b9c1b51eSKate Stone StackFrameSP SBFrame::GetFrameSP() const {
84dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetFrameSP() : StackFrameSP());
85b9556accSGreg Clayton }
8630fdc8d8SChris Lattner 
SetFrameSP(const StackFrameSP & lldb_object_sp)87b9c1b51eSKate Stone void SBFrame::SetFrameSP(const StackFrameSP &lldb_object_sp) {
887fdf9ef1SGreg Clayton   return m_opaque_sp->SetFrameSP(lldb_object_sp);
89b9556accSGreg Clayton }
9030fdc8d8SChris Lattner 
IsValid() const91b9c1b51eSKate Stone bool SBFrame::IsValid() const {
921755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
937f5237bcSPavel Labath   return this->operator bool();
947f5237bcSPavel Labath }
operator bool() const957f5237bcSPavel Labath SBFrame::operator bool() const {
961755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
97baf5664fSJonas Devlieghere 
98bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
99bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1007fa7dc36SJim Ingham 
1017fa7dc36SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
1027fa7dc36SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
103b9c1b51eSKate Stone   if (target && process) {
1047fa7dc36SJim Ingham     Process::StopLocker stop_locker;
1057fa7dc36SJim Ingham     if (stop_locker.TryLock(&process->GetRunLock()))
106dbb0abbfSEugene Zelenko       return GetFrameSP().get() != nullptr;
10730fdc8d8SChris Lattner   }
10830fdc8d8SChris Lattner 
1097fa7dc36SJim Ingham   // Without a target & process we can't have a valid stack frame.
1107fa7dc36SJim Ingham   return false;
1117fa7dc36SJim Ingham }
1127fa7dc36SJim Ingham 
GetSymbolContext(uint32_t resolve_scope) const113b9c1b51eSKate Stone SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const {
1141755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, resolve_scope);
115baf5664fSJonas Devlieghere 
11630fdc8d8SChris Lattner   SBSymbolContext sb_sym_ctx;
117bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
118bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
119991e4453SZachary Turner   SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope);
120d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1217730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
122b9c1b51eSKate Stone   if (target && process) {
1237fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
124b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1252efc6892SPavel Labath       if (StackFrame *frame = exe_ctx.GetFramePtr())
1262efc6892SPavel Labath         sb_sym_ctx = frame->GetSymbolContext(scope);
127c9858e4dSGreg Clayton     }
1287fdf9ef1SGreg Clayton   }
129ceb6b139SCaroline Tice 
130d232abc3SJonas Devlieghere   return sb_sym_ctx;
13130fdc8d8SChris Lattner }
13230fdc8d8SChris Lattner 
GetModule() const133b9c1b51eSKate Stone SBModule SBFrame::GetModule() const {
1341755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
135baf5664fSJonas Devlieghere 
13672eff18aSGreg Clayton   SBModule sb_module;
137acdbe816SGreg Clayton   ModuleSP module_sp;
138bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
139bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1404fc6cb9cSJim Ingham 
141dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
142d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1437730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
144b9c1b51eSKate Stone   if (target && process) {
1457fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
146b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1477730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
148b9c1b51eSKate Stone       if (frame) {
149d9e416c0SGreg Clayton         module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp;
150acdbe816SGreg Clayton         sb_module.SetSP(module_sp);
151c9858e4dSGreg Clayton       }
1527fdf9ef1SGreg Clayton     }
153581af8b0SJonas Devlieghere   }
1544838131bSGreg Clayton 
155d232abc3SJonas Devlieghere   return sb_module;
15630fdc8d8SChris Lattner }
15730fdc8d8SChris Lattner 
GetCompileUnit() const158b9c1b51eSKate Stone SBCompileUnit SBFrame::GetCompileUnit() const {
1591755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
160baf5664fSJonas Devlieghere 
16172eff18aSGreg Clayton   SBCompileUnit sb_comp_unit;
162bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
163bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1644fc6cb9cSJim Ingham 
165dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
166d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1677730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
168b9c1b51eSKate Stone   if (target && process) {
1697fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
170b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1717730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
172b9c1b51eSKate Stone       if (frame) {
173b9c1b51eSKate Stone         sb_comp_unit.reset(
174b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit);
175c9858e4dSGreg Clayton       }
176c9858e4dSGreg Clayton     }
177581af8b0SJonas Devlieghere   }
178ceb6b139SCaroline Tice 
179d232abc3SJonas Devlieghere   return sb_comp_unit;
18030fdc8d8SChris Lattner }
18130fdc8d8SChris Lattner 
GetFunction() const182b9c1b51eSKate Stone SBFunction SBFrame::GetFunction() const {
1831755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
184baf5664fSJonas Devlieghere 
18572eff18aSGreg Clayton   SBFunction sb_function;
186bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
187bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1884fc6cb9cSJim Ingham 
189dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
190d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1917730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
192b9c1b51eSKate Stone   if (target && process) {
1937fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
194b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1957730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
196b9c1b51eSKate Stone       if (frame) {
197b9c1b51eSKate Stone         sb_function.reset(
198b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextFunction).function);
1997fdf9ef1SGreg Clayton       }
200c9858e4dSGreg Clayton     }
201581af8b0SJonas Devlieghere   }
2024838131bSGreg Clayton 
203d232abc3SJonas Devlieghere   return sb_function;
20430fdc8d8SChris Lattner }
20530fdc8d8SChris Lattner 
GetSymbol() const206b9c1b51eSKate Stone SBSymbol SBFrame::GetSymbol() const {
2071755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
208baf5664fSJonas Devlieghere 
20972eff18aSGreg Clayton   SBSymbol sb_symbol;
210bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
211bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2124fc6cb9cSJim Ingham 
213dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
214d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2157730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
216b9c1b51eSKate Stone   if (target && process) {
2177fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
218b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2197730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
220b9c1b51eSKate Stone       if (frame) {
221d9e416c0SGreg Clayton         sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol);
2227fdf9ef1SGreg Clayton       }
223c9858e4dSGreg Clayton     }
224581af8b0SJonas Devlieghere   }
225581af8b0SJonas Devlieghere 
226d232abc3SJonas Devlieghere   return sb_symbol;
2273b06557eSGreg Clayton }
2283b06557eSGreg Clayton 
GetBlock() const229b9c1b51eSKate Stone SBBlock SBFrame::GetBlock() const {
2301755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
231baf5664fSJonas Devlieghere 
23272eff18aSGreg Clayton   SBBlock sb_block;
233bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
234bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2354fc6cb9cSJim Ingham 
236dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
237d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2387730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
239b9c1b51eSKate Stone   if (target && process) {
2407fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
241b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2427730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
243581af8b0SJonas Devlieghere       if (frame)
244d9e416c0SGreg Clayton         sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block);
2457fdf9ef1SGreg Clayton     }
246c9858e4dSGreg Clayton   }
247d232abc3SJonas Devlieghere   return sb_block;
24830fdc8d8SChris Lattner }
24930fdc8d8SChris Lattner 
GetFrameBlock() const250b9c1b51eSKate Stone SBBlock SBFrame::GetFrameBlock() const {
2511755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
252baf5664fSJonas Devlieghere 
25372eff18aSGreg Clayton   SBBlock sb_block;
254bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
255bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2564fc6cb9cSJim Ingham 
257dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
258d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2597730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
260b9c1b51eSKate Stone   if (target && process) {
2617fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
262b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2637730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
264581af8b0SJonas Devlieghere       if (frame)
265d9e416c0SGreg Clayton         sb_block.SetPtr(frame->GetFrameBlock());
2667fdf9ef1SGreg Clayton     }
267c9858e4dSGreg Clayton   }
268d232abc3SJonas Devlieghere   return sb_block;
26995897c6aSGreg Clayton }
27095897c6aSGreg Clayton 
GetLineEntry() const271b9c1b51eSKate Stone SBLineEntry SBFrame::GetLineEntry() const {
2721755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
273baf5664fSJonas Devlieghere 
27472eff18aSGreg Clayton   SBLineEntry sb_line_entry;
275bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
276bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2774fc6cb9cSJim Ingham 
278dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
279d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2807730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
281b9c1b51eSKate Stone   if (target && process) {
2827fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
283b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2847730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
285b9c1b51eSKate Stone       if (frame) {
286b9c1b51eSKate Stone         sb_line_entry.SetLineEntry(
287b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextLineEntry).line_entry);
2887fdf9ef1SGreg Clayton       }
289c9858e4dSGreg Clayton     }
290581af8b0SJonas Devlieghere   }
291d232abc3SJonas Devlieghere   return sb_line_entry;
29230fdc8d8SChris Lattner }
29330fdc8d8SChris Lattner 
GetFrameID() const294b9c1b51eSKate Stone uint32_t SBFrame::GetFrameID() const {
2951755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
296baf5664fSJonas Devlieghere 
297b9556accSGreg Clayton   uint32_t frame_idx = UINT32_MAX;
298b9556accSGreg Clayton 
299c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
300c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
301c481c7eeSJim Ingham 
302b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
3037fdf9ef1SGreg Clayton   if (frame)
304d9e416c0SGreg Clayton     frame_idx = frame->GetFrameIndex();
3054838131bSGreg Clayton 
3064838131bSGreg Clayton   return frame_idx;
30730fdc8d8SChris Lattner }
30830fdc8d8SChris Lattner 
GetCFA() const309b9c1b51eSKate Stone lldb::addr_t SBFrame::GetCFA() const {
3101755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
311baf5664fSJonas Devlieghere 
312c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
313c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
314c481c7eeSJim Ingham 
315424a5dbcSGreg Clayton   StackFrame *frame = exe_ctx.GetFramePtr();
316424a5dbcSGreg Clayton   if (frame)
317424a5dbcSGreg Clayton     return frame->GetStackID().GetCallFrameAddress();
318424a5dbcSGreg Clayton   return LLDB_INVALID_ADDRESS;
319424a5dbcSGreg Clayton }
320424a5dbcSGreg Clayton 
GetPC() const321b9c1b51eSKate Stone addr_t SBFrame::GetPC() const {
3221755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
323baf5664fSJonas Devlieghere 
32469b582faSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
325bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
326bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3274fc6cb9cSJim Ingham 
328dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
329d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3307730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
331b9c1b51eSKate Stone   if (target && process) {
3327fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
333b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3347730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
335b9c1b51eSKate Stone       if (frame) {
336b9c1b51eSKate Stone         addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress(
33704803b3eSTatyana Krasnukha             target, AddressClass::eCode);
338c9858e4dSGreg Clayton       }
3397fdf9ef1SGreg Clayton     }
340581af8b0SJonas Devlieghere   }
341ceb6b139SCaroline Tice 
342ceb6b139SCaroline Tice   return addr;
34330fdc8d8SChris Lattner }
34430fdc8d8SChris Lattner 
SetPC(addr_t new_pc)345b9c1b51eSKate Stone bool SBFrame::SetPC(addr_t new_pc) {
3461755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, new_pc);
347baf5664fSJonas Devlieghere 
348ceb6b139SCaroline Tice   bool ret_val = false;
349bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
350bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3514fc6cb9cSJim Ingham 
352d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3537730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
354b9c1b51eSKate Stone   if (target && process) {
3557fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
356b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3570d7401cfSMed Ismail Bennani       if (StackFrame *frame = exe_ctx.GetFramePtr()) {
3580d7401cfSMed Ismail Bennani         if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
3590d7401cfSMed Ismail Bennani           ret_val = reg_ctx_sp->SetPC(new_pc);
3600d7401cfSMed Ismail Bennani         }
361c9858e4dSGreg Clayton       }
3627fdf9ef1SGreg Clayton     }
363581af8b0SJonas Devlieghere   }
364ceb6b139SCaroline Tice 
365ceb6b139SCaroline Tice   return ret_val;
36630fdc8d8SChris Lattner }
36730fdc8d8SChris Lattner 
GetSP() const368b9c1b51eSKate Stone addr_t SBFrame::GetSP() const {
3691755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
370baf5664fSJonas Devlieghere 
3714838131bSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
372bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
373bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3744fc6cb9cSJim Ingham 
375d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3767730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
377b9c1b51eSKate Stone   if (target && process) {
3787fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
379b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3800d7401cfSMed Ismail Bennani       if (StackFrame *frame = exe_ctx.GetFramePtr()) {
3810d7401cfSMed Ismail Bennani         if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
3820d7401cfSMed Ismail Bennani           addr = reg_ctx_sp->GetSP();
3830d7401cfSMed Ismail Bennani         }
3847fdf9ef1SGreg Clayton       }
385c9858e4dSGreg Clayton     }
386581af8b0SJonas Devlieghere   }
3874838131bSGreg Clayton 
3884838131bSGreg Clayton   return addr;
38930fdc8d8SChris Lattner }
39030fdc8d8SChris Lattner 
GetFP() const391b9c1b51eSKate Stone addr_t SBFrame::GetFP() const {
3921755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
393baf5664fSJonas Devlieghere 
39469b582faSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
395bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
396bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3974fc6cb9cSJim Ingham 
398d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3997730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
400b9c1b51eSKate Stone   if (target && process) {
4017fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
402b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4030d7401cfSMed Ismail Bennani       if (StackFrame *frame = exe_ctx.GetFramePtr()) {
4040d7401cfSMed Ismail Bennani         if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
4050d7401cfSMed Ismail Bennani           addr = reg_ctx_sp->GetFP();
4060d7401cfSMed Ismail Bennani         }
4070d7401cfSMed Ismail Bennani       }
408c9858e4dSGreg Clayton     }
4097fdf9ef1SGreg Clayton   }
410ceb6b139SCaroline Tice 
411ceb6b139SCaroline Tice   return addr;
41230fdc8d8SChris Lattner }
41330fdc8d8SChris Lattner 
GetPCAddress() const414b9c1b51eSKate Stone SBAddress SBFrame::GetPCAddress() const {
4151755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
416baf5664fSJonas Devlieghere 
41730fdc8d8SChris Lattner   SBAddress sb_addr;
418bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
419bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4204fc6cb9cSJim Ingham 
421b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
422d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4237730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
424b9c1b51eSKate Stone   if (target && process) {
4257fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
426b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4277730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
428581af8b0SJonas Devlieghere       if (frame)
4296cd4a4cdSJonas Devlieghere         sb_addr.SetAddress(frame->GetFrameCodeAddress());
4307fdf9ef1SGreg Clayton     }
431c9858e4dSGreg Clayton   }
432d232abc3SJonas Devlieghere   return sb_addr;
43330fdc8d8SChris Lattner }
43430fdc8d8SChris Lattner 
Clear()435baf5664fSJonas Devlieghere void SBFrame::Clear() {
4361755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
437baf5664fSJonas Devlieghere 
438baf5664fSJonas Devlieghere   m_opaque_sp->Clear();
439baf5664fSJonas Devlieghere }
44030fdc8d8SChris Lattner 
GetValueForVariablePath(const char * var_path)441b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) {
4421755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, var_path);
443baf5664fSJonas Devlieghere 
4447edbdfc9SGreg Clayton   SBValue sb_value;
445c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
446c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
447c481c7eeSJim Ingham 
448b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
449d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
450b9c1b51eSKate Stone   if (frame && target) {
451b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
452b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
4537edbdfc9SGreg Clayton     sb_value = GetValueForVariablePath(var_path, use_dynamic);
4547edbdfc9SGreg Clayton   }
455d232abc3SJonas Devlieghere   return sb_value;
4567edbdfc9SGreg Clayton }
4577edbdfc9SGreg Clayton 
GetValueForVariablePath(const char * var_path,DynamicValueType use_dynamic)458b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path,
459b9c1b51eSKate Stone                                                DynamicValueType use_dynamic) {
4601755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, var_path, use_dynamic);
461baf5664fSJonas Devlieghere 
4627edbdfc9SGreg Clayton   SBValue sb_value;
463b9c1b51eSKate Stone   if (var_path == nullptr || var_path[0] == '\0') {
464d232abc3SJonas Devlieghere     return sb_value;
4657730b9a4SJim Ingham   }
4667730b9a4SJim Ingham 
467bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
468bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4694fc6cb9cSJim Ingham 
470dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
471d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4727730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
473b9c1b51eSKate Stone   if (target && process) {
4747fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
475b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4767730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
477b9c1b51eSKate Stone       if (frame) {
4787edbdfc9SGreg Clayton         VariableSP var_sp;
47997206d57SZachary Turner         Status error;
480b9c1b51eSKate Stone         ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath(
481b9c1b51eSKate Stone             var_path, eNoDynamicValues,
482b9c1b51eSKate Stone             StackFrame::eExpressionPathOptionCheckPtrVsMember |
483b9c1b51eSKate Stone                 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
484b9c1b51eSKate Stone             var_sp, error));
485e3e91517SEnrico Granata         sb_value.SetSP(value_sp, use_dynamic);
4867730b9a4SJim Ingham       }
487c9858e4dSGreg Clayton     }
4887fdf9ef1SGreg Clayton   }
489d232abc3SJonas Devlieghere   return sb_value;
4907edbdfc9SGreg Clayton }
4917edbdfc9SGreg Clayton 
FindVariable(const char * name)492b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name) {
4931755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, name);
494baf5664fSJonas Devlieghere 
495316d498bSGreg Clayton   SBValue value;
496c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
497c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
498c481c7eeSJim Ingham 
499b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
500d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
501b9c1b51eSKate Stone   if (frame && target) {
502b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
503b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
504316d498bSGreg Clayton     value = FindVariable(name, use_dynamic);
505316d498bSGreg Clayton   }
506d232abc3SJonas Devlieghere   return value;
50778a685aaSJim Ingham }
50878a685aaSJim Ingham 
FindVariable(const char * name,lldb::DynamicValueType use_dynamic)509b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name,
510b9c1b51eSKate Stone                               lldb::DynamicValueType use_dynamic) {
5111755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, name, use_dynamic);
512baf5664fSJonas Devlieghere 
51369b582faSGreg Clayton   VariableSP var_sp;
51458b59f95SJim Ingham   SBValue sb_value;
5157730b9a4SJim Ingham 
516b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
517d232abc3SJonas Devlieghere     return sb_value;
5187730b9a4SJim Ingham   }
5197730b9a4SJim Ingham 
52081e871edSGreg Clayton   ValueObjectSP value_sp;
521bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
522bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5234fc6cb9cSJim Ingham 
524dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
525d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5267730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
527b9c1b51eSKate Stone   if (target && process) {
5287fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
529b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5307730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
531b9c1b51eSKate Stone       if (frame) {
532e23d0b63SShafik Yaghmour         value_sp = frame->FindVariable(ConstString(name));
53330fdc8d8SChris Lattner 
534e23d0b63SShafik Yaghmour         if (value_sp)
535e3e91517SEnrico Granata           sb_value.SetSP(value_sp, use_dynamic);
536c9858e4dSGreg Clayton       }
537316d498bSGreg Clayton     }
538581af8b0SJonas Devlieghere   }
5394838131bSGreg Clayton 
540d232abc3SJonas Devlieghere   return sb_value;
541dde9cff3SCaroline Tice }
542dde9cff3SCaroline Tice 
FindValue(const char * name,ValueType value_type)543b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) {
5441755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, name, value_type);
545baf5664fSJonas Devlieghere 
546316d498bSGreg Clayton   SBValue value;
547c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
548c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
549c481c7eeSJim Ingham 
550b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
551d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
552b9c1b51eSKate Stone   if (frame && target) {
553b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
554b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
555316d498bSGreg Clayton     value = FindValue(name, value_type, use_dynamic);
556316d498bSGreg Clayton   }
557d232abc3SJonas Devlieghere   return value;
55878a685aaSJim Ingham }
55978a685aaSJim Ingham 
FindValue(const char * name,ValueType value_type,lldb::DynamicValueType use_dynamic)560b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type,
561b9c1b51eSKate Stone                            lldb::DynamicValueType use_dynamic) {
5621755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, name, value_type, use_dynamic);
563baf5664fSJonas Devlieghere 
56469b582faSGreg Clayton   SBValue sb_value;
5657730b9a4SJim Ingham 
566b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
567d232abc3SJonas Devlieghere     return sb_value;
5687730b9a4SJim Ingham   }
5697730b9a4SJim Ingham 
57081e871edSGreg Clayton   ValueObjectSP value_sp;
571bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
572bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5734fc6cb9cSJim Ingham 
574dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
575d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5767730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
577b9c1b51eSKate Stone   if (target && process) {
5787fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
579b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5807730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
581b9c1b51eSKate Stone       if (frame) {
5828a2a0dfbSEnrico Granata         VariableList variable_list;
5838a2a0dfbSEnrico Granata 
584b9c1b51eSKate Stone         switch (value_type) {
58569b582faSGreg Clayton         case eValueTypeVariableGlobal:      // global variable
58669b582faSGreg Clayton         case eValueTypeVariableStatic:      // static variable
58769b582faSGreg Clayton         case eValueTypeVariableArgument:    // function argument variables
58869b582faSGreg Clayton         case eValueTypeVariableLocal:       // function local variables
58963a27afaSGreg Clayton         case eValueTypeVariableThreadLocal: // thread local variables
59069b582faSGreg Clayton         {
591d9e416c0SGreg Clayton           SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock));
59272eff18aSGreg Clayton 
59372eff18aSGreg Clayton           const bool can_create = true;
59472eff18aSGreg Clayton           const bool get_parent_variables = true;
59572eff18aSGreg Clayton           const bool stop_if_block_is_inlined_function = true;
59672eff18aSGreg Clayton 
5970efb51a0SChaoren Lin           if (sc.block)
598b9c1b51eSKate Stone             sc.block->AppendVariables(
599b9c1b51eSKate Stone                 can_create, get_parent_variables,
600b9c1b51eSKate Stone                 stop_if_block_is_inlined_function,
601b9c1b51eSKate Stone                 [frame](Variable *v) { return v->IsInScope(frame); },
602b9c1b51eSKate Stone                 &variable_list);
603b9c1b51eSKate Stone           if (value_type == eValueTypeVariableGlobal) {
6048a2a0dfbSEnrico Granata             const bool get_file_globals = true;
6058a2a0dfbSEnrico Granata             VariableList *frame_vars = frame->GetVariableList(get_file_globals);
6068a2a0dfbSEnrico Granata             if (frame_vars)
6078a2a0dfbSEnrico Granata               frame_vars->AppendVariablesIfUnique(variable_list);
6088a2a0dfbSEnrico Granata           }
60969b582faSGreg Clayton           ConstString const_name(name);
610b9c1b51eSKate Stone           VariableSP variable_sp(
611b9c1b51eSKate Stone               variable_list.FindVariable(const_name, value_type));
612b9c1b51eSKate Stone           if (variable_sp) {
613b9c1b51eSKate Stone             value_sp = frame->GetValueObjectForFrameVariable(variable_sp,
614b9c1b51eSKate Stone                                                              eNoDynamicValues);
615e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
61630fdc8d8SChris Lattner           }
617b9c1b51eSKate Stone         } break;
61869b582faSGreg Clayton 
61969b582faSGreg Clayton         case eValueTypeRegister: // stack frame register value
62069b582faSGreg Clayton         {
621d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
622b9c1b51eSKate Stone           if (reg_ctx) {
6238567f4d4SMichał Górny             if (const RegisterInfo *reg_info =
6248567f4d4SMichał Górny                     reg_ctx->GetRegisterInfoByName(name)) {
6258567f4d4SMichał Górny               value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_info);
62681e871edSGreg Clayton               sb_value.SetSP(value_sp);
62769b582faSGreg Clayton             }
62869b582faSGreg Clayton           }
629b9c1b51eSKate Stone         } break;
63069b582faSGreg Clayton 
631b9c1b51eSKate Stone         case eValueTypeRegisterSet: // A collection of stack frame register
632b9c1b51eSKate Stone                                     // values
63369b582faSGreg Clayton         {
634d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
635b9c1b51eSKate Stone           if (reg_ctx) {
63669b582faSGreg Clayton             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
637b9c1b51eSKate Stone             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
63869b582faSGreg Clayton               const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx);
63969b582faSGreg Clayton               if (reg_set &&
640*13a3b0bbSPavel Labath                   (llvm::StringRef(reg_set->name).equals_insensitive(name) ||
641*13a3b0bbSPavel Labath                    llvm::StringRef(reg_set->short_name)
642*13a3b0bbSPavel Labath                        .equals_insensitive(name))) {
643b9c1b51eSKate Stone                 value_sp =
644b9c1b51eSKate Stone                     ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx);
64581e871edSGreg Clayton                 sb_value.SetSP(value_sp);
64681e871edSGreg Clayton                 break;
64769b582faSGreg Clayton               }
64869b582faSGreg Clayton             }
64969b582faSGreg Clayton           }
650b9c1b51eSKate Stone         } break;
65169b582faSGreg Clayton 
65269b582faSGreg Clayton         case eValueTypeConstResult: // constant result variables
65369b582faSGreg Clayton         {
65469b582faSGreg Clayton           ConstString const_name(name);
655b9c1b51eSKate Stone           ExpressionVariableSP expr_var_sp(
656b9c1b51eSKate Stone               target->GetPersistentVariable(const_name));
657b9c1b51eSKate Stone           if (expr_var_sp) {
65881e871edSGreg Clayton             value_sp = expr_var_sp->GetValueObject();
659e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
66081e871edSGreg Clayton           }
661b9c1b51eSKate Stone         } break;
66269b582faSGreg Clayton 
66369b582faSGreg Clayton         default:
66469b582faSGreg Clayton           break;
66569b582faSGreg Clayton         }
666c9858e4dSGreg Clayton       }
6677fdf9ef1SGreg Clayton     }
668581af8b0SJonas Devlieghere   }
6694838131bSGreg Clayton 
670d232abc3SJonas Devlieghere   return sb_value;
671dde9cff3SCaroline Tice }
672dde9cff3SCaroline Tice 
IsEqual(const SBFrame & that) const673b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const {
6741755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, that);
675baf5664fSJonas Devlieghere 
676b57e4a1bSJason Molenda   lldb::StackFrameSP this_sp = GetFrameSP();
677b57e4a1bSJason Molenda   lldb::StackFrameSP that_sp = that.GetFrameSP();
67835e2ab60SJohnny Chen   return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
67935e2ab60SJohnny Chen }
68035e2ab60SJohnny Chen 
operator ==(const SBFrame & rhs) const681baf5664fSJonas Devlieghere bool SBFrame::operator==(const SBFrame &rhs) const {
6821755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
68330fdc8d8SChris Lattner 
684baf5664fSJonas Devlieghere   return IsEqual(rhs);
685baf5664fSJonas Devlieghere }
686baf5664fSJonas Devlieghere 
operator !=(const SBFrame & rhs) const687baf5664fSJonas Devlieghere bool SBFrame::operator!=(const SBFrame &rhs) const {
6881755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
689baf5664fSJonas Devlieghere 
690baf5664fSJonas Devlieghere   return !IsEqual(rhs);
691baf5664fSJonas Devlieghere }
69230fdc8d8SChris Lattner 
GetThread() const693b9c1b51eSKate Stone SBThread SBFrame::GetThread() const {
6941755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
695baf5664fSJonas Devlieghere 
696c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
697c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
698c481c7eeSJim Ingham 
699d9e416c0SGreg Clayton   ThreadSP thread_sp(exe_ctx.GetThreadSP());
700d9e416c0SGreg Clayton   SBThread sb_thread(thread_sp);
701ceb6b139SCaroline Tice 
702d232abc3SJonas Devlieghere   return sb_thread;
70330fdc8d8SChris Lattner }
70430fdc8d8SChris Lattner 
Disassemble() const705b9c1b51eSKate Stone const char *SBFrame::Disassemble() const {
7061755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
707baf5664fSJonas Devlieghere 
708dbb0abbfSEugene Zelenko   const char *disassembly = nullptr;
709bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
710bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
7114fc6cb9cSJim Ingham 
712dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
713d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
7147730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
715b9c1b51eSKate Stone   if (target && process) {
7167fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
717b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
7187730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
719b9c1b51eSKate Stone       if (frame) {
720d9e416c0SGreg Clayton         disassembly = frame->Disassemble();
7217fdf9ef1SGreg Clayton       }
722c9858e4dSGreg Clayton     }
723581af8b0SJonas Devlieghere   }
7244838131bSGreg Clayton 
7254838131bSGreg Clayton   return disassembly;
72630fdc8d8SChris Lattner }
72730fdc8d8SChris Lattner 
GetVariables(bool arguments,bool locals,bool statics,bool in_scope_only)728b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics,
729b9c1b51eSKate Stone                                   bool in_scope_only) {
7301755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, arguments, locals, statics, in_scope_only);
731baf5664fSJonas Devlieghere 
732316d498bSGreg Clayton   SBValueList value_list;
733c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
734c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
735c481c7eeSJim Ingham 
736b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
737d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
738b9c1b51eSKate Stone   if (frame && target) {
739b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
740b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
741b9c1b51eSKate Stone     const bool include_runtime_support_values =
742b9c1b51eSKate Stone         target ? target->GetDisplayRuntimeSupportValues() : false;
74351f96eebSZachary Turner 
74451f96eebSZachary Turner     SBVariablesOptions options;
74551f96eebSZachary Turner     options.SetIncludeArguments(arguments);
74651f96eebSZachary Turner     options.SetIncludeLocals(locals);
74751f96eebSZachary Turner     options.SetIncludeStatics(statics);
74851f96eebSZachary Turner     options.SetInScopeOnly(in_scope_only);
74951f96eebSZachary Turner     options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
75051f96eebSZachary Turner     options.SetUseDynamic(use_dynamic);
75151f96eebSZachary Turner 
75251f96eebSZachary Turner     value_list = GetVariables(options);
753316d498bSGreg Clayton   }
754d232abc3SJonas Devlieghere   return value_list;
75578a685aaSJim Ingham }
75678a685aaSJim Ingham 
GetVariables(bool arguments,bool locals,bool statics,bool in_scope_only,lldb::DynamicValueType use_dynamic)757b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals,
758b9c1b51eSKate Stone                                         bool statics, bool in_scope_only,
759b9c1b51eSKate Stone                                         lldb::DynamicValueType use_dynamic) {
7601755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, arguments, locals, statics, in_scope_only,
7611755f5b1SJonas Devlieghere                      use_dynamic);
762baf5664fSJonas Devlieghere 
763c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
764c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
765c481c7eeSJim Ingham 
766560558ebSEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
767b9c1b51eSKate Stone   const bool include_runtime_support_values =
768b9c1b51eSKate Stone       target ? target->GetDisplayRuntimeSupportValues() : false;
76951f96eebSZachary Turner   SBVariablesOptions options;
77051f96eebSZachary Turner   options.SetIncludeArguments(arguments);
77151f96eebSZachary Turner   options.SetIncludeLocals(locals);
77251f96eebSZachary Turner   options.SetIncludeStatics(statics);
77351f96eebSZachary Turner   options.SetInScopeOnly(in_scope_only);
77451f96eebSZachary Turner   options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
77551f96eebSZachary Turner   options.SetUseDynamic(use_dynamic);
776d232abc3SJonas Devlieghere   return GetVariables(options);
777560558ebSEnrico Granata }
778560558ebSEnrico Granata 
GetVariables(const lldb::SBVariablesOptions & options)779b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) {
7801755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, options);
781baf5664fSJonas Devlieghere 
782b9556accSGreg Clayton   SBValueList value_list;
783bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
784bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
7854fc6cb9cSJim Ingham 
786dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
787d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
788b9556accSGreg Clayton 
78951f96eebSZachary Turner   const bool statics = options.GetIncludeStatics();
79051f96eebSZachary Turner   const bool arguments = options.GetIncludeArguments();
7914c7f5d5cSKuba Mracek   const bool recognized_arguments =
7924c7f5d5cSKuba Mracek         options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP()));
79351f96eebSZachary Turner   const bool locals = options.GetIncludeLocals();
79451f96eebSZachary Turner   const bool in_scope_only = options.GetInScopeOnly();
795b9c1b51eSKate Stone   const bool include_runtime_support_values =
796b9c1b51eSKate Stone       options.GetIncludeRuntimeSupportValues();
79751f96eebSZachary Turner   const lldb::DynamicValueType use_dynamic = options.GetUseDynamic();
79851f96eebSZachary Turner 
799ceb6b139SCaroline Tice 
800349213f9SGreg Clayton   std::set<VariableSP> variable_set;
8017730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
802b9c1b51eSKate Stone   if (target && process) {
8037fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
804b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
8057730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
806b9c1b51eSKate Stone       if (frame) {
807dbb0abbfSEugene Zelenko         VariableList *variable_list = nullptr;
808d9e416c0SGreg Clayton         variable_list = frame->GetVariableList(true);
809b9c1b51eSKate Stone         if (variable_list) {
81030fdc8d8SChris Lattner           const size_t num_variables = variable_list->GetSize();
811b9c1b51eSKate Stone           if (num_variables) {
812d1782133SRaphael Isemann             for (const VariableSP &variable_sp : *variable_list) {
813b9c1b51eSKate Stone               if (variable_sp) {
81430fdc8d8SChris Lattner                 bool add_variable = false;
815b9c1b51eSKate Stone                 switch (variable_sp->GetScope()) {
81630fdc8d8SChris Lattner                 case eValueTypeVariableGlobal:
81730fdc8d8SChris Lattner                 case eValueTypeVariableStatic:
81863a27afaSGreg Clayton                 case eValueTypeVariableThreadLocal:
81930fdc8d8SChris Lattner                   add_variable = statics;
82030fdc8d8SChris Lattner                   break;
82130fdc8d8SChris Lattner 
82230fdc8d8SChris Lattner                 case eValueTypeVariableArgument:
82330fdc8d8SChris Lattner                   add_variable = arguments;
82430fdc8d8SChris Lattner                   break;
82530fdc8d8SChris Lattner 
82630fdc8d8SChris Lattner                 case eValueTypeVariableLocal:
82730fdc8d8SChris Lattner                   add_variable = locals;
82830fdc8d8SChris Lattner                   break;
829c982c768SGreg Clayton 
830c982c768SGreg Clayton                 default:
831c982c768SGreg Clayton                   break;
83230fdc8d8SChris Lattner                 }
833b9c1b51eSKate Stone                 if (add_variable) {
834349213f9SGreg Clayton                   // Only add variables once so we don't end up with duplicates
835349213f9SGreg Clayton                   if (variable_set.find(variable_sp) == variable_set.end())
836349213f9SGreg Clayton                     variable_set.insert(variable_sp);
837349213f9SGreg Clayton                   else
838349213f9SGreg Clayton                     continue;
839349213f9SGreg Clayton 
840d9e416c0SGreg Clayton                   if (in_scope_only && !variable_sp->IsInScope(frame))
84130fdc8d8SChris Lattner                     continue;
84230fdc8d8SChris Lattner 
843b9c1b51eSKate Stone                   ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable(
844b9c1b51eSKate Stone                       variable_sp, eNoDynamicValues));
845560558ebSEnrico Granata 
846b9c1b51eSKate Stone                   if (!include_runtime_support_values && valobj_sp != nullptr &&
847dbb0abbfSEugene Zelenko                       valobj_sp->IsRuntimeSupportValue())
848560558ebSEnrico Granata                     continue;
849560558ebSEnrico Granata 
850e3e91517SEnrico Granata                   SBValue value_sb;
851e3e91517SEnrico Granata                   value_sb.SetSP(valobj_sp, use_dynamic);
852e3e91517SEnrico Granata                   value_list.Append(value_sb);
85330fdc8d8SChris Lattner                 }
85430fdc8d8SChris Lattner               }
85530fdc8d8SChris Lattner             }
85630fdc8d8SChris Lattner           }
85730fdc8d8SChris Lattner         }
85841ae8e74SKuba Mracek         if (recognized_arguments) {
85941ae8e74SKuba Mracek           auto recognized_frame = frame->GetRecognizedFrame();
86041ae8e74SKuba Mracek           if (recognized_frame) {
86141ae8e74SKuba Mracek             ValueObjectListSP recognized_arg_list =
86241ae8e74SKuba Mracek                 recognized_frame->GetRecognizedArguments();
86341ae8e74SKuba Mracek             if (recognized_arg_list) {
86441ae8e74SKuba Mracek               for (auto &rec_value_sp : recognized_arg_list->GetObjects()) {
86541ae8e74SKuba Mracek                 SBValue value_sb;
86641ae8e74SKuba Mracek                 value_sb.SetSP(rec_value_sp, use_dynamic);
86741ae8e74SKuba Mracek                 value_list.Append(value_sb);
86841ae8e74SKuba Mracek               }
86941ae8e74SKuba Mracek             }
87041ae8e74SKuba Mracek           }
87141ae8e74SKuba Mracek         }
872c9858e4dSGreg Clayton       }
8737fdf9ef1SGreg Clayton     }
874581af8b0SJonas Devlieghere   }
875ceb6b139SCaroline Tice 
876d232abc3SJonas Devlieghere   return value_list;
87730fdc8d8SChris Lattner }
87830fdc8d8SChris Lattner 
GetRegisters()879b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() {
8801755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
881baf5664fSJonas Devlieghere 
88230fdc8d8SChris Lattner   SBValueList value_list;
883bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
884bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
8854fc6cb9cSJim Ingham 
886dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
887d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
8887730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
889b9c1b51eSKate Stone   if (target && process) {
8907fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
891b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
8927730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
893b9c1b51eSKate Stone       if (frame) {
894d9e416c0SGreg Clayton         RegisterContextSP reg_ctx(frame->GetRegisterContext());
895b9c1b51eSKate Stone         if (reg_ctx) {
89630fdc8d8SChris Lattner           const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
897b9c1b51eSKate Stone           for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
898b9c1b51eSKate Stone             value_list.Append(
899b9c1b51eSKate Stone                 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx));
90030fdc8d8SChris Lattner           }
90130fdc8d8SChris Lattner         }
902c9858e4dSGreg Clayton       }
9037fdf9ef1SGreg Clayton     }
904581af8b0SJonas Devlieghere   }
905ceb6b139SCaroline Tice 
906d232abc3SJonas Devlieghere   return value_list;
90730fdc8d8SChris Lattner }
90830fdc8d8SChris Lattner 
FindRegister(const char * name)909b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) {
9101755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, name);
911baf5664fSJonas Devlieghere 
912ad9a53c5SJason Molenda   SBValue result;
913ad9a53c5SJason Molenda   ValueObjectSP value_sp;
914bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
915bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
916ad9a53c5SJason Molenda 
917dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
918ad9a53c5SJason Molenda   Target *target = exe_ctx.GetTargetPtr();
919ad9a53c5SJason Molenda   Process *process = exe_ctx.GetProcessPtr();
920b9c1b51eSKate Stone   if (target && process) {
921ad9a53c5SJason Molenda     Process::StopLocker stop_locker;
922b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
923ad9a53c5SJason Molenda       frame = exe_ctx.GetFramePtr();
924b9c1b51eSKate Stone       if (frame) {
925ad9a53c5SJason Molenda         RegisterContextSP reg_ctx(frame->GetRegisterContext());
926b9c1b51eSKate Stone         if (reg_ctx) {
9278567f4d4SMichał Górny           if (const RegisterInfo *reg_info =
9288567f4d4SMichał Górny                   reg_ctx->GetRegisterInfoByName(name)) {
9298567f4d4SMichał Górny             value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_info);
930ad9a53c5SJason Molenda             result.SetSP(value_sp);
931ad9a53c5SJason Molenda           }
932ad9a53c5SJason Molenda         }
933ad9a53c5SJason Molenda       }
934ad9a53c5SJason Molenda     }
935581af8b0SJonas Devlieghere   }
936ad9a53c5SJason Molenda 
937d232abc3SJonas Devlieghere   return result;
938ad9a53c5SJason Molenda }
939ad9a53c5SJason Molenda 
GetDescription(SBStream & description)940b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) {
9411755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, description);
942baf5664fSJonas Devlieghere 
943da7bc7d0SGreg Clayton   Stream &strm = description.ref();
944da7bc7d0SGreg Clayton 
945bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
946bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
9474fc6cb9cSJim Ingham 
948b57e4a1bSJason Molenda   StackFrame *frame;
949d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
9507730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
951b9c1b51eSKate Stone   if (target && process) {
9527fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
953b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
9547730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
955b9c1b51eSKate Stone       if (frame) {
956d9e416c0SGreg Clayton         frame->DumpUsingSettingsFormat(&strm);
9577730b9a4SJim Ingham       }
958c9858e4dSGreg Clayton     }
959c9858e4dSGreg Clayton 
960b9c1b51eSKate Stone   } else
961da7bc7d0SGreg Clayton     strm.PutCString("No value");
962dde9cff3SCaroline Tice 
963dde9cff3SCaroline Tice   return true;
964dde9cff3SCaroline Tice }
9651d3afba3SGreg Clayton 
EvaluateExpression(const char * expr)966b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) {
9671755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, expr);
968baf5664fSJonas Devlieghere 
969316d498bSGreg Clayton   SBValue result;
970c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
971c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
972c481c7eeSJim Ingham 
973b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
974d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
975b9c1b51eSKate Stone   if (frame && target) {
97635e1bda6SJim Ingham     SBExpressionOptions options;
977b9c1b51eSKate Stone     lldb::DynamicValueType fetch_dynamic_value =
978b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
979cced1566SGreg Clayton     options.SetFetchDynamicValue(fetch_dynamic_value);
98035e1bda6SJim Ingham     options.SetUnwindOnError(true);
98124785bd0SEugene Leviant     options.SetIgnoreBreakpoints(true);
982998c8a1cSRyan Brown     if (target->GetLanguage() != eLanguageTypeUnknown)
983998c8a1cSRyan Brown       options.SetLanguage(target->GetLanguage());
984998c8a1cSRyan Brown     else
985998c8a1cSRyan Brown       options.SetLanguage(frame->GetLanguage());
986d232abc3SJonas Devlieghere     return EvaluateExpression(expr, options);
987316d498bSGreg Clayton   }
988d232abc3SJonas Devlieghere   return result;
98978a685aaSJim Ingham }
99078a685aaSJim Ingham 
99178a685aaSJim Ingham SBValue
EvaluateExpression(const char * expr,lldb::DynamicValueType fetch_dynamic_value)992b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr,
993b9c1b51eSKate Stone                             lldb::DynamicValueType fetch_dynamic_value) {
9941755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, expr, fetch_dynamic_value);
995baf5664fSJonas Devlieghere 
99635e1bda6SJim Ingham   SBExpressionOptions options;
997cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
99835e1bda6SJim Ingham   options.SetUnwindOnError(true);
99924785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1000c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1001c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1002c481c7eeSJim Ingham 
1003998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1004998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1005998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1006998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1007998c8a1cSRyan Brown   else if (frame)
1008998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
1009d232abc3SJonas Devlieghere   return EvaluateExpression(expr, options);
10107ba6e991SJim Ingham }
10117ba6e991SJim Ingham 
EvaluateExpression(const char * expr,lldb::DynamicValueType fetch_dynamic_value,bool unwind_on_error)1012b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr,
1013b9c1b51eSKate Stone                                     lldb::DynamicValueType fetch_dynamic_value,
1014b9c1b51eSKate Stone                                     bool unwind_on_error) {
10151755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, expr, fetch_dynamic_value, unwind_on_error);
1016baf5664fSJonas Devlieghere 
101735e1bda6SJim Ingham   SBExpressionOptions options;
1018c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1019c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1020c481c7eeSJim Ingham 
1021cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
102235e1bda6SJim Ingham   options.SetUnwindOnError(unwind_on_error);
102324785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1024998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1025998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1026998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1027998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1028998c8a1cSRyan Brown   else if (frame)
1029998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
1030d232abc3SJonas Devlieghere   return EvaluateExpression(expr, options);
103135e1bda6SJim Ingham }
103235e1bda6SJim Ingham 
EvaluateExpression(const char * expr,const SBExpressionOptions & options)1033b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr,
1034b9c1b51eSKate Stone                                           const SBExpressionOptions &options) {
10351755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, expr, options);
1036baf5664fSJonas Devlieghere 
1037a007a6d8SPavel Labath   Log *expr_log = GetLog(LLDBLog::Expressions);
1038a162ebafSSean Callanan 
103969b582faSGreg Clayton   SBValue expr_result;
10407730b9a4SJim Ingham 
1041b9c1b51eSKate Stone   if (expr == nullptr || expr[0] == '\0') {
1042d232abc3SJonas Devlieghere     return expr_result;
10437730b9a4SJim Ingham   }
10447730b9a4SJim Ingham 
104581e871edSGreg Clayton   ValueObjectSP expr_value_sp;
10464838131bSGreg Clayton 
1047bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1048bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
10494fc6cb9cSJim Ingham 
1050b9556accSGreg Clayton 
1051dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
10527730b9a4SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
10537730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
10547730b9a4SJim Ingham 
1055b9c1b51eSKate Stone   if (target && process) {
10567fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1057b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
10587730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1059b9c1b51eSKate Stone       if (frame) {
10608f7db52dSJim Ingham         std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace;
1061b9c1b51eSKate Stone         if (target->GetDisplayExpressionsInCrashlogs()) {
10621ba7c4d0SGreg Clayton           StreamString frame_description;
1063d9e416c0SGreg Clayton           frame->DumpUsingSettingsFormat(&frame_description);
1064a8f3ae7cSJonas Devlieghere           stack_trace = std::make_unique<llvm::PrettyStackTraceFormat>(
1065b9c1b51eSKate Stone               "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value "
1066b9c1b51eSKate Stone               "= %u) %s",
1067b9c1b51eSKate Stone               expr, options.GetFetchDynamicValue(),
1068c156427dSZachary Turner               frame_description.GetData());
1069fb6621efSGreg Clayton         }
1070fb6621efSGreg Clayton 
1071370e5dbaSPavel Labath         target->EvaluateExpression(expr, frame, expr_value_sp, options.ref());
1072e3e91517SEnrico Granata         expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
10737730b9a4SJim Ingham       }
1074c9858e4dSGreg Clayton     }
10757fdf9ef1SGreg Clayton   }
10764838131bSGreg Clayton 
107763e5fb76SJonas Devlieghere   LLDB_LOGF(expr_log,
107863e5fb76SJonas Devlieghere             "** [SBFrame::EvaluateExpression] Expression result is "
1079b9c1b51eSKate Stone             "%s, summary %s **",
1080324a1036SSaleem Abdulrasool             expr_result.GetValue(), expr_result.GetSummary());
10814838131bSGreg Clayton 
1082d232abc3SJonas Devlieghere   return expr_result;
10831d3afba3SGreg Clayton }
1084316d498bSGreg Clayton 
IsInlined()1085b9c1b51eSKate Stone bool SBFrame::IsInlined() {
10861755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1087baf5664fSJonas Devlieghere 
108805f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->IsInlined();
108905f75e9fSOleksiy Vyalov }
109005f75e9fSOleksiy Vyalov 
IsInlined() const1091b9c1b51eSKate Stone bool SBFrame::IsInlined() const {
10921755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1093baf5664fSJonas Devlieghere 
1094c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1095c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1096c481c7eeSJim Ingham 
1097dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1098d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
10997730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1100b9c1b51eSKate Stone   if (target && process) {
11017fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1102b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
11037730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1104b9c1b51eSKate Stone       if (frame) {
11057fdf9ef1SGreg Clayton 
1106d9e416c0SGreg Clayton         Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1107316d498bSGreg Clayton         if (block)
1108dbb0abbfSEugene Zelenko           return block->GetContainingInlinedBlock() != nullptr;
11097730b9a4SJim Ingham       }
1110c9858e4dSGreg Clayton     }
11117fdf9ef1SGreg Clayton   }
1112316d498bSGreg Clayton   return false;
1113316d498bSGreg Clayton }
1114316d498bSGreg Clayton 
IsArtificial()11154b36f791SVedant Kumar bool SBFrame::IsArtificial() {
11161755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1117baf5664fSJonas Devlieghere 
11184b36f791SVedant Kumar   return static_cast<const SBFrame *>(this)->IsArtificial();
11194b36f791SVedant Kumar }
11204b36f791SVedant Kumar 
IsArtificial() const11214b36f791SVedant Kumar bool SBFrame::IsArtificial() const {
11221755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1123baf5664fSJonas Devlieghere 
11244b36f791SVedant Kumar   std::unique_lock<std::recursive_mutex> lock;
11254b36f791SVedant Kumar   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
11264b36f791SVedant Kumar 
11274b36f791SVedant Kumar   StackFrame *frame = exe_ctx.GetFramePtr();
11284b36f791SVedant Kumar   if (frame)
11294b36f791SVedant Kumar     return frame->IsArtificial();
11304b36f791SVedant Kumar 
11314b36f791SVedant Kumar   return false;
11324b36f791SVedant Kumar }
11334b36f791SVedant Kumar 
GetFunctionName()1134b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() {
11351755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1136baf5664fSJonas Devlieghere 
113705f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->GetFunctionName();
113805f75e9fSOleksiy Vyalov }
113905f75e9fSOleksiy Vyalov 
GuessLanguage() const1140bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const {
11411755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1142baf5664fSJonas Devlieghere 
1143bdbdd229SJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1144bdbdd229SJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1145bdbdd229SJim Ingham 
1146bdbdd229SJim Ingham   StackFrame *frame = nullptr;
1147bdbdd229SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
1148bdbdd229SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1149bdbdd229SJim Ingham   if (target && process) {
1150bdbdd229SJim Ingham     Process::StopLocker stop_locker;
1151bdbdd229SJim Ingham     if (stop_locker.TryLock(&process->GetRunLock())) {
1152bdbdd229SJim Ingham       frame = exe_ctx.GetFramePtr();
1153bdbdd229SJim Ingham       if (frame) {
1154bdbdd229SJim Ingham         return frame->GuessLanguage();
1155bdbdd229SJim Ingham       }
1156bdbdd229SJim Ingham     }
1157bdbdd229SJim Ingham   }
1158bdbdd229SJim Ingham   return eLanguageTypeUnknown;
1159bdbdd229SJim Ingham }
1160bdbdd229SJim Ingham 
GetFunctionName() const1161b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const {
11621755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1163baf5664fSJonas Devlieghere 
1164dbb0abbfSEugene Zelenko   const char *name = nullptr;
1165c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1166c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1167c481c7eeSJim Ingham 
1168dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1169d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
11707730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1171b9c1b51eSKate Stone   if (target && process) {
11727fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1173b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
11747730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1175b9c1b51eSKate Stone       if (frame) {
1176b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1177b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1178b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1179b9c1b51eSKate Stone         if (sc.block) {
1180316d498bSGreg Clayton           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1181b9c1b51eSKate Stone           if (inlined_block) {
1182b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1183b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
118422b04487SAlex Langford             name = inlined_info->GetName().AsCString();
1185316d498bSGreg Clayton           }
1186316d498bSGreg Clayton         }
1187316d498bSGreg Clayton 
1188b9c1b51eSKate Stone         if (name == nullptr) {
1189316d498bSGreg Clayton           if (sc.function)
1190316d498bSGreg Clayton             name = sc.function->GetName().GetCString();
1191316d498bSGreg Clayton         }
1192316d498bSGreg Clayton 
1193b9c1b51eSKate Stone         if (name == nullptr) {
1194316d498bSGreg Clayton           if (sc.symbol)
1195316d498bSGreg Clayton             name = sc.symbol->GetName().GetCString();
1196316d498bSGreg Clayton         }
11977730b9a4SJim Ingham       }
1198c9858e4dSGreg Clayton     }
11997fdf9ef1SGreg Clayton   }
1200316d498bSGreg Clayton   return name;
1201316d498bSGreg Clayton }
1202c1f705c2SEnrico Granata 
GetDisplayFunctionName()1203b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() {
12041755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1205baf5664fSJonas Devlieghere 
1206dbb0abbfSEugene Zelenko   const char *name = nullptr;
1207c481c7eeSJim Ingham 
1208c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1209c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1210c481c7eeSJim Ingham 
1211dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1212c1f705c2SEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
1213c1f705c2SEnrico Granata   Process *process = exe_ctx.GetProcessPtr();
1214b9c1b51eSKate Stone   if (target && process) {
1215c1f705c2SEnrico Granata     Process::StopLocker stop_locker;
1216b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1217c1f705c2SEnrico Granata       frame = exe_ctx.GetFramePtr();
1218b9c1b51eSKate Stone       if (frame) {
1219b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1220b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1221b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1222b9c1b51eSKate Stone         if (sc.block) {
1223c1f705c2SEnrico Granata           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1224b9c1b51eSKate Stone           if (inlined_block) {
1225b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1226b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
122722b04487SAlex Langford             name = inlined_info->GetDisplayName().AsCString();
1228c1f705c2SEnrico Granata           }
1229c1f705c2SEnrico Granata         }
1230c1f705c2SEnrico Granata 
1231b9c1b51eSKate Stone         if (name == nullptr) {
1232c1f705c2SEnrico Granata           if (sc.function)
1233c1f705c2SEnrico Granata             name = sc.function->GetDisplayName().GetCString();
1234c1f705c2SEnrico Granata         }
1235c1f705c2SEnrico Granata 
1236b9c1b51eSKate Stone         if (name == nullptr) {
1237c1f705c2SEnrico Granata           if (sc.symbol)
1238c1f705c2SEnrico Granata             name = sc.symbol->GetDisplayName().GetCString();
1239c1f705c2SEnrico Granata         }
1240c1f705c2SEnrico Granata       }
1241c1f705c2SEnrico Granata     }
1242c1f705c2SEnrico Granata   }
1243c1f705c2SEnrico Granata   return name;
1244c1f705c2SEnrico Granata }
1245