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 
17*d51402acSJonas Devlieghere #include "lldb/Utility/ReproducerInstrumentation.h"
18bd4bf82aSJonas Devlieghere #include "Utils.h"
1930fdc8d8SChris Lattner #include "lldb/Core/Address.h"
2030fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2130fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h"
2230fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h"
23347ec0faSAlex Langford #include "lldb/Expression/ExpressionVariable.h"
24151c032cSJim Ingham #include "lldb/Expression/UserExpression.h"
251ba7c4d0SGreg Clayton #include "lldb/Host/Host.h"
2630fdc8d8SChris Lattner #include "lldb/Symbol/Block.h"
271f746071SGreg Clayton #include "lldb/Symbol/Function.h"
281f746071SGreg Clayton #include "lldb/Symbol/Symbol.h"
2930fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h"
3030fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h"
31b9c1b51eSKate Stone #include "lldb/Symbol/VariableList.h"
3230fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h"
3330fdc8d8SChris Lattner #include "lldb/Target/Process.h"
3430fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
35b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h"
3641ae8e74SKuba Mracek #include "lldb/Target/StackFrameRecognizer.h"
37b9556accSGreg Clayton #include "lldb/Target/StackID.h"
38b9c1b51eSKate Stone #include "lldb/Target/Target.h"
3930fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
40bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h"
41bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
4230fdc8d8SChris Lattner 
434c5de699SEli Friedman #include "lldb/API/SBAddress.h"
44b9c1b51eSKate Stone #include "lldb/API/SBDebugger.h"
4535e1bda6SJim Ingham #include "lldb/API/SBExpressionOptions.h"
46dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
474c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h"
484c5de699SEli Friedman #include "lldb/API/SBThread.h"
49b9c1b51eSKate Stone #include "lldb/API/SBValue.h"
5051f96eebSZachary Turner #include "lldb/API/SBVariablesOptions.h"
5130fdc8d8SChris Lattner 
52237c3ed9SSean Callanan #include "llvm/Support/PrettyStackTrace.h"
53237c3ed9SSean Callanan 
5430fdc8d8SChris Lattner using namespace lldb;
5530fdc8d8SChris Lattner using namespace lldb_private;
5630fdc8d8SChris Lattner 
57baf5664fSJonas Devlieghere SBFrame::SBFrame() : m_opaque_sp(new ExecutionContextRef()) {
58baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBFrame);
59baf5664fSJonas Devlieghere }
6030fdc8d8SChris Lattner 
61b9c1b51eSKate Stone SBFrame::SBFrame(const StackFrameSP &lldb_object_sp)
62b9c1b51eSKate Stone     : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) {
63baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBFrame, (const lldb::StackFrameSP &),
64baf5664fSJonas Devlieghere                           lldb_object_sp);
6530fdc8d8SChris Lattner }
6630fdc8d8SChris Lattner 
67a3436f73SKazu Hirata SBFrame::SBFrame(const SBFrame &rhs) {
68baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBFrame, (const lldb::SBFrame &), rhs);
69baf5664fSJonas Devlieghere 
70bd4bf82aSJonas Devlieghere   m_opaque_sp = clone(rhs.m_opaque_sp);
71bd4bf82aSJonas Devlieghere }
72efabb123SGreg Clayton 
73dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default;
74dbb0abbfSEugene Zelenko 
75b9c1b51eSKate Stone const SBFrame &SBFrame::operator=(const SBFrame &rhs) {
76baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(const lldb::SBFrame &,
77baf5664fSJonas Devlieghere                      SBFrame, operator=,(const lldb::SBFrame &), rhs);
78baf5664fSJonas Devlieghere 
79efabb123SGreg Clayton   if (this != &rhs)
80bd4bf82aSJonas Devlieghere     m_opaque_sp = clone(rhs.m_opaque_sp);
81306809f2SJonas Devlieghere   return LLDB_RECORD_RESULT(*this);
82efabb123SGreg Clayton }
83efabb123SGreg Clayton 
84b9c1b51eSKate Stone StackFrameSP SBFrame::GetFrameSP() const {
85dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetFrameSP() : StackFrameSP());
86b9556accSGreg Clayton }
8730fdc8d8SChris Lattner 
88b9c1b51eSKate Stone void SBFrame::SetFrameSP(const StackFrameSP &lldb_object_sp) {
897fdf9ef1SGreg Clayton   return m_opaque_sp->SetFrameSP(lldb_object_sp);
90b9556accSGreg Clayton }
9130fdc8d8SChris Lattner 
92b9c1b51eSKate Stone bool SBFrame::IsValid() const {
93baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsValid);
947f5237bcSPavel Labath   return this->operator bool();
957f5237bcSPavel Labath }
967f5237bcSPavel Labath SBFrame::operator bool() const {
977f5237bcSPavel Labath   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, operator bool);
98baf5664fSJonas Devlieghere 
99bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
100bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1017fa7dc36SJim Ingham 
1027fa7dc36SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
1037fa7dc36SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
104b9c1b51eSKate Stone   if (target && process) {
1057fa7dc36SJim Ingham     Process::StopLocker stop_locker;
1067fa7dc36SJim Ingham     if (stop_locker.TryLock(&process->GetRunLock()))
107dbb0abbfSEugene Zelenko       return GetFrameSP().get() != nullptr;
10830fdc8d8SChris Lattner   }
10930fdc8d8SChris Lattner 
1107fa7dc36SJim Ingham   // Without a target & process we can't have a valid stack frame.
1117fa7dc36SJim Ingham   return false;
1127fa7dc36SJim Ingham }
1137fa7dc36SJim Ingham 
114b9c1b51eSKate Stone SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const {
115baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(lldb::SBSymbolContext, SBFrame, GetSymbolContext,
116baf5664fSJonas Devlieghere                            (uint32_t), resolve_scope);
117baf5664fSJonas Devlieghere 
11830fdc8d8SChris Lattner   SBSymbolContext sb_sym_ctx;
119bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
120bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
121991e4453SZachary Turner   SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope);
122d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1237730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
124b9c1b51eSKate Stone   if (target && process) {
1257fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
126b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1272efc6892SPavel Labath       if (StackFrame *frame = exe_ctx.GetFramePtr())
1282efc6892SPavel Labath         sb_sym_ctx = frame->GetSymbolContext(scope);
129c9858e4dSGreg Clayton     }
1307fdf9ef1SGreg Clayton   }
131ceb6b139SCaroline Tice 
132baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_sym_ctx);
13330fdc8d8SChris Lattner }
13430fdc8d8SChris Lattner 
135b9c1b51eSKate Stone SBModule SBFrame::GetModule() const {
136baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBModule, SBFrame, GetModule);
137baf5664fSJonas Devlieghere 
13872eff18aSGreg Clayton   SBModule sb_module;
139acdbe816SGreg Clayton   ModuleSP module_sp;
140bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
141bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1424fc6cb9cSJim Ingham 
143dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
144d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1457730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
146b9c1b51eSKate Stone   if (target && process) {
1477fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
148b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1497730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
150b9c1b51eSKate Stone       if (frame) {
151d9e416c0SGreg Clayton         module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp;
152acdbe816SGreg Clayton         sb_module.SetSP(module_sp);
153c9858e4dSGreg Clayton       }
1547fdf9ef1SGreg Clayton     }
155581af8b0SJonas Devlieghere   }
1564838131bSGreg Clayton 
157baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_module);
15830fdc8d8SChris Lattner }
15930fdc8d8SChris Lattner 
160b9c1b51eSKate Stone SBCompileUnit SBFrame::GetCompileUnit() const {
161baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBCompileUnit, SBFrame,
162baf5664fSJonas Devlieghere                                    GetCompileUnit);
163baf5664fSJonas Devlieghere 
16472eff18aSGreg Clayton   SBCompileUnit sb_comp_unit;
165bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
166bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1674fc6cb9cSJim Ingham 
168dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
169d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1707730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
171b9c1b51eSKate Stone   if (target && process) {
1727fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
173b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1747730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
175b9c1b51eSKate Stone       if (frame) {
176b9c1b51eSKate Stone         sb_comp_unit.reset(
177b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit);
178c9858e4dSGreg Clayton       }
179c9858e4dSGreg Clayton     }
180581af8b0SJonas Devlieghere   }
181ceb6b139SCaroline Tice 
182baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_comp_unit);
18330fdc8d8SChris Lattner }
18430fdc8d8SChris Lattner 
185b9c1b51eSKate Stone SBFunction SBFrame::GetFunction() const {
186baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFunction, SBFrame, GetFunction);
187baf5664fSJonas Devlieghere 
18872eff18aSGreg Clayton   SBFunction sb_function;
189bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
190bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1914fc6cb9cSJim Ingham 
192dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
193d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1947730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
195b9c1b51eSKate Stone   if (target && process) {
1967fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
197b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1987730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
199b9c1b51eSKate Stone       if (frame) {
200b9c1b51eSKate Stone         sb_function.reset(
201b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextFunction).function);
2027fdf9ef1SGreg Clayton       }
203c9858e4dSGreg Clayton     }
204581af8b0SJonas Devlieghere   }
2054838131bSGreg Clayton 
206baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_function);
20730fdc8d8SChris Lattner }
20830fdc8d8SChris Lattner 
209b9c1b51eSKate Stone SBSymbol SBFrame::GetSymbol() const {
210baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBSymbol, SBFrame, GetSymbol);
211baf5664fSJonas Devlieghere 
21272eff18aSGreg Clayton   SBSymbol sb_symbol;
213bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
214bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2154fc6cb9cSJim Ingham 
216dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
217d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2187730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
219b9c1b51eSKate Stone   if (target && process) {
2207fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
221b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2227730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
223b9c1b51eSKate Stone       if (frame) {
224d9e416c0SGreg Clayton         sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol);
2257fdf9ef1SGreg Clayton       }
226c9858e4dSGreg Clayton     }
227581af8b0SJonas Devlieghere   }
228581af8b0SJonas Devlieghere 
229baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_symbol);
2303b06557eSGreg Clayton }
2313b06557eSGreg Clayton 
232b9c1b51eSKate Stone SBBlock SBFrame::GetBlock() const {
233baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBlock, SBFrame, GetBlock);
234baf5664fSJonas Devlieghere 
23572eff18aSGreg Clayton   SBBlock sb_block;
236bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
237bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2384fc6cb9cSJim Ingham 
239dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
240d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2417730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
242b9c1b51eSKate Stone   if (target && process) {
2437fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
244b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2457730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
246581af8b0SJonas Devlieghere       if (frame)
247d9e416c0SGreg Clayton         sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block);
2487fdf9ef1SGreg Clayton     }
249c9858e4dSGreg Clayton   }
250baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_block);
25130fdc8d8SChris Lattner }
25230fdc8d8SChris Lattner 
253b9c1b51eSKate Stone SBBlock SBFrame::GetFrameBlock() const {
254baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBlock, SBFrame, GetFrameBlock);
255baf5664fSJonas Devlieghere 
25672eff18aSGreg Clayton   SBBlock sb_block;
257bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
258bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2594fc6cb9cSJim Ingham 
260dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
261d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2627730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
263b9c1b51eSKate Stone   if (target && process) {
2647fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
265b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2667730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
267581af8b0SJonas Devlieghere       if (frame)
268d9e416c0SGreg Clayton         sb_block.SetPtr(frame->GetFrameBlock());
2697fdf9ef1SGreg Clayton     }
270c9858e4dSGreg Clayton   }
271baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_block);
27295897c6aSGreg Clayton }
27395897c6aSGreg Clayton 
274b9c1b51eSKate Stone SBLineEntry SBFrame::GetLineEntry() const {
275baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBLineEntry, SBFrame, GetLineEntry);
276baf5664fSJonas Devlieghere 
27772eff18aSGreg Clayton   SBLineEntry sb_line_entry;
278bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
279bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2804fc6cb9cSJim Ingham 
281dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
282d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2837730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
284b9c1b51eSKate Stone   if (target && process) {
2857fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
286b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2877730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
288b9c1b51eSKate Stone       if (frame) {
289b9c1b51eSKate Stone         sb_line_entry.SetLineEntry(
290b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextLineEntry).line_entry);
2917fdf9ef1SGreg Clayton       }
292c9858e4dSGreg Clayton     }
293581af8b0SJonas Devlieghere   }
294baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_line_entry);
29530fdc8d8SChris Lattner }
29630fdc8d8SChris Lattner 
297b9c1b51eSKate Stone uint32_t SBFrame::GetFrameID() const {
298baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBFrame, GetFrameID);
299baf5664fSJonas Devlieghere 
300b9556accSGreg Clayton   uint32_t frame_idx = UINT32_MAX;
301b9556accSGreg Clayton 
302c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
303c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
304c481c7eeSJim Ingham 
305b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
3067fdf9ef1SGreg Clayton   if (frame)
307d9e416c0SGreg Clayton     frame_idx = frame->GetFrameIndex();
3084838131bSGreg Clayton 
3094838131bSGreg Clayton   return frame_idx;
31030fdc8d8SChris Lattner }
31130fdc8d8SChris Lattner 
312b9c1b51eSKate Stone lldb::addr_t SBFrame::GetCFA() const {
313baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetCFA);
314baf5664fSJonas Devlieghere 
315c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
316c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
317c481c7eeSJim Ingham 
318424a5dbcSGreg Clayton   StackFrame *frame = exe_ctx.GetFramePtr();
319424a5dbcSGreg Clayton   if (frame)
320424a5dbcSGreg Clayton     return frame->GetStackID().GetCallFrameAddress();
321424a5dbcSGreg Clayton   return LLDB_INVALID_ADDRESS;
322424a5dbcSGreg Clayton }
323424a5dbcSGreg Clayton 
324b9c1b51eSKate Stone addr_t SBFrame::GetPC() const {
325baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetPC);
326baf5664fSJonas Devlieghere 
32769b582faSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
328bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
329bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3304fc6cb9cSJim Ingham 
331dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
332d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3337730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
334b9c1b51eSKate Stone   if (target && process) {
3357fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
336b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3377730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
338b9c1b51eSKate Stone       if (frame) {
339b9c1b51eSKate Stone         addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress(
34004803b3eSTatyana Krasnukha             target, AddressClass::eCode);
341c9858e4dSGreg Clayton       }
3427fdf9ef1SGreg Clayton     }
343581af8b0SJonas Devlieghere   }
344ceb6b139SCaroline Tice 
345ceb6b139SCaroline Tice   return addr;
34630fdc8d8SChris Lattner }
34730fdc8d8SChris Lattner 
348b9c1b51eSKate Stone bool SBFrame::SetPC(addr_t new_pc) {
349baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBFrame, SetPC, (lldb::addr_t), new_pc);
350baf5664fSJonas Devlieghere 
351ceb6b139SCaroline Tice   bool ret_val = false;
352bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
353bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3544fc6cb9cSJim Ingham 
355d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3567730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
357b9c1b51eSKate Stone   if (target && process) {
3587fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
359b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3600d7401cfSMed Ismail Bennani       if (StackFrame *frame = exe_ctx.GetFramePtr()) {
3610d7401cfSMed Ismail Bennani         if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
3620d7401cfSMed Ismail Bennani           ret_val = reg_ctx_sp->SetPC(new_pc);
3630d7401cfSMed Ismail Bennani         }
364c9858e4dSGreg Clayton       }
3657fdf9ef1SGreg Clayton     }
366581af8b0SJonas Devlieghere   }
367ceb6b139SCaroline Tice 
368ceb6b139SCaroline Tice   return ret_val;
36930fdc8d8SChris Lattner }
37030fdc8d8SChris Lattner 
371b9c1b51eSKate Stone addr_t SBFrame::GetSP() const {
372baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetSP);
373baf5664fSJonas Devlieghere 
3744838131bSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
375bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
376bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3774fc6cb9cSJim Ingham 
378d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3797730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
380b9c1b51eSKate Stone   if (target && process) {
3817fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
382b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3830d7401cfSMed Ismail Bennani       if (StackFrame *frame = exe_ctx.GetFramePtr()) {
3840d7401cfSMed Ismail Bennani         if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
3850d7401cfSMed Ismail Bennani           addr = reg_ctx_sp->GetSP();
3860d7401cfSMed Ismail Bennani         }
3877fdf9ef1SGreg Clayton       }
388c9858e4dSGreg Clayton     }
389581af8b0SJonas Devlieghere   }
3904838131bSGreg Clayton 
3914838131bSGreg Clayton   return addr;
39230fdc8d8SChris Lattner }
39330fdc8d8SChris Lattner 
394b9c1b51eSKate Stone addr_t SBFrame::GetFP() const {
395baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetFP);
396baf5664fSJonas Devlieghere 
39769b582faSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
398bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
399bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4004fc6cb9cSJim Ingham 
401d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4027730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
403b9c1b51eSKate Stone   if (target && process) {
4047fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
405b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4060d7401cfSMed Ismail Bennani       if (StackFrame *frame = exe_ctx.GetFramePtr()) {
4070d7401cfSMed Ismail Bennani         if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
4080d7401cfSMed Ismail Bennani           addr = reg_ctx_sp->GetFP();
4090d7401cfSMed Ismail Bennani         }
4100d7401cfSMed Ismail Bennani       }
411c9858e4dSGreg Clayton     }
4127fdf9ef1SGreg Clayton   }
413ceb6b139SCaroline Tice 
414ceb6b139SCaroline Tice   return addr;
41530fdc8d8SChris Lattner }
41630fdc8d8SChris Lattner 
417b9c1b51eSKate Stone SBAddress SBFrame::GetPCAddress() const {
418baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBFrame, GetPCAddress);
419baf5664fSJonas Devlieghere 
42030fdc8d8SChris Lattner   SBAddress sb_addr;
421bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
422bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4234fc6cb9cSJim Ingham 
424b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
425d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4267730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
427b9c1b51eSKate Stone   if (target && process) {
4287fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
429b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4307730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
431581af8b0SJonas Devlieghere       if (frame)
4326cd4a4cdSJonas Devlieghere         sb_addr.SetAddress(frame->GetFrameCodeAddress());
4337fdf9ef1SGreg Clayton     }
434c9858e4dSGreg Clayton   }
435baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_addr);
43630fdc8d8SChris Lattner }
43730fdc8d8SChris Lattner 
438baf5664fSJonas Devlieghere void SBFrame::Clear() {
439baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBFrame, Clear);
440baf5664fSJonas Devlieghere 
441baf5664fSJonas Devlieghere   m_opaque_sp->Clear();
442baf5664fSJonas Devlieghere }
44330fdc8d8SChris Lattner 
444b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) {
445baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath,
446baf5664fSJonas Devlieghere                      (const char *), var_path);
447baf5664fSJonas Devlieghere 
4487edbdfc9SGreg Clayton   SBValue sb_value;
449c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
450c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
451c481c7eeSJim Ingham 
452b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
453d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
454b9c1b51eSKate Stone   if (frame && target) {
455b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
456b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
4577edbdfc9SGreg Clayton     sb_value = GetValueForVariablePath(var_path, use_dynamic);
4587edbdfc9SGreg Clayton   }
459baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value);
4607edbdfc9SGreg Clayton }
4617edbdfc9SGreg Clayton 
462b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path,
463b9c1b51eSKate Stone                                                DynamicValueType use_dynamic) {
464baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath,
465baf5664fSJonas Devlieghere                      (const char *, lldb::DynamicValueType), var_path,
466baf5664fSJonas Devlieghere                      use_dynamic);
467baf5664fSJonas Devlieghere 
4687edbdfc9SGreg Clayton   SBValue sb_value;
469b9c1b51eSKate Stone   if (var_path == nullptr || var_path[0] == '\0') {
470baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_value);
4717730b9a4SJim Ingham   }
4727730b9a4SJim Ingham 
473bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
474bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4754fc6cb9cSJim Ingham 
476dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
477d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4787730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
479b9c1b51eSKate Stone   if (target && process) {
4807fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
481b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4827730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
483b9c1b51eSKate Stone       if (frame) {
4847edbdfc9SGreg Clayton         VariableSP var_sp;
48597206d57SZachary Turner         Status error;
486b9c1b51eSKate Stone         ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath(
487b9c1b51eSKate Stone             var_path, eNoDynamicValues,
488b9c1b51eSKate Stone             StackFrame::eExpressionPathOptionCheckPtrVsMember |
489b9c1b51eSKate Stone                 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
490b9c1b51eSKate Stone             var_sp, error));
491e3e91517SEnrico Granata         sb_value.SetSP(value_sp, use_dynamic);
4927730b9a4SJim Ingham       }
493c9858e4dSGreg Clayton     }
4947fdf9ef1SGreg Clayton   }
495baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value);
4967edbdfc9SGreg Clayton }
4977edbdfc9SGreg Clayton 
498b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name) {
499baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *),
500baf5664fSJonas Devlieghere                      name);
501baf5664fSJonas Devlieghere 
502316d498bSGreg Clayton   SBValue value;
503c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
504c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
505c481c7eeSJim Ingham 
506b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
507d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
508b9c1b51eSKate Stone   if (frame && target) {
509b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
510b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
511316d498bSGreg Clayton     value = FindVariable(name, use_dynamic);
512316d498bSGreg Clayton   }
513baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value);
51478a685aaSJim Ingham }
51578a685aaSJim Ingham 
516b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name,
517b9c1b51eSKate Stone                               lldb::DynamicValueType use_dynamic) {
518baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable,
519baf5664fSJonas Devlieghere                      (const char *, lldb::DynamicValueType), name, use_dynamic);
520baf5664fSJonas Devlieghere 
52169b582faSGreg Clayton   VariableSP var_sp;
52258b59f95SJim Ingham   SBValue sb_value;
5237730b9a4SJim Ingham 
524b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
525baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_value);
5267730b9a4SJim Ingham   }
5277730b9a4SJim Ingham 
52881e871edSGreg Clayton   ValueObjectSP value_sp;
529bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
530bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5314fc6cb9cSJim Ingham 
532dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
533d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5347730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
535b9c1b51eSKate Stone   if (target && process) {
5367fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
537b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5387730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
539b9c1b51eSKate Stone       if (frame) {
540e23d0b63SShafik Yaghmour         value_sp = frame->FindVariable(ConstString(name));
54130fdc8d8SChris Lattner 
542e23d0b63SShafik Yaghmour         if (value_sp)
543e3e91517SEnrico Granata           sb_value.SetSP(value_sp, use_dynamic);
544c9858e4dSGreg Clayton       }
545316d498bSGreg Clayton     }
546581af8b0SJonas Devlieghere   }
5474838131bSGreg Clayton 
548baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value);
549dde9cff3SCaroline Tice }
550dde9cff3SCaroline Tice 
551b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) {
552baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue,
553baf5664fSJonas Devlieghere                      (const char *, lldb::ValueType), name, value_type);
554baf5664fSJonas Devlieghere 
555316d498bSGreg Clayton   SBValue value;
556c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
557c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
558c481c7eeSJim Ingham 
559b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
560d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
561b9c1b51eSKate Stone   if (frame && target) {
562b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
563b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
564316d498bSGreg Clayton     value = FindValue(name, value_type, use_dynamic);
565316d498bSGreg Clayton   }
566baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value);
56778a685aaSJim Ingham }
56878a685aaSJim Ingham 
569b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type,
570b9c1b51eSKate Stone                            lldb::DynamicValueType use_dynamic) {
571baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue,
572baf5664fSJonas Devlieghere                      (const char *, lldb::ValueType, lldb::DynamicValueType),
573baf5664fSJonas Devlieghere                      name, value_type, use_dynamic);
574baf5664fSJonas Devlieghere 
57569b582faSGreg Clayton   SBValue sb_value;
5767730b9a4SJim Ingham 
577b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
578baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_value);
5797730b9a4SJim Ingham   }
5807730b9a4SJim Ingham 
58181e871edSGreg Clayton   ValueObjectSP value_sp;
582bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
583bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5844fc6cb9cSJim Ingham 
585dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
586d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5877730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
588b9c1b51eSKate Stone   if (target && process) {
5897fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
590b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5917730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
592b9c1b51eSKate Stone       if (frame) {
5938a2a0dfbSEnrico Granata         VariableList variable_list;
5948a2a0dfbSEnrico Granata 
595b9c1b51eSKate Stone         switch (value_type) {
59669b582faSGreg Clayton         case eValueTypeVariableGlobal:      // global variable
59769b582faSGreg Clayton         case eValueTypeVariableStatic:      // static variable
59869b582faSGreg Clayton         case eValueTypeVariableArgument:    // function argument variables
59969b582faSGreg Clayton         case eValueTypeVariableLocal:       // function local variables
60063a27afaSGreg Clayton         case eValueTypeVariableThreadLocal: // thread local variables
60169b582faSGreg Clayton         {
602d9e416c0SGreg Clayton           SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock));
60372eff18aSGreg Clayton 
60472eff18aSGreg Clayton           const bool can_create = true;
60572eff18aSGreg Clayton           const bool get_parent_variables = true;
60672eff18aSGreg Clayton           const bool stop_if_block_is_inlined_function = true;
60772eff18aSGreg Clayton 
6080efb51a0SChaoren Lin           if (sc.block)
609b9c1b51eSKate Stone             sc.block->AppendVariables(
610b9c1b51eSKate Stone                 can_create, get_parent_variables,
611b9c1b51eSKate Stone                 stop_if_block_is_inlined_function,
612b9c1b51eSKate Stone                 [frame](Variable *v) { return v->IsInScope(frame); },
613b9c1b51eSKate Stone                 &variable_list);
614b9c1b51eSKate Stone           if (value_type == eValueTypeVariableGlobal) {
6158a2a0dfbSEnrico Granata             const bool get_file_globals = true;
6168a2a0dfbSEnrico Granata             VariableList *frame_vars = frame->GetVariableList(get_file_globals);
6178a2a0dfbSEnrico Granata             if (frame_vars)
6188a2a0dfbSEnrico Granata               frame_vars->AppendVariablesIfUnique(variable_list);
6198a2a0dfbSEnrico Granata           }
62069b582faSGreg Clayton           ConstString const_name(name);
621b9c1b51eSKate Stone           VariableSP variable_sp(
622b9c1b51eSKate Stone               variable_list.FindVariable(const_name, value_type));
623b9c1b51eSKate Stone           if (variable_sp) {
624b9c1b51eSKate Stone             value_sp = frame->GetValueObjectForFrameVariable(variable_sp,
625b9c1b51eSKate Stone                                                              eNoDynamicValues);
626e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
62730fdc8d8SChris Lattner           }
628b9c1b51eSKate Stone         } break;
62969b582faSGreg Clayton 
63069b582faSGreg Clayton         case eValueTypeRegister: // stack frame register value
63169b582faSGreg Clayton         {
632d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
633b9c1b51eSKate Stone           if (reg_ctx) {
6348567f4d4SMichał Górny             if (const RegisterInfo *reg_info =
6358567f4d4SMichał Górny                     reg_ctx->GetRegisterInfoByName(name)) {
6368567f4d4SMichał Górny               value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_info);
63781e871edSGreg Clayton               sb_value.SetSP(value_sp);
63869b582faSGreg Clayton             }
63969b582faSGreg Clayton           }
640b9c1b51eSKate Stone         } break;
64169b582faSGreg Clayton 
642b9c1b51eSKate Stone         case eValueTypeRegisterSet: // A collection of stack frame register
643b9c1b51eSKate Stone                                     // values
64469b582faSGreg Clayton         {
645d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
646b9c1b51eSKate Stone           if (reg_ctx) {
64769b582faSGreg Clayton             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
648b9c1b51eSKate Stone             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
64969b582faSGreg Clayton               const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx);
65069b582faSGreg Clayton               if (reg_set &&
65169b582faSGreg Clayton                   ((reg_set->name && strcasecmp(reg_set->name, name) == 0) ||
652b9c1b51eSKate Stone                    (reg_set->short_name &&
653b9c1b51eSKate Stone                     strcasecmp(reg_set->short_name, name) == 0))) {
654b9c1b51eSKate Stone                 value_sp =
655b9c1b51eSKate Stone                     ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx);
65681e871edSGreg Clayton                 sb_value.SetSP(value_sp);
65781e871edSGreg Clayton                 break;
65869b582faSGreg Clayton               }
65969b582faSGreg Clayton             }
66069b582faSGreg Clayton           }
661b9c1b51eSKate Stone         } break;
66269b582faSGreg Clayton 
66369b582faSGreg Clayton         case eValueTypeConstResult: // constant result variables
66469b582faSGreg Clayton         {
66569b582faSGreg Clayton           ConstString const_name(name);
666b9c1b51eSKate Stone           ExpressionVariableSP expr_var_sp(
667b9c1b51eSKate Stone               target->GetPersistentVariable(const_name));
668b9c1b51eSKate Stone           if (expr_var_sp) {
66981e871edSGreg Clayton             value_sp = expr_var_sp->GetValueObject();
670e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
67181e871edSGreg Clayton           }
672b9c1b51eSKate Stone         } break;
67369b582faSGreg Clayton 
67469b582faSGreg Clayton         default:
67569b582faSGreg Clayton           break;
67669b582faSGreg Clayton         }
677c9858e4dSGreg Clayton       }
6787fdf9ef1SGreg Clayton     }
679581af8b0SJonas Devlieghere   }
6804838131bSGreg Clayton 
681baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value);
682dde9cff3SCaroline Tice }
683dde9cff3SCaroline Tice 
684b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const {
685baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &),
686baf5664fSJonas Devlieghere                            that);
687baf5664fSJonas Devlieghere 
688b57e4a1bSJason Molenda   lldb::StackFrameSP this_sp = GetFrameSP();
689b57e4a1bSJason Molenda   lldb::StackFrameSP that_sp = that.GetFrameSP();
69035e2ab60SJohnny Chen   return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
69135e2ab60SJohnny Chen }
69235e2ab60SJohnny Chen 
693baf5664fSJonas Devlieghere bool SBFrame::operator==(const SBFrame &rhs) const {
694baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator==,(const lldb::SBFrame &),
695baf5664fSJonas Devlieghere                            rhs);
69630fdc8d8SChris Lattner 
697baf5664fSJonas Devlieghere   return IsEqual(rhs);
698baf5664fSJonas Devlieghere }
699baf5664fSJonas Devlieghere 
700baf5664fSJonas Devlieghere bool SBFrame::operator!=(const SBFrame &rhs) const {
701baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator!=,(const lldb::SBFrame &),
702baf5664fSJonas Devlieghere                            rhs);
703baf5664fSJonas Devlieghere 
704baf5664fSJonas Devlieghere   return !IsEqual(rhs);
705baf5664fSJonas Devlieghere }
70630fdc8d8SChris Lattner 
707b9c1b51eSKate Stone SBThread SBFrame::GetThread() const {
708baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBThread, SBFrame, GetThread);
709baf5664fSJonas Devlieghere 
710c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
711c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
712c481c7eeSJim Ingham 
713d9e416c0SGreg Clayton   ThreadSP thread_sp(exe_ctx.GetThreadSP());
714d9e416c0SGreg Clayton   SBThread sb_thread(thread_sp);
715ceb6b139SCaroline Tice 
716baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_thread);
71730fdc8d8SChris Lattner }
71830fdc8d8SChris Lattner 
719b9c1b51eSKate Stone const char *SBFrame::Disassemble() const {
720baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, Disassemble);
721baf5664fSJonas Devlieghere 
722dbb0abbfSEugene Zelenko   const char *disassembly = nullptr;
723bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
724bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
7254fc6cb9cSJim Ingham 
726dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
727d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
7287730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
729b9c1b51eSKate Stone   if (target && process) {
7307fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
731b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
7327730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
733b9c1b51eSKate Stone       if (frame) {
734d9e416c0SGreg Clayton         disassembly = frame->Disassemble();
7357fdf9ef1SGreg Clayton       }
736c9858e4dSGreg Clayton     }
737581af8b0SJonas Devlieghere   }
7384838131bSGreg Clayton 
7394838131bSGreg Clayton   return disassembly;
74030fdc8d8SChris Lattner }
74130fdc8d8SChris Lattner 
742b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics,
743b9c1b51eSKate Stone                                   bool in_scope_only) {
744baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables,
745baf5664fSJonas Devlieghere                      (bool, bool, bool, bool), arguments, locals, statics,
746baf5664fSJonas Devlieghere                      in_scope_only);
747baf5664fSJonas Devlieghere 
748316d498bSGreg Clayton   SBValueList value_list;
749c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
750c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
751c481c7eeSJim Ingham 
752b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
753d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
754b9c1b51eSKate Stone   if (frame && target) {
755b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
756b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
757b9c1b51eSKate Stone     const bool include_runtime_support_values =
758b9c1b51eSKate Stone         target ? target->GetDisplayRuntimeSupportValues() : false;
75951f96eebSZachary Turner 
76051f96eebSZachary Turner     SBVariablesOptions options;
76151f96eebSZachary Turner     options.SetIncludeArguments(arguments);
76251f96eebSZachary Turner     options.SetIncludeLocals(locals);
76351f96eebSZachary Turner     options.SetIncludeStatics(statics);
76451f96eebSZachary Turner     options.SetInScopeOnly(in_scope_only);
76551f96eebSZachary Turner     options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
76651f96eebSZachary Turner     options.SetUseDynamic(use_dynamic);
76751f96eebSZachary Turner 
76851f96eebSZachary Turner     value_list = GetVariables(options);
769316d498bSGreg Clayton   }
770baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value_list);
77178a685aaSJim Ingham }
77278a685aaSJim Ingham 
773b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals,
774b9c1b51eSKate Stone                                         bool statics, bool in_scope_only,
775b9c1b51eSKate Stone                                         lldb::DynamicValueType use_dynamic) {
776baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables,
777baf5664fSJonas Devlieghere                      (bool, bool, bool, bool, lldb::DynamicValueType),
778baf5664fSJonas Devlieghere                      arguments, locals, statics, in_scope_only, use_dynamic);
779baf5664fSJonas Devlieghere 
780c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
781c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
782c481c7eeSJim Ingham 
783560558ebSEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
784b9c1b51eSKate Stone   const bool include_runtime_support_values =
785b9c1b51eSKate Stone       target ? target->GetDisplayRuntimeSupportValues() : false;
78651f96eebSZachary Turner   SBVariablesOptions options;
78751f96eebSZachary Turner   options.SetIncludeArguments(arguments);
78851f96eebSZachary Turner   options.SetIncludeLocals(locals);
78951f96eebSZachary Turner   options.SetIncludeStatics(statics);
79051f96eebSZachary Turner   options.SetInScopeOnly(in_scope_only);
79151f96eebSZachary Turner   options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
79251f96eebSZachary Turner   options.SetUseDynamic(use_dynamic);
793baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(GetVariables(options));
794560558ebSEnrico Granata }
795560558ebSEnrico Granata 
796b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) {
797baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables,
798baf5664fSJonas Devlieghere                      (const lldb::SBVariablesOptions &), options);
799baf5664fSJonas Devlieghere 
800b9556accSGreg Clayton   SBValueList value_list;
801bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
802bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
8034fc6cb9cSJim Ingham 
804dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
805d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
806b9556accSGreg Clayton 
80751f96eebSZachary Turner   const bool statics = options.GetIncludeStatics();
80851f96eebSZachary Turner   const bool arguments = options.GetIncludeArguments();
8094c7f5d5cSKuba Mracek   const bool recognized_arguments =
8104c7f5d5cSKuba Mracek         options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP()));
81151f96eebSZachary Turner   const bool locals = options.GetIncludeLocals();
81251f96eebSZachary Turner   const bool in_scope_only = options.GetInScopeOnly();
813b9c1b51eSKate Stone   const bool include_runtime_support_values =
814b9c1b51eSKate Stone       options.GetIncludeRuntimeSupportValues();
81551f96eebSZachary Turner   const lldb::DynamicValueType use_dynamic = options.GetUseDynamic();
81651f96eebSZachary Turner 
817ceb6b139SCaroline Tice 
818349213f9SGreg Clayton   std::set<VariableSP> variable_set;
8197730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
820b9c1b51eSKate Stone   if (target && process) {
8217fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
822b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
8237730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
824b9c1b51eSKate Stone       if (frame) {
825dbb0abbfSEugene Zelenko         VariableList *variable_list = nullptr;
826d9e416c0SGreg Clayton         variable_list = frame->GetVariableList(true);
827b9c1b51eSKate Stone         if (variable_list) {
82830fdc8d8SChris Lattner           const size_t num_variables = variable_list->GetSize();
829b9c1b51eSKate Stone           if (num_variables) {
830d1782133SRaphael Isemann             for (const VariableSP &variable_sp : *variable_list) {
831b9c1b51eSKate Stone               if (variable_sp) {
83230fdc8d8SChris Lattner                 bool add_variable = false;
833b9c1b51eSKate Stone                 switch (variable_sp->GetScope()) {
83430fdc8d8SChris Lattner                 case eValueTypeVariableGlobal:
83530fdc8d8SChris Lattner                 case eValueTypeVariableStatic:
83663a27afaSGreg Clayton                 case eValueTypeVariableThreadLocal:
83730fdc8d8SChris Lattner                   add_variable = statics;
83830fdc8d8SChris Lattner                   break;
83930fdc8d8SChris Lattner 
84030fdc8d8SChris Lattner                 case eValueTypeVariableArgument:
84130fdc8d8SChris Lattner                   add_variable = arguments;
84230fdc8d8SChris Lattner                   break;
84330fdc8d8SChris Lattner 
84430fdc8d8SChris Lattner                 case eValueTypeVariableLocal:
84530fdc8d8SChris Lattner                   add_variable = locals;
84630fdc8d8SChris Lattner                   break;
847c982c768SGreg Clayton 
848c982c768SGreg Clayton                 default:
849c982c768SGreg Clayton                   break;
85030fdc8d8SChris Lattner                 }
851b9c1b51eSKate Stone                 if (add_variable) {
852349213f9SGreg Clayton                   // Only add variables once so we don't end up with duplicates
853349213f9SGreg Clayton                   if (variable_set.find(variable_sp) == variable_set.end())
854349213f9SGreg Clayton                     variable_set.insert(variable_sp);
855349213f9SGreg Clayton                   else
856349213f9SGreg Clayton                     continue;
857349213f9SGreg Clayton 
858d9e416c0SGreg Clayton                   if (in_scope_only && !variable_sp->IsInScope(frame))
85930fdc8d8SChris Lattner                     continue;
86030fdc8d8SChris Lattner 
861b9c1b51eSKate Stone                   ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable(
862b9c1b51eSKate Stone                       variable_sp, eNoDynamicValues));
863560558ebSEnrico Granata 
864b9c1b51eSKate Stone                   if (!include_runtime_support_values && valobj_sp != nullptr &&
865dbb0abbfSEugene Zelenko                       valobj_sp->IsRuntimeSupportValue())
866560558ebSEnrico Granata                     continue;
867560558ebSEnrico Granata 
868e3e91517SEnrico Granata                   SBValue value_sb;
869e3e91517SEnrico Granata                   value_sb.SetSP(valobj_sp, use_dynamic);
870e3e91517SEnrico Granata                   value_list.Append(value_sb);
87130fdc8d8SChris Lattner                 }
87230fdc8d8SChris Lattner               }
87330fdc8d8SChris Lattner             }
87430fdc8d8SChris Lattner           }
87530fdc8d8SChris Lattner         }
87641ae8e74SKuba Mracek         if (recognized_arguments) {
87741ae8e74SKuba Mracek           auto recognized_frame = frame->GetRecognizedFrame();
87841ae8e74SKuba Mracek           if (recognized_frame) {
87941ae8e74SKuba Mracek             ValueObjectListSP recognized_arg_list =
88041ae8e74SKuba Mracek                 recognized_frame->GetRecognizedArguments();
88141ae8e74SKuba Mracek             if (recognized_arg_list) {
88241ae8e74SKuba Mracek               for (auto &rec_value_sp : recognized_arg_list->GetObjects()) {
88341ae8e74SKuba Mracek                 SBValue value_sb;
88441ae8e74SKuba Mracek                 value_sb.SetSP(rec_value_sp, use_dynamic);
88541ae8e74SKuba Mracek                 value_list.Append(value_sb);
88641ae8e74SKuba Mracek               }
88741ae8e74SKuba Mracek             }
88841ae8e74SKuba Mracek           }
88941ae8e74SKuba Mracek         }
890c9858e4dSGreg Clayton       }
8917fdf9ef1SGreg Clayton     }
892581af8b0SJonas Devlieghere   }
893ceb6b139SCaroline Tice 
894baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value_list);
89530fdc8d8SChris Lattner }
89630fdc8d8SChris Lattner 
897b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() {
898baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBValueList, SBFrame, GetRegisters);
899baf5664fSJonas Devlieghere 
90030fdc8d8SChris Lattner   SBValueList value_list;
901bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
902bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
9034fc6cb9cSJim Ingham 
904dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
905d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
9067730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
907b9c1b51eSKate Stone   if (target && process) {
9087fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
909b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
9107730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
911b9c1b51eSKate Stone       if (frame) {
912d9e416c0SGreg Clayton         RegisterContextSP reg_ctx(frame->GetRegisterContext());
913b9c1b51eSKate Stone         if (reg_ctx) {
91430fdc8d8SChris Lattner           const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
915b9c1b51eSKate Stone           for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
916b9c1b51eSKate Stone             value_list.Append(
917b9c1b51eSKate Stone                 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx));
91830fdc8d8SChris Lattner           }
91930fdc8d8SChris Lattner         }
920c9858e4dSGreg Clayton       }
9217fdf9ef1SGreg Clayton     }
922581af8b0SJonas Devlieghere   }
923ceb6b139SCaroline Tice 
924baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value_list);
92530fdc8d8SChris Lattner }
92630fdc8d8SChris Lattner 
927b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) {
928baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *),
929baf5664fSJonas Devlieghere                      name);
930baf5664fSJonas Devlieghere 
931ad9a53c5SJason Molenda   SBValue result;
932ad9a53c5SJason Molenda   ValueObjectSP value_sp;
933bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
934bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
935ad9a53c5SJason Molenda 
936dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
937ad9a53c5SJason Molenda   Target *target = exe_ctx.GetTargetPtr();
938ad9a53c5SJason Molenda   Process *process = exe_ctx.GetProcessPtr();
939b9c1b51eSKate Stone   if (target && process) {
940ad9a53c5SJason Molenda     Process::StopLocker stop_locker;
941b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
942ad9a53c5SJason Molenda       frame = exe_ctx.GetFramePtr();
943b9c1b51eSKate Stone       if (frame) {
944ad9a53c5SJason Molenda         RegisterContextSP reg_ctx(frame->GetRegisterContext());
945b9c1b51eSKate Stone         if (reg_ctx) {
9468567f4d4SMichał Górny           if (const RegisterInfo *reg_info =
9478567f4d4SMichał Górny                   reg_ctx->GetRegisterInfoByName(name)) {
9488567f4d4SMichał Górny             value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_info);
949ad9a53c5SJason Molenda             result.SetSP(value_sp);
950ad9a53c5SJason Molenda           }
951ad9a53c5SJason Molenda         }
952ad9a53c5SJason Molenda       }
953ad9a53c5SJason Molenda     }
954581af8b0SJonas Devlieghere   }
955ad9a53c5SJason Molenda 
956baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(result);
957ad9a53c5SJason Molenda }
958ad9a53c5SJason Molenda 
959b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) {
960baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &),
961baf5664fSJonas Devlieghere                      description);
962baf5664fSJonas Devlieghere 
963da7bc7d0SGreg Clayton   Stream &strm = description.ref();
964da7bc7d0SGreg Clayton 
965bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
966bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
9674fc6cb9cSJim Ingham 
968b57e4a1bSJason Molenda   StackFrame *frame;
969d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
9707730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
971b9c1b51eSKate Stone   if (target && process) {
9727fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
973b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
9747730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
975b9c1b51eSKate Stone       if (frame) {
976d9e416c0SGreg Clayton         frame->DumpUsingSettingsFormat(&strm);
9777730b9a4SJim Ingham       }
978c9858e4dSGreg Clayton     }
979c9858e4dSGreg Clayton 
980b9c1b51eSKate Stone   } else
981da7bc7d0SGreg Clayton     strm.PutCString("No value");
982dde9cff3SCaroline Tice 
983dde9cff3SCaroline Tice   return true;
984dde9cff3SCaroline Tice }
9851d3afba3SGreg Clayton 
986b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) {
987baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, (const char *),
988baf5664fSJonas Devlieghere                      expr);
989baf5664fSJonas Devlieghere 
990316d498bSGreg Clayton   SBValue result;
991c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
992c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
993c481c7eeSJim Ingham 
994b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
995d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
996b9c1b51eSKate Stone   if (frame && target) {
99735e1bda6SJim Ingham     SBExpressionOptions options;
998b9c1b51eSKate Stone     lldb::DynamicValueType fetch_dynamic_value =
999b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
1000cced1566SGreg Clayton     options.SetFetchDynamicValue(fetch_dynamic_value);
100135e1bda6SJim Ingham     options.SetUnwindOnError(true);
100224785bd0SEugene Leviant     options.SetIgnoreBreakpoints(true);
1003998c8a1cSRyan Brown     if (target->GetLanguage() != eLanguageTypeUnknown)
1004998c8a1cSRyan Brown       options.SetLanguage(target->GetLanguage());
1005998c8a1cSRyan Brown     else
1006998c8a1cSRyan Brown       options.SetLanguage(frame->GetLanguage());
1007baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(EvaluateExpression(expr, options));
1008316d498bSGreg Clayton   }
1009baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(result);
101078a685aaSJim Ingham }
101178a685aaSJim Ingham 
101278a685aaSJim Ingham SBValue
1013b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr,
1014b9c1b51eSKate Stone                             lldb::DynamicValueType fetch_dynamic_value) {
1015baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1016baf5664fSJonas Devlieghere                      (const char *, lldb::DynamicValueType), expr,
1017baf5664fSJonas Devlieghere                      fetch_dynamic_value);
1018baf5664fSJonas Devlieghere 
101935e1bda6SJim Ingham   SBExpressionOptions options;
1020cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
102135e1bda6SJim Ingham   options.SetUnwindOnError(true);
102224785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1023c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1024c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1025c481c7eeSJim Ingham 
1026998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1027998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1028998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1029998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1030998c8a1cSRyan Brown   else if (frame)
1031998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
1032baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(EvaluateExpression(expr, options));
10337ba6e991SJim Ingham }
10347ba6e991SJim Ingham 
1035b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr,
1036b9c1b51eSKate Stone                                     lldb::DynamicValueType fetch_dynamic_value,
1037b9c1b51eSKate Stone                                     bool unwind_on_error) {
1038baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1039baf5664fSJonas Devlieghere                      (const char *, lldb::DynamicValueType, bool), expr,
1040baf5664fSJonas Devlieghere                      fetch_dynamic_value, unwind_on_error);
1041baf5664fSJonas Devlieghere 
104235e1bda6SJim Ingham   SBExpressionOptions options;
1043c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1044c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1045c481c7eeSJim Ingham 
1046cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
104735e1bda6SJim Ingham   options.SetUnwindOnError(unwind_on_error);
104824785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1049998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1050998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1051998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1052998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1053998c8a1cSRyan Brown   else if (frame)
1054998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
1055baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(EvaluateExpression(expr, options));
105635e1bda6SJim Ingham }
105735e1bda6SJim Ingham 
1058b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr,
1059b9c1b51eSKate Stone                                           const SBExpressionOptions &options) {
1060baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1061baf5664fSJonas Devlieghere                      (const char *, const lldb::SBExpressionOptions &), expr,
1062baf5664fSJonas Devlieghere                      options);
1063baf5664fSJonas Devlieghere 
10645160ce5cSGreg Clayton   Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1065a162ebafSSean Callanan 
106669b582faSGreg Clayton   SBValue expr_result;
10677730b9a4SJim Ingham 
1068b9c1b51eSKate Stone   if (expr == nullptr || expr[0] == '\0') {
1069baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(expr_result);
10707730b9a4SJim Ingham   }
10717730b9a4SJim Ingham 
107281e871edSGreg Clayton   ValueObjectSP expr_value_sp;
10734838131bSGreg Clayton 
1074bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1075bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
10764fc6cb9cSJim Ingham 
1077b9556accSGreg Clayton 
1078dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
10797730b9a4SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
10807730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
10817730b9a4SJim Ingham 
1082b9c1b51eSKate Stone   if (target && process) {
10837fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1084b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
10857730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1086b9c1b51eSKate Stone       if (frame) {
10878f7db52dSJim Ingham         std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace;
1088b9c1b51eSKate Stone         if (target->GetDisplayExpressionsInCrashlogs()) {
10891ba7c4d0SGreg Clayton           StreamString frame_description;
1090d9e416c0SGreg Clayton           frame->DumpUsingSettingsFormat(&frame_description);
1091a8f3ae7cSJonas Devlieghere           stack_trace = std::make_unique<llvm::PrettyStackTraceFormat>(
1092b9c1b51eSKate Stone               "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value "
1093b9c1b51eSKate Stone               "= %u) %s",
1094b9c1b51eSKate Stone               expr, options.GetFetchDynamicValue(),
1095c156427dSZachary Turner               frame_description.GetData());
1096fb6621efSGreg Clayton         }
1097fb6621efSGreg Clayton 
1098370e5dbaSPavel Labath         target->EvaluateExpression(expr, frame, expr_value_sp, options.ref());
1099e3e91517SEnrico Granata         expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
11007730b9a4SJim Ingham       }
1101c9858e4dSGreg Clayton     }
11027fdf9ef1SGreg Clayton   }
11034838131bSGreg Clayton 
110463e5fb76SJonas Devlieghere   LLDB_LOGF(expr_log,
110563e5fb76SJonas Devlieghere             "** [SBFrame::EvaluateExpression] Expression result is "
1106b9c1b51eSKate Stone             "%s, summary %s **",
1107324a1036SSaleem Abdulrasool             expr_result.GetValue(), expr_result.GetSummary());
11084838131bSGreg Clayton 
1109baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(expr_result);
11101d3afba3SGreg Clayton }
1111316d498bSGreg Clayton 
1112b9c1b51eSKate Stone bool SBFrame::IsInlined() {
1113baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsInlined);
1114baf5664fSJonas Devlieghere 
111505f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->IsInlined();
111605f75e9fSOleksiy Vyalov }
111705f75e9fSOleksiy Vyalov 
1118b9c1b51eSKate Stone bool SBFrame::IsInlined() const {
1119baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsInlined);
1120baf5664fSJonas Devlieghere 
1121c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1122c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1123c481c7eeSJim Ingham 
1124dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1125d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
11267730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1127b9c1b51eSKate Stone   if (target && process) {
11287fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1129b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
11307730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1131b9c1b51eSKate Stone       if (frame) {
11327fdf9ef1SGreg Clayton 
1133d9e416c0SGreg Clayton         Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1134316d498bSGreg Clayton         if (block)
1135dbb0abbfSEugene Zelenko           return block->GetContainingInlinedBlock() != nullptr;
11367730b9a4SJim Ingham       }
1137c9858e4dSGreg Clayton     }
11387fdf9ef1SGreg Clayton   }
1139316d498bSGreg Clayton   return false;
1140316d498bSGreg Clayton }
1141316d498bSGreg Clayton 
11424b36f791SVedant Kumar bool SBFrame::IsArtificial() {
1143baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsArtificial);
1144baf5664fSJonas Devlieghere 
11454b36f791SVedant Kumar   return static_cast<const SBFrame *>(this)->IsArtificial();
11464b36f791SVedant Kumar }
11474b36f791SVedant Kumar 
11484b36f791SVedant Kumar bool SBFrame::IsArtificial() const {
1149baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsArtificial);
1150baf5664fSJonas Devlieghere 
11514b36f791SVedant Kumar   std::unique_lock<std::recursive_mutex> lock;
11524b36f791SVedant Kumar   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
11534b36f791SVedant Kumar 
11544b36f791SVedant Kumar   StackFrame *frame = exe_ctx.GetFramePtr();
11554b36f791SVedant Kumar   if (frame)
11564b36f791SVedant Kumar     return frame->IsArtificial();
11574b36f791SVedant Kumar 
11584b36f791SVedant Kumar   return false;
11594b36f791SVedant Kumar }
11604b36f791SVedant Kumar 
1161b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() {
1162baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetFunctionName);
1163baf5664fSJonas Devlieghere 
116405f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->GetFunctionName();
116505f75e9fSOleksiy Vyalov }
116605f75e9fSOleksiy Vyalov 
1167bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const {
1168baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::LanguageType, SBFrame, GuessLanguage);
1169baf5664fSJonas Devlieghere 
1170bdbdd229SJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1171bdbdd229SJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1172bdbdd229SJim Ingham 
1173bdbdd229SJim Ingham   StackFrame *frame = nullptr;
1174bdbdd229SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
1175bdbdd229SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1176bdbdd229SJim Ingham   if (target && process) {
1177bdbdd229SJim Ingham     Process::StopLocker stop_locker;
1178bdbdd229SJim Ingham     if (stop_locker.TryLock(&process->GetRunLock())) {
1179bdbdd229SJim Ingham       frame = exe_ctx.GetFramePtr();
1180bdbdd229SJim Ingham       if (frame) {
1181bdbdd229SJim Ingham         return frame->GuessLanguage();
1182bdbdd229SJim Ingham       }
1183bdbdd229SJim Ingham     }
1184bdbdd229SJim Ingham   }
1185bdbdd229SJim Ingham   return eLanguageTypeUnknown;
1186bdbdd229SJim Ingham }
1187bdbdd229SJim Ingham 
1188b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const {
1189baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, GetFunctionName);
1190baf5664fSJonas Devlieghere 
1191dbb0abbfSEugene Zelenko   const char *name = nullptr;
1192c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1193c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1194c481c7eeSJim Ingham 
1195dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1196d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
11977730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1198b9c1b51eSKate Stone   if (target && process) {
11997fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1200b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
12017730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1202b9c1b51eSKate Stone       if (frame) {
1203b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1204b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1205b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1206b9c1b51eSKate Stone         if (sc.block) {
1207316d498bSGreg Clayton           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1208b9c1b51eSKate Stone           if (inlined_block) {
1209b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1210b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
121122b04487SAlex Langford             name = inlined_info->GetName().AsCString();
1212316d498bSGreg Clayton           }
1213316d498bSGreg Clayton         }
1214316d498bSGreg Clayton 
1215b9c1b51eSKate Stone         if (name == nullptr) {
1216316d498bSGreg Clayton           if (sc.function)
1217316d498bSGreg Clayton             name = sc.function->GetName().GetCString();
1218316d498bSGreg Clayton         }
1219316d498bSGreg Clayton 
1220b9c1b51eSKate Stone         if (name == nullptr) {
1221316d498bSGreg Clayton           if (sc.symbol)
1222316d498bSGreg Clayton             name = sc.symbol->GetName().GetCString();
1223316d498bSGreg Clayton         }
12247730b9a4SJim Ingham       }
1225c9858e4dSGreg Clayton     }
12267fdf9ef1SGreg Clayton   }
1227316d498bSGreg Clayton   return name;
1228316d498bSGreg Clayton }
1229c1f705c2SEnrico Granata 
1230b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() {
1231baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetDisplayFunctionName);
1232baf5664fSJonas Devlieghere 
1233dbb0abbfSEugene Zelenko   const char *name = nullptr;
1234c481c7eeSJim Ingham 
1235c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1236c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1237c481c7eeSJim Ingham 
1238dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1239c1f705c2SEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
1240c1f705c2SEnrico Granata   Process *process = exe_ctx.GetProcessPtr();
1241b9c1b51eSKate Stone   if (target && process) {
1242c1f705c2SEnrico Granata     Process::StopLocker stop_locker;
1243b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1244c1f705c2SEnrico Granata       frame = exe_ctx.GetFramePtr();
1245b9c1b51eSKate Stone       if (frame) {
1246b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1247b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1248b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1249b9c1b51eSKate Stone         if (sc.block) {
1250c1f705c2SEnrico Granata           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1251b9c1b51eSKate Stone           if (inlined_block) {
1252b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1253b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
125422b04487SAlex Langford             name = inlined_info->GetDisplayName().AsCString();
1255c1f705c2SEnrico Granata           }
1256c1f705c2SEnrico Granata         }
1257c1f705c2SEnrico Granata 
1258b9c1b51eSKate Stone         if (name == nullptr) {
1259c1f705c2SEnrico Granata           if (sc.function)
1260c1f705c2SEnrico Granata             name = sc.function->GetDisplayName().GetCString();
1261c1f705c2SEnrico Granata         }
1262c1f705c2SEnrico Granata 
1263b9c1b51eSKate Stone         if (name == nullptr) {
1264c1f705c2SEnrico Granata           if (sc.symbol)
1265c1f705c2SEnrico Granata             name = sc.symbol->GetDisplayName().GetCString();
1266c1f705c2SEnrico Granata         }
1267c1f705c2SEnrico Granata       }
1268c1f705c2SEnrico Granata     }
1269c1f705c2SEnrico Granata   }
1270c1f705c2SEnrico Granata   return name;
1271c1f705c2SEnrico Granata }
1272