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 
17baf5664fSJonas Devlieghere #include "SBReproducerPrivate.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 
67bd4bf82aSJonas Devlieghere SBFrame::SBFrame(const SBFrame &rhs) : m_opaque_sp() {
68baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBFrame, (const lldb::SBFrame &), rhs);
69baf5664fSJonas Devlieghere 
70bd4bf82aSJonas Devlieghere   m_opaque_sp = clone(rhs.m_opaque_sp);
71bd4bf82aSJonas Devlieghere }
72efabb123SGreg Clayton 
73dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default;
74dbb0abbfSEugene Zelenko 
75b9c1b51eSKate Stone const SBFrame &SBFrame::operator=(const SBFrame &rhs) {
76baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(const lldb::SBFrame &,
77baf5664fSJonas Devlieghere                      SBFrame, operator=,(const lldb::SBFrame &), rhs);
78baf5664fSJonas Devlieghere 
79efabb123SGreg Clayton   if (this != &rhs)
80bd4bf82aSJonas Devlieghere     m_opaque_sp = clone(rhs.m_opaque_sp);
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);
122dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
123d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1247730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
125b9c1b51eSKate Stone   if (target && process) {
1267fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
127b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1287730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
129581af8b0SJonas Devlieghere       if (frame)
130991e4453SZachary Turner         sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext(scope));
131c9858e4dSGreg Clayton     }
1327fdf9ef1SGreg Clayton   }
133ceb6b139SCaroline Tice 
134baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_sym_ctx);
13530fdc8d8SChris Lattner }
13630fdc8d8SChris Lattner 
137b9c1b51eSKate Stone SBModule SBFrame::GetModule() const {
138baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBModule, SBFrame, GetModule);
139baf5664fSJonas Devlieghere 
14072eff18aSGreg Clayton   SBModule sb_module;
141acdbe816SGreg Clayton   ModuleSP module_sp;
142bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
143bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1444fc6cb9cSJim Ingham 
145dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
146d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1477730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
148b9c1b51eSKate Stone   if (target && process) {
1497fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
150b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1517730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
152b9c1b51eSKate Stone       if (frame) {
153d9e416c0SGreg Clayton         module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp;
154acdbe816SGreg Clayton         sb_module.SetSP(module_sp);
155c9858e4dSGreg Clayton       }
1567fdf9ef1SGreg Clayton     }
157581af8b0SJonas Devlieghere   }
1584838131bSGreg Clayton 
159baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_module);
16030fdc8d8SChris Lattner }
16130fdc8d8SChris Lattner 
162b9c1b51eSKate Stone SBCompileUnit SBFrame::GetCompileUnit() const {
163baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBCompileUnit, SBFrame,
164baf5664fSJonas Devlieghere                                    GetCompileUnit);
165baf5664fSJonas Devlieghere 
16672eff18aSGreg Clayton   SBCompileUnit sb_comp_unit;
167bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
168bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1694fc6cb9cSJim Ingham 
170dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
171d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1727730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
173b9c1b51eSKate Stone   if (target && process) {
1747fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
175b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1767730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
177b9c1b51eSKate Stone       if (frame) {
178b9c1b51eSKate Stone         sb_comp_unit.reset(
179b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit);
180c9858e4dSGreg Clayton       }
181c9858e4dSGreg Clayton     }
182581af8b0SJonas Devlieghere   }
183ceb6b139SCaroline Tice 
184baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_comp_unit);
18530fdc8d8SChris Lattner }
18630fdc8d8SChris Lattner 
187b9c1b51eSKate Stone SBFunction SBFrame::GetFunction() const {
188baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFunction, SBFrame, GetFunction);
189baf5664fSJonas Devlieghere 
19072eff18aSGreg Clayton   SBFunction sb_function;
191bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
192bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1934fc6cb9cSJim Ingham 
194dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
195d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1967730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
197b9c1b51eSKate Stone   if (target && process) {
1987fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
199b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2007730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
201b9c1b51eSKate Stone       if (frame) {
202b9c1b51eSKate Stone         sb_function.reset(
203b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextFunction).function);
2047fdf9ef1SGreg Clayton       }
205c9858e4dSGreg Clayton     }
206581af8b0SJonas Devlieghere   }
2074838131bSGreg Clayton 
208baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_function);
20930fdc8d8SChris Lattner }
21030fdc8d8SChris Lattner 
211b9c1b51eSKate Stone SBSymbol SBFrame::GetSymbol() const {
212baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBSymbol, SBFrame, GetSymbol);
213baf5664fSJonas Devlieghere 
21472eff18aSGreg Clayton   SBSymbol sb_symbol;
215bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
216bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2174fc6cb9cSJim Ingham 
218dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
219d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2207730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
221b9c1b51eSKate Stone   if (target && process) {
2227fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
223b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2247730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
225b9c1b51eSKate Stone       if (frame) {
226d9e416c0SGreg Clayton         sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol);
2277fdf9ef1SGreg Clayton       }
228c9858e4dSGreg Clayton     }
229581af8b0SJonas Devlieghere   }
230581af8b0SJonas Devlieghere 
231baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_symbol);
2323b06557eSGreg Clayton }
2333b06557eSGreg Clayton 
234b9c1b51eSKate Stone SBBlock SBFrame::GetBlock() const {
235baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBlock, SBFrame, GetBlock);
236baf5664fSJonas Devlieghere 
23772eff18aSGreg Clayton   SBBlock sb_block;
238bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
239bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2404fc6cb9cSJim Ingham 
241dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
242d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2437730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
244b9c1b51eSKate Stone   if (target && process) {
2457fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
246b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2477730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
248581af8b0SJonas Devlieghere       if (frame)
249d9e416c0SGreg Clayton         sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block);
2507fdf9ef1SGreg Clayton     }
251c9858e4dSGreg Clayton   }
252baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_block);
25330fdc8d8SChris Lattner }
25430fdc8d8SChris Lattner 
255b9c1b51eSKate Stone SBBlock SBFrame::GetFrameBlock() const {
256baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBlock, SBFrame, GetFrameBlock);
257baf5664fSJonas Devlieghere 
25872eff18aSGreg Clayton   SBBlock sb_block;
259bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
260bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2614fc6cb9cSJim Ingham 
262dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
263d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2647730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
265b9c1b51eSKate Stone   if (target && process) {
2667fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
267b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2687730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
269581af8b0SJonas Devlieghere       if (frame)
270d9e416c0SGreg Clayton         sb_block.SetPtr(frame->GetFrameBlock());
2717fdf9ef1SGreg Clayton     }
272c9858e4dSGreg Clayton   }
273baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_block);
27495897c6aSGreg Clayton }
27595897c6aSGreg Clayton 
276b9c1b51eSKate Stone SBLineEntry SBFrame::GetLineEntry() const {
277baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBLineEntry, SBFrame, GetLineEntry);
278baf5664fSJonas Devlieghere 
27972eff18aSGreg Clayton   SBLineEntry sb_line_entry;
280bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
281bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2824fc6cb9cSJim Ingham 
283dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
284d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2857730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
286b9c1b51eSKate Stone   if (target && process) {
2877fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
288b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2897730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
290b9c1b51eSKate Stone       if (frame) {
291b9c1b51eSKate Stone         sb_line_entry.SetLineEntry(
292b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextLineEntry).line_entry);
2937fdf9ef1SGreg Clayton       }
294c9858e4dSGreg Clayton     }
295581af8b0SJonas Devlieghere   }
296baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_line_entry);
29730fdc8d8SChris Lattner }
29830fdc8d8SChris Lattner 
299b9c1b51eSKate Stone uint32_t SBFrame::GetFrameID() const {
300baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBFrame, GetFrameID);
301baf5664fSJonas Devlieghere 
302b9556accSGreg Clayton   uint32_t frame_idx = UINT32_MAX;
303b9556accSGreg Clayton 
304c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
305c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
306c481c7eeSJim Ingham 
307b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
3087fdf9ef1SGreg Clayton   if (frame)
309d9e416c0SGreg Clayton     frame_idx = frame->GetFrameIndex();
3104838131bSGreg Clayton 
3114838131bSGreg Clayton   return frame_idx;
31230fdc8d8SChris Lattner }
31330fdc8d8SChris Lattner 
314b9c1b51eSKate Stone lldb::addr_t SBFrame::GetCFA() const {
315baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetCFA);
316baf5664fSJonas Devlieghere 
317c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
318c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
319c481c7eeSJim Ingham 
320424a5dbcSGreg Clayton   StackFrame *frame = exe_ctx.GetFramePtr();
321424a5dbcSGreg Clayton   if (frame)
322424a5dbcSGreg Clayton     return frame->GetStackID().GetCallFrameAddress();
323424a5dbcSGreg Clayton   return LLDB_INVALID_ADDRESS;
324424a5dbcSGreg Clayton }
325424a5dbcSGreg Clayton 
326b9c1b51eSKate Stone addr_t SBFrame::GetPC() const {
327baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetPC);
328baf5664fSJonas Devlieghere 
32969b582faSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
330bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
331bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3324fc6cb9cSJim Ingham 
333dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
334d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3357730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
336b9c1b51eSKate Stone   if (target && process) {
3377fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
338b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3397730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
340b9c1b51eSKate Stone       if (frame) {
341b9c1b51eSKate Stone         addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress(
34204803b3eSTatyana Krasnukha             target, AddressClass::eCode);
343c9858e4dSGreg Clayton       }
3447fdf9ef1SGreg Clayton     }
345581af8b0SJonas Devlieghere   }
346ceb6b139SCaroline Tice 
347ceb6b139SCaroline Tice   return addr;
34830fdc8d8SChris Lattner }
34930fdc8d8SChris Lattner 
350b9c1b51eSKate Stone bool SBFrame::SetPC(addr_t new_pc) {
351baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBFrame, SetPC, (lldb::addr_t), new_pc);
352baf5664fSJonas Devlieghere 
353ceb6b139SCaroline Tice   bool ret_val = false;
354bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
355bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3564fc6cb9cSJim Ingham 
357d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3587730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
359b9c1b51eSKate Stone   if (target && process) {
3607fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
361b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3620d7401cfSMed Ismail Bennani       if (StackFrame *frame = exe_ctx.GetFramePtr()) {
3630d7401cfSMed Ismail Bennani         if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
3640d7401cfSMed Ismail Bennani           ret_val = reg_ctx_sp->SetPC(new_pc);
3650d7401cfSMed Ismail Bennani         }
366c9858e4dSGreg Clayton       }
3677fdf9ef1SGreg Clayton     }
368581af8b0SJonas Devlieghere   }
369ceb6b139SCaroline Tice 
370ceb6b139SCaroline Tice   return ret_val;
37130fdc8d8SChris Lattner }
37230fdc8d8SChris Lattner 
373b9c1b51eSKate Stone addr_t SBFrame::GetSP() const {
374baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetSP);
375baf5664fSJonas Devlieghere 
3764838131bSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
377bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
378bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3794fc6cb9cSJim Ingham 
380d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3817730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
382b9c1b51eSKate Stone   if (target && process) {
3837fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
384b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3850d7401cfSMed Ismail Bennani       if (StackFrame *frame = exe_ctx.GetFramePtr()) {
3860d7401cfSMed Ismail Bennani         if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
3870d7401cfSMed Ismail Bennani           addr = reg_ctx_sp->GetSP();
3880d7401cfSMed Ismail Bennani         }
3897fdf9ef1SGreg Clayton       }
390c9858e4dSGreg Clayton     }
391581af8b0SJonas Devlieghere   }
3924838131bSGreg Clayton 
3934838131bSGreg Clayton   return addr;
39430fdc8d8SChris Lattner }
39530fdc8d8SChris Lattner 
396b9c1b51eSKate Stone addr_t SBFrame::GetFP() const {
397baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetFP);
398baf5664fSJonas Devlieghere 
39969b582faSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
400bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
401bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4024fc6cb9cSJim Ingham 
403d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4047730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
405b9c1b51eSKate Stone   if (target && process) {
4067fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
407b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4080d7401cfSMed Ismail Bennani       if (StackFrame *frame = exe_ctx.GetFramePtr()) {
4090d7401cfSMed Ismail Bennani         if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
4100d7401cfSMed Ismail Bennani           addr = reg_ctx_sp->GetFP();
4110d7401cfSMed Ismail Bennani         }
4120d7401cfSMed Ismail Bennani       }
413c9858e4dSGreg Clayton     }
4147fdf9ef1SGreg Clayton   }
415ceb6b139SCaroline Tice 
416ceb6b139SCaroline Tice   return addr;
41730fdc8d8SChris Lattner }
41830fdc8d8SChris Lattner 
419b9c1b51eSKate Stone SBAddress SBFrame::GetPCAddress() const {
420baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBFrame, GetPCAddress);
421baf5664fSJonas Devlieghere 
42230fdc8d8SChris Lattner   SBAddress sb_addr;
423bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
424bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4254fc6cb9cSJim Ingham 
426b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
427d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4287730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
429b9c1b51eSKate Stone   if (target && process) {
4307fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
431b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4327730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
433581af8b0SJonas Devlieghere       if (frame)
434*6cd4a4cdSJonas Devlieghere         sb_addr.SetAddress(frame->GetFrameCodeAddress());
4357fdf9ef1SGreg Clayton     }
436c9858e4dSGreg Clayton   }
437baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_addr);
43830fdc8d8SChris Lattner }
43930fdc8d8SChris Lattner 
440baf5664fSJonas Devlieghere void SBFrame::Clear() {
441baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBFrame, Clear);
442baf5664fSJonas Devlieghere 
443baf5664fSJonas Devlieghere   m_opaque_sp->Clear();
444baf5664fSJonas Devlieghere }
44530fdc8d8SChris Lattner 
446b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) {
447baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath,
448baf5664fSJonas Devlieghere                      (const char *), var_path);
449baf5664fSJonas Devlieghere 
4507edbdfc9SGreg Clayton   SBValue sb_value;
451c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
452c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
453c481c7eeSJim Ingham 
454b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
455d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
456b9c1b51eSKate Stone   if (frame && target) {
457b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
458b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
4597edbdfc9SGreg Clayton     sb_value = GetValueForVariablePath(var_path, use_dynamic);
4607edbdfc9SGreg Clayton   }
461baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value);
4627edbdfc9SGreg Clayton }
4637edbdfc9SGreg Clayton 
464b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path,
465b9c1b51eSKate Stone                                                DynamicValueType use_dynamic) {
466baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath,
467baf5664fSJonas Devlieghere                      (const char *, lldb::DynamicValueType), var_path,
468baf5664fSJonas Devlieghere                      use_dynamic);
469baf5664fSJonas Devlieghere 
4707edbdfc9SGreg Clayton   SBValue sb_value;
471b9c1b51eSKate Stone   if (var_path == nullptr || var_path[0] == '\0') {
472baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_value);
4737730b9a4SJim Ingham   }
4747730b9a4SJim Ingham 
475bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
476bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4774fc6cb9cSJim Ingham 
478dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
479d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4807730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
481b9c1b51eSKate Stone   if (target && process) {
4827fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
483b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4847730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
485b9c1b51eSKate Stone       if (frame) {
4867edbdfc9SGreg Clayton         VariableSP var_sp;
48797206d57SZachary Turner         Status error;
488b9c1b51eSKate Stone         ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath(
489b9c1b51eSKate Stone             var_path, eNoDynamicValues,
490b9c1b51eSKate Stone             StackFrame::eExpressionPathOptionCheckPtrVsMember |
491b9c1b51eSKate Stone                 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
492b9c1b51eSKate Stone             var_sp, error));
493e3e91517SEnrico Granata         sb_value.SetSP(value_sp, use_dynamic);
4947730b9a4SJim Ingham       }
495c9858e4dSGreg Clayton     }
4967fdf9ef1SGreg Clayton   }
497baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value);
4987edbdfc9SGreg Clayton }
4997edbdfc9SGreg Clayton 
500b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name) {
501baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *),
502baf5664fSJonas Devlieghere                      name);
503baf5664fSJonas Devlieghere 
504316d498bSGreg Clayton   SBValue value;
505c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
506c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
507c481c7eeSJim Ingham 
508b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
509d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
510b9c1b51eSKate Stone   if (frame && target) {
511b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
512b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
513316d498bSGreg Clayton     value = FindVariable(name, use_dynamic);
514316d498bSGreg Clayton   }
515baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value);
51678a685aaSJim Ingham }
51778a685aaSJim Ingham 
518b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name,
519b9c1b51eSKate Stone                               lldb::DynamicValueType use_dynamic) {
520baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable,
521baf5664fSJonas Devlieghere                      (const char *, lldb::DynamicValueType), name, use_dynamic);
522baf5664fSJonas Devlieghere 
52369b582faSGreg Clayton   VariableSP var_sp;
52458b59f95SJim Ingham   SBValue sb_value;
5257730b9a4SJim Ingham 
526b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
527baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_value);
5287730b9a4SJim Ingham   }
5297730b9a4SJim Ingham 
53081e871edSGreg Clayton   ValueObjectSP value_sp;
531bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
532bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5334fc6cb9cSJim Ingham 
534dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
535d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5367730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
537b9c1b51eSKate Stone   if (target && process) {
5387fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
539b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5407730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
541b9c1b51eSKate Stone       if (frame) {
542e23d0b63SShafik Yaghmour         value_sp = frame->FindVariable(ConstString(name));
54330fdc8d8SChris Lattner 
544e23d0b63SShafik Yaghmour         if (value_sp)
545e3e91517SEnrico Granata           sb_value.SetSP(value_sp, use_dynamic);
546c9858e4dSGreg Clayton       }
547316d498bSGreg Clayton     }
548581af8b0SJonas Devlieghere   }
5494838131bSGreg Clayton 
550baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value);
551dde9cff3SCaroline Tice }
552dde9cff3SCaroline Tice 
553b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) {
554baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue,
555baf5664fSJonas Devlieghere                      (const char *, lldb::ValueType), name, value_type);
556baf5664fSJonas Devlieghere 
557316d498bSGreg Clayton   SBValue value;
558c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
559c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
560c481c7eeSJim Ingham 
561b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
562d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
563b9c1b51eSKate Stone   if (frame && target) {
564b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
565b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
566316d498bSGreg Clayton     value = FindValue(name, value_type, use_dynamic);
567316d498bSGreg Clayton   }
568baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value);
56978a685aaSJim Ingham }
57078a685aaSJim Ingham 
571b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type,
572b9c1b51eSKate Stone                            lldb::DynamicValueType use_dynamic) {
573baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue,
574baf5664fSJonas Devlieghere                      (const char *, lldb::ValueType, lldb::DynamicValueType),
575baf5664fSJonas Devlieghere                      name, value_type, use_dynamic);
576baf5664fSJonas Devlieghere 
57769b582faSGreg Clayton   SBValue sb_value;
5787730b9a4SJim Ingham 
579b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
580baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_value);
5817730b9a4SJim Ingham   }
5827730b9a4SJim Ingham 
58381e871edSGreg Clayton   ValueObjectSP value_sp;
584bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
585bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5864fc6cb9cSJim Ingham 
587dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
588d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5897730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
590b9c1b51eSKate Stone   if (target && process) {
5917fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
592b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5937730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
594b9c1b51eSKate Stone       if (frame) {
5958a2a0dfbSEnrico Granata         VariableList variable_list;
5968a2a0dfbSEnrico Granata 
597b9c1b51eSKate Stone         switch (value_type) {
59869b582faSGreg Clayton         case eValueTypeVariableGlobal:      // global variable
59969b582faSGreg Clayton         case eValueTypeVariableStatic:      // static variable
60069b582faSGreg Clayton         case eValueTypeVariableArgument:    // function argument variables
60169b582faSGreg Clayton         case eValueTypeVariableLocal:       // function local variables
60263a27afaSGreg Clayton         case eValueTypeVariableThreadLocal: // thread local variables
60369b582faSGreg Clayton         {
604d9e416c0SGreg Clayton           SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock));
60572eff18aSGreg Clayton 
60672eff18aSGreg Clayton           const bool can_create = true;
60772eff18aSGreg Clayton           const bool get_parent_variables = true;
60872eff18aSGreg Clayton           const bool stop_if_block_is_inlined_function = true;
60972eff18aSGreg Clayton 
6100efb51a0SChaoren Lin           if (sc.block)
611b9c1b51eSKate Stone             sc.block->AppendVariables(
612b9c1b51eSKate Stone                 can_create, get_parent_variables,
613b9c1b51eSKate Stone                 stop_if_block_is_inlined_function,
614b9c1b51eSKate Stone                 [frame](Variable *v) { return v->IsInScope(frame); },
615b9c1b51eSKate Stone                 &variable_list);
616b9c1b51eSKate Stone           if (value_type == eValueTypeVariableGlobal) {
6178a2a0dfbSEnrico Granata             const bool get_file_globals = true;
6188a2a0dfbSEnrico Granata             VariableList *frame_vars = frame->GetVariableList(get_file_globals);
6198a2a0dfbSEnrico Granata             if (frame_vars)
6208a2a0dfbSEnrico Granata               frame_vars->AppendVariablesIfUnique(variable_list);
6218a2a0dfbSEnrico Granata           }
62269b582faSGreg Clayton           ConstString const_name(name);
623b9c1b51eSKate Stone           VariableSP variable_sp(
624b9c1b51eSKate Stone               variable_list.FindVariable(const_name, value_type));
625b9c1b51eSKate Stone           if (variable_sp) {
626b9c1b51eSKate Stone             value_sp = frame->GetValueObjectForFrameVariable(variable_sp,
627b9c1b51eSKate Stone                                                              eNoDynamicValues);
628e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
62930fdc8d8SChris Lattner           }
630b9c1b51eSKate Stone         } break;
63169b582faSGreg Clayton 
63269b582faSGreg Clayton         case eValueTypeRegister: // stack frame register value
63369b582faSGreg Clayton         {
634d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
635b9c1b51eSKate Stone           if (reg_ctx) {
63669b582faSGreg Clayton             const uint32_t num_regs = reg_ctx->GetRegisterCount();
637b9c1b51eSKate Stone             for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) {
638b9c1b51eSKate Stone               const RegisterInfo *reg_info =
639b9c1b51eSKate Stone                   reg_ctx->GetRegisterInfoAtIndex(reg_idx);
64069b582faSGreg Clayton               if (reg_info &&
64169b582faSGreg Clayton                   ((reg_info->name && strcasecmp(reg_info->name, name) == 0) ||
642b9c1b51eSKate Stone                    (reg_info->alt_name &&
643b9c1b51eSKate Stone                     strcasecmp(reg_info->alt_name, name) == 0))) {
644d9e416c0SGreg Clayton                 value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx);
64581e871edSGreg Clayton                 sb_value.SetSP(value_sp);
64681e871edSGreg Clayton                 break;
64769b582faSGreg Clayton               }
64869b582faSGreg Clayton             }
64969b582faSGreg Clayton           }
650b9c1b51eSKate Stone         } break;
65169b582faSGreg Clayton 
652b9c1b51eSKate Stone         case eValueTypeRegisterSet: // A collection of stack frame register
653b9c1b51eSKate Stone                                     // values
65469b582faSGreg Clayton         {
655d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
656b9c1b51eSKate Stone           if (reg_ctx) {
65769b582faSGreg Clayton             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
658b9c1b51eSKate Stone             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
65969b582faSGreg Clayton               const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx);
66069b582faSGreg Clayton               if (reg_set &&
66169b582faSGreg Clayton                   ((reg_set->name && strcasecmp(reg_set->name, name) == 0) ||
662b9c1b51eSKate Stone                    (reg_set->short_name &&
663b9c1b51eSKate Stone                     strcasecmp(reg_set->short_name, name) == 0))) {
664b9c1b51eSKate Stone                 value_sp =
665b9c1b51eSKate Stone                     ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx);
66681e871edSGreg Clayton                 sb_value.SetSP(value_sp);
66781e871edSGreg Clayton                 break;
66869b582faSGreg Clayton               }
66969b582faSGreg Clayton             }
67069b582faSGreg Clayton           }
671b9c1b51eSKate Stone         } break;
67269b582faSGreg Clayton 
67369b582faSGreg Clayton         case eValueTypeConstResult: // constant result variables
67469b582faSGreg Clayton         {
67569b582faSGreg Clayton           ConstString const_name(name);
676b9c1b51eSKate Stone           ExpressionVariableSP expr_var_sp(
677b9c1b51eSKate Stone               target->GetPersistentVariable(const_name));
678b9c1b51eSKate Stone           if (expr_var_sp) {
67981e871edSGreg Clayton             value_sp = expr_var_sp->GetValueObject();
680e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
68181e871edSGreg Clayton           }
682b9c1b51eSKate Stone         } break;
68369b582faSGreg Clayton 
68469b582faSGreg Clayton         default:
68569b582faSGreg Clayton           break;
68669b582faSGreg Clayton         }
687c9858e4dSGreg Clayton       }
6887fdf9ef1SGreg Clayton     }
689581af8b0SJonas Devlieghere   }
6904838131bSGreg Clayton 
691baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value);
692dde9cff3SCaroline Tice }
693dde9cff3SCaroline Tice 
694b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const {
695baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &),
696baf5664fSJonas Devlieghere                            that);
697baf5664fSJonas Devlieghere 
698b57e4a1bSJason Molenda   lldb::StackFrameSP this_sp = GetFrameSP();
699b57e4a1bSJason Molenda   lldb::StackFrameSP that_sp = that.GetFrameSP();
70035e2ab60SJohnny Chen   return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
70135e2ab60SJohnny Chen }
70235e2ab60SJohnny Chen 
703baf5664fSJonas Devlieghere bool SBFrame::operator==(const SBFrame &rhs) const {
704baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator==,(const lldb::SBFrame &),
705baf5664fSJonas Devlieghere                            rhs);
70630fdc8d8SChris Lattner 
707baf5664fSJonas Devlieghere   return IsEqual(rhs);
708baf5664fSJonas Devlieghere }
709baf5664fSJonas Devlieghere 
710baf5664fSJonas Devlieghere bool SBFrame::operator!=(const SBFrame &rhs) const {
711baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator!=,(const lldb::SBFrame &),
712baf5664fSJonas Devlieghere                            rhs);
713baf5664fSJonas Devlieghere 
714baf5664fSJonas Devlieghere   return !IsEqual(rhs);
715baf5664fSJonas Devlieghere }
71630fdc8d8SChris Lattner 
717b9c1b51eSKate Stone SBThread SBFrame::GetThread() const {
718baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBThread, SBFrame, GetThread);
719baf5664fSJonas Devlieghere 
720c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
721c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
722c481c7eeSJim Ingham 
723d9e416c0SGreg Clayton   ThreadSP thread_sp(exe_ctx.GetThreadSP());
724d9e416c0SGreg Clayton   SBThread sb_thread(thread_sp);
725ceb6b139SCaroline Tice 
726baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_thread);
72730fdc8d8SChris Lattner }
72830fdc8d8SChris Lattner 
729b9c1b51eSKate Stone const char *SBFrame::Disassemble() const {
730baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, Disassemble);
731baf5664fSJonas Devlieghere 
732dbb0abbfSEugene Zelenko   const char *disassembly = nullptr;
733bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
734bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
7354fc6cb9cSJim Ingham 
736dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
737d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
7387730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
739b9c1b51eSKate Stone   if (target && process) {
7407fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
741b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
7427730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
743b9c1b51eSKate Stone       if (frame) {
744d9e416c0SGreg Clayton         disassembly = frame->Disassemble();
7457fdf9ef1SGreg Clayton       }
746c9858e4dSGreg Clayton     }
747581af8b0SJonas Devlieghere   }
7484838131bSGreg Clayton 
7494838131bSGreg Clayton   return disassembly;
75030fdc8d8SChris Lattner }
75130fdc8d8SChris Lattner 
752b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics,
753b9c1b51eSKate Stone                                   bool in_scope_only) {
754baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables,
755baf5664fSJonas Devlieghere                      (bool, bool, bool, bool), arguments, locals, statics,
756baf5664fSJonas Devlieghere                      in_scope_only);
757baf5664fSJonas Devlieghere 
758316d498bSGreg Clayton   SBValueList value_list;
759c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
760c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
761c481c7eeSJim Ingham 
762b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
763d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
764b9c1b51eSKate Stone   if (frame && target) {
765b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
766b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
767b9c1b51eSKate Stone     const bool include_runtime_support_values =
768b9c1b51eSKate Stone         target ? target->GetDisplayRuntimeSupportValues() : false;
76951f96eebSZachary Turner 
77051f96eebSZachary Turner     SBVariablesOptions options;
77151f96eebSZachary Turner     options.SetIncludeArguments(arguments);
77251f96eebSZachary Turner     options.SetIncludeLocals(locals);
77351f96eebSZachary Turner     options.SetIncludeStatics(statics);
77451f96eebSZachary Turner     options.SetInScopeOnly(in_scope_only);
77551f96eebSZachary Turner     options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
77651f96eebSZachary Turner     options.SetUseDynamic(use_dynamic);
77751f96eebSZachary Turner 
77851f96eebSZachary Turner     value_list = GetVariables(options);
779316d498bSGreg Clayton   }
780baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value_list);
78178a685aaSJim Ingham }
78278a685aaSJim Ingham 
783b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals,
784b9c1b51eSKate Stone                                         bool statics, bool in_scope_only,
785b9c1b51eSKate Stone                                         lldb::DynamicValueType use_dynamic) {
786baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables,
787baf5664fSJonas Devlieghere                      (bool, bool, bool, bool, lldb::DynamicValueType),
788baf5664fSJonas Devlieghere                      arguments, locals, statics, in_scope_only, use_dynamic);
789baf5664fSJonas Devlieghere 
790c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
791c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
792c481c7eeSJim Ingham 
793560558ebSEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
794b9c1b51eSKate Stone   const bool include_runtime_support_values =
795b9c1b51eSKate Stone       target ? target->GetDisplayRuntimeSupportValues() : false;
79651f96eebSZachary Turner   SBVariablesOptions options;
79751f96eebSZachary Turner   options.SetIncludeArguments(arguments);
79851f96eebSZachary Turner   options.SetIncludeLocals(locals);
79951f96eebSZachary Turner   options.SetIncludeStatics(statics);
80051f96eebSZachary Turner   options.SetInScopeOnly(in_scope_only);
80151f96eebSZachary Turner   options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
80251f96eebSZachary Turner   options.SetUseDynamic(use_dynamic);
803baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(GetVariables(options));
804560558ebSEnrico Granata }
805560558ebSEnrico Granata 
806b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) {
807baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables,
808baf5664fSJonas Devlieghere                      (const lldb::SBVariablesOptions &), options);
809baf5664fSJonas Devlieghere 
810b9556accSGreg Clayton   SBValueList value_list;
811bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
812bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
8134fc6cb9cSJim Ingham 
814dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
815d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
816b9556accSGreg Clayton 
81751f96eebSZachary Turner   const bool statics = options.GetIncludeStatics();
81851f96eebSZachary Turner   const bool arguments = options.GetIncludeArguments();
8194c7f5d5cSKuba Mracek   const bool recognized_arguments =
8204c7f5d5cSKuba Mracek         options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP()));
82151f96eebSZachary Turner   const bool locals = options.GetIncludeLocals();
82251f96eebSZachary Turner   const bool in_scope_only = options.GetInScopeOnly();
823b9c1b51eSKate Stone   const bool include_runtime_support_values =
824b9c1b51eSKate Stone       options.GetIncludeRuntimeSupportValues();
82551f96eebSZachary Turner   const lldb::DynamicValueType use_dynamic = options.GetUseDynamic();
82651f96eebSZachary Turner 
827ceb6b139SCaroline Tice 
828349213f9SGreg Clayton   std::set<VariableSP> variable_set;
8297730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
830b9c1b51eSKate Stone   if (target && process) {
8317fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
832b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
8337730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
834b9c1b51eSKate Stone       if (frame) {
835dbb0abbfSEugene Zelenko         VariableList *variable_list = nullptr;
836d9e416c0SGreg Clayton         variable_list = frame->GetVariableList(true);
837b9c1b51eSKate Stone         if (variable_list) {
83830fdc8d8SChris Lattner           const size_t num_variables = variable_list->GetSize();
839b9c1b51eSKate Stone           if (num_variables) {
840d1782133SRaphael Isemann             for (const VariableSP &variable_sp : *variable_list) {
841b9c1b51eSKate Stone               if (variable_sp) {
84230fdc8d8SChris Lattner                 bool add_variable = false;
843b9c1b51eSKate Stone                 switch (variable_sp->GetScope()) {
84430fdc8d8SChris Lattner                 case eValueTypeVariableGlobal:
84530fdc8d8SChris Lattner                 case eValueTypeVariableStatic:
84663a27afaSGreg Clayton                 case eValueTypeVariableThreadLocal:
84730fdc8d8SChris Lattner                   add_variable = statics;
84830fdc8d8SChris Lattner                   break;
84930fdc8d8SChris Lattner 
85030fdc8d8SChris Lattner                 case eValueTypeVariableArgument:
85130fdc8d8SChris Lattner                   add_variable = arguments;
85230fdc8d8SChris Lattner                   break;
85330fdc8d8SChris Lattner 
85430fdc8d8SChris Lattner                 case eValueTypeVariableLocal:
85530fdc8d8SChris Lattner                   add_variable = locals;
85630fdc8d8SChris Lattner                   break;
857c982c768SGreg Clayton 
858c982c768SGreg Clayton                 default:
859c982c768SGreg Clayton                   break;
86030fdc8d8SChris Lattner                 }
861b9c1b51eSKate Stone                 if (add_variable) {
862349213f9SGreg Clayton                   // Only add variables once so we don't end up with duplicates
863349213f9SGreg Clayton                   if (variable_set.find(variable_sp) == variable_set.end())
864349213f9SGreg Clayton                     variable_set.insert(variable_sp);
865349213f9SGreg Clayton                   else
866349213f9SGreg Clayton                     continue;
867349213f9SGreg Clayton 
868d9e416c0SGreg Clayton                   if (in_scope_only && !variable_sp->IsInScope(frame))
86930fdc8d8SChris Lattner                     continue;
87030fdc8d8SChris Lattner 
871b9c1b51eSKate Stone                   ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable(
872b9c1b51eSKate Stone                       variable_sp, eNoDynamicValues));
873560558ebSEnrico Granata 
874b9c1b51eSKate Stone                   if (!include_runtime_support_values && valobj_sp != nullptr &&
875dbb0abbfSEugene Zelenko                       valobj_sp->IsRuntimeSupportValue())
876560558ebSEnrico Granata                     continue;
877560558ebSEnrico Granata 
878e3e91517SEnrico Granata                   SBValue value_sb;
879e3e91517SEnrico Granata                   value_sb.SetSP(valobj_sp, use_dynamic);
880e3e91517SEnrico Granata                   value_list.Append(value_sb);
88130fdc8d8SChris Lattner                 }
88230fdc8d8SChris Lattner               }
88330fdc8d8SChris Lattner             }
88430fdc8d8SChris Lattner           }
88530fdc8d8SChris Lattner         }
88641ae8e74SKuba Mracek         if (recognized_arguments) {
88741ae8e74SKuba Mracek           auto recognized_frame = frame->GetRecognizedFrame();
88841ae8e74SKuba Mracek           if (recognized_frame) {
88941ae8e74SKuba Mracek             ValueObjectListSP recognized_arg_list =
89041ae8e74SKuba Mracek                 recognized_frame->GetRecognizedArguments();
89141ae8e74SKuba Mracek             if (recognized_arg_list) {
89241ae8e74SKuba Mracek               for (auto &rec_value_sp : recognized_arg_list->GetObjects()) {
89341ae8e74SKuba Mracek                 SBValue value_sb;
89441ae8e74SKuba Mracek                 value_sb.SetSP(rec_value_sp, use_dynamic);
89541ae8e74SKuba Mracek                 value_list.Append(value_sb);
89641ae8e74SKuba Mracek               }
89741ae8e74SKuba Mracek             }
89841ae8e74SKuba Mracek           }
89941ae8e74SKuba Mracek         }
900c9858e4dSGreg Clayton       }
9017fdf9ef1SGreg Clayton     }
902581af8b0SJonas Devlieghere   }
903ceb6b139SCaroline Tice 
904baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value_list);
90530fdc8d8SChris Lattner }
90630fdc8d8SChris Lattner 
907b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() {
908baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBValueList, SBFrame, GetRegisters);
909baf5664fSJonas Devlieghere 
91030fdc8d8SChris Lattner   SBValueList value_list;
911bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
912bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
9134fc6cb9cSJim Ingham 
914dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
915d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
9167730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
917b9c1b51eSKate Stone   if (target && process) {
9187fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
919b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
9207730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
921b9c1b51eSKate Stone       if (frame) {
922d9e416c0SGreg Clayton         RegisterContextSP reg_ctx(frame->GetRegisterContext());
923b9c1b51eSKate Stone         if (reg_ctx) {
92430fdc8d8SChris Lattner           const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
925b9c1b51eSKate Stone           for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
926b9c1b51eSKate Stone             value_list.Append(
927b9c1b51eSKate Stone                 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx));
92830fdc8d8SChris Lattner           }
92930fdc8d8SChris Lattner         }
930c9858e4dSGreg Clayton       }
9317fdf9ef1SGreg Clayton     }
932581af8b0SJonas Devlieghere   }
933ceb6b139SCaroline Tice 
934baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value_list);
93530fdc8d8SChris Lattner }
93630fdc8d8SChris Lattner 
937b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) {
938baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *),
939baf5664fSJonas Devlieghere                      name);
940baf5664fSJonas Devlieghere 
941ad9a53c5SJason Molenda   SBValue result;
942ad9a53c5SJason Molenda   ValueObjectSP value_sp;
943bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
944bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
945ad9a53c5SJason Molenda 
946dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
947ad9a53c5SJason Molenda   Target *target = exe_ctx.GetTargetPtr();
948ad9a53c5SJason Molenda   Process *process = exe_ctx.GetProcessPtr();
949b9c1b51eSKate Stone   if (target && process) {
950ad9a53c5SJason Molenda     Process::StopLocker stop_locker;
951b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
952ad9a53c5SJason Molenda       frame = exe_ctx.GetFramePtr();
953b9c1b51eSKate Stone       if (frame) {
954ad9a53c5SJason Molenda         RegisterContextSP reg_ctx(frame->GetRegisterContext());
955b9c1b51eSKate Stone         if (reg_ctx) {
956ad9a53c5SJason Molenda           const uint32_t num_regs = reg_ctx->GetRegisterCount();
957b9c1b51eSKate Stone           for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) {
958b9c1b51eSKate Stone             const RegisterInfo *reg_info =
959b9c1b51eSKate Stone                 reg_ctx->GetRegisterInfoAtIndex(reg_idx);
960ad9a53c5SJason Molenda             if (reg_info &&
961ad9a53c5SJason Molenda                 ((reg_info->name && strcasecmp(reg_info->name, name) == 0) ||
962b9c1b51eSKate Stone                  (reg_info->alt_name &&
963b9c1b51eSKate Stone                   strcasecmp(reg_info->alt_name, name) == 0))) {
964ad9a53c5SJason Molenda               value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx);
965ad9a53c5SJason Molenda               result.SetSP(value_sp);
966ad9a53c5SJason Molenda               break;
967ad9a53c5SJason Molenda             }
968ad9a53c5SJason Molenda           }
969ad9a53c5SJason Molenda         }
970ad9a53c5SJason Molenda       }
971ad9a53c5SJason Molenda     }
972581af8b0SJonas Devlieghere   }
973ad9a53c5SJason Molenda 
974baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(result);
975ad9a53c5SJason Molenda }
976ad9a53c5SJason Molenda 
977b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) {
978baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &),
979baf5664fSJonas Devlieghere                      description);
980baf5664fSJonas Devlieghere 
981da7bc7d0SGreg Clayton   Stream &strm = description.ref();
982da7bc7d0SGreg Clayton 
983bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
984bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
9854fc6cb9cSJim Ingham 
986b57e4a1bSJason Molenda   StackFrame *frame;
987d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
9887730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
989b9c1b51eSKate Stone   if (target && process) {
9907fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
991b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
9927730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
993b9c1b51eSKate Stone       if (frame) {
994d9e416c0SGreg Clayton         frame->DumpUsingSettingsFormat(&strm);
9957730b9a4SJim Ingham       }
996c9858e4dSGreg Clayton     }
997c9858e4dSGreg Clayton 
998b9c1b51eSKate Stone   } else
999da7bc7d0SGreg Clayton     strm.PutCString("No value");
1000dde9cff3SCaroline Tice 
1001dde9cff3SCaroline Tice   return true;
1002dde9cff3SCaroline Tice }
10031d3afba3SGreg Clayton 
1004b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) {
1005baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, (const char *),
1006baf5664fSJonas Devlieghere                      expr);
1007baf5664fSJonas Devlieghere 
1008316d498bSGreg Clayton   SBValue result;
1009c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1010c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1011c481c7eeSJim Ingham 
1012b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
1013d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1014b9c1b51eSKate Stone   if (frame && target) {
101535e1bda6SJim Ingham     SBExpressionOptions options;
1016b9c1b51eSKate Stone     lldb::DynamicValueType fetch_dynamic_value =
1017b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
1018cced1566SGreg Clayton     options.SetFetchDynamicValue(fetch_dynamic_value);
101935e1bda6SJim Ingham     options.SetUnwindOnError(true);
102024785bd0SEugene Leviant     options.SetIgnoreBreakpoints(true);
1021998c8a1cSRyan Brown     if (target->GetLanguage() != eLanguageTypeUnknown)
1022998c8a1cSRyan Brown       options.SetLanguage(target->GetLanguage());
1023998c8a1cSRyan Brown     else
1024998c8a1cSRyan Brown       options.SetLanguage(frame->GetLanguage());
1025baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(EvaluateExpression(expr, options));
1026316d498bSGreg Clayton   }
1027baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(result);
102878a685aaSJim Ingham }
102978a685aaSJim Ingham 
103078a685aaSJim Ingham SBValue
1031b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr,
1032b9c1b51eSKate Stone                             lldb::DynamicValueType fetch_dynamic_value) {
1033baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1034baf5664fSJonas Devlieghere                      (const char *, lldb::DynamicValueType), expr,
1035baf5664fSJonas Devlieghere                      fetch_dynamic_value);
1036baf5664fSJonas Devlieghere 
103735e1bda6SJim Ingham   SBExpressionOptions options;
1038cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
103935e1bda6SJim Ingham   options.SetUnwindOnError(true);
104024785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1041c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1042c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1043c481c7eeSJim Ingham 
1044998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1045998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1046998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1047998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1048998c8a1cSRyan Brown   else if (frame)
1049998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
1050baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(EvaluateExpression(expr, options));
10517ba6e991SJim Ingham }
10527ba6e991SJim Ingham 
1053b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr,
1054b9c1b51eSKate Stone                                     lldb::DynamicValueType fetch_dynamic_value,
1055b9c1b51eSKate Stone                                     bool unwind_on_error) {
1056baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1057baf5664fSJonas Devlieghere                      (const char *, lldb::DynamicValueType, bool), expr,
1058baf5664fSJonas Devlieghere                      fetch_dynamic_value, unwind_on_error);
1059baf5664fSJonas Devlieghere 
106035e1bda6SJim Ingham   SBExpressionOptions options;
1061c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1062c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1063c481c7eeSJim Ingham 
1064cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
106535e1bda6SJim Ingham   options.SetUnwindOnError(unwind_on_error);
106624785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1067998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1068998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1069998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1070998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1071998c8a1cSRyan Brown   else if (frame)
1072998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
1073baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(EvaluateExpression(expr, options));
107435e1bda6SJim Ingham }
107535e1bda6SJim Ingham 
1076b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr,
1077b9c1b51eSKate Stone                                           const SBExpressionOptions &options) {
1078baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1079baf5664fSJonas Devlieghere                      (const char *, const lldb::SBExpressionOptions &), expr,
1080baf5664fSJonas Devlieghere                      options);
1081baf5664fSJonas Devlieghere 
10825160ce5cSGreg Clayton   Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1083a162ebafSSean Callanan 
108469b582faSGreg Clayton   SBValue expr_result;
10857730b9a4SJim Ingham 
1086b9c1b51eSKate Stone   if (expr == nullptr || expr[0] == '\0') {
1087baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(expr_result);
10887730b9a4SJim Ingham   }
10897730b9a4SJim Ingham 
109081e871edSGreg Clayton   ValueObjectSP expr_value_sp;
10914838131bSGreg Clayton 
1092bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1093bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
10944fc6cb9cSJim Ingham 
1095b9556accSGreg Clayton 
1096dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
10977730b9a4SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
10987730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
10997730b9a4SJim Ingham 
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) {
11058f7db52dSJim Ingham         std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace;
1106b9c1b51eSKate Stone         if (target->GetDisplayExpressionsInCrashlogs()) {
11071ba7c4d0SGreg Clayton           StreamString frame_description;
1108d9e416c0SGreg Clayton           frame->DumpUsingSettingsFormat(&frame_description);
1109a8f3ae7cSJonas Devlieghere           stack_trace = std::make_unique<llvm::PrettyStackTraceFormat>(
1110b9c1b51eSKate Stone               "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value "
1111b9c1b51eSKate Stone               "= %u) %s",
1112b9c1b51eSKate Stone               expr, options.GetFetchDynamicValue(),
1113c156427dSZachary Turner               frame_description.GetData());
1114fb6621efSGreg Clayton         }
1115fb6621efSGreg Clayton 
1116370e5dbaSPavel Labath         target->EvaluateExpression(expr, frame, expr_value_sp, options.ref());
1117e3e91517SEnrico Granata         expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
11187730b9a4SJim Ingham       }
1119c9858e4dSGreg Clayton     }
11207fdf9ef1SGreg Clayton   }
11214838131bSGreg Clayton 
112263e5fb76SJonas Devlieghere   LLDB_LOGF(expr_log,
112363e5fb76SJonas Devlieghere             "** [SBFrame::EvaluateExpression] Expression result is "
1124b9c1b51eSKate Stone             "%s, summary %s **",
1125324a1036SSaleem Abdulrasool             expr_result.GetValue(), expr_result.GetSummary());
11264838131bSGreg Clayton 
1127baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(expr_result);
11281d3afba3SGreg Clayton }
1129316d498bSGreg Clayton 
1130b9c1b51eSKate Stone bool SBFrame::IsInlined() {
1131baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsInlined);
1132baf5664fSJonas Devlieghere 
113305f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->IsInlined();
113405f75e9fSOleksiy Vyalov }
113505f75e9fSOleksiy Vyalov 
1136b9c1b51eSKate Stone bool SBFrame::IsInlined() const {
1137baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsInlined);
1138baf5664fSJonas Devlieghere 
1139c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1140c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1141c481c7eeSJim Ingham 
1142dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1143d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
11447730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1145b9c1b51eSKate Stone   if (target && process) {
11467fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1147b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
11487730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1149b9c1b51eSKate Stone       if (frame) {
11507fdf9ef1SGreg Clayton 
1151d9e416c0SGreg Clayton         Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1152316d498bSGreg Clayton         if (block)
1153dbb0abbfSEugene Zelenko           return block->GetContainingInlinedBlock() != nullptr;
11547730b9a4SJim Ingham       }
1155c9858e4dSGreg Clayton     }
11567fdf9ef1SGreg Clayton   }
1157316d498bSGreg Clayton   return false;
1158316d498bSGreg Clayton }
1159316d498bSGreg Clayton 
11604b36f791SVedant Kumar bool SBFrame::IsArtificial() {
1161baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsArtificial);
1162baf5664fSJonas Devlieghere 
11634b36f791SVedant Kumar   return static_cast<const SBFrame *>(this)->IsArtificial();
11644b36f791SVedant Kumar }
11654b36f791SVedant Kumar 
11664b36f791SVedant Kumar bool SBFrame::IsArtificial() const {
1167baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsArtificial);
1168baf5664fSJonas Devlieghere 
11694b36f791SVedant Kumar   std::unique_lock<std::recursive_mutex> lock;
11704b36f791SVedant Kumar   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
11714b36f791SVedant Kumar 
11724b36f791SVedant Kumar   StackFrame *frame = exe_ctx.GetFramePtr();
11734b36f791SVedant Kumar   if (frame)
11744b36f791SVedant Kumar     return frame->IsArtificial();
11754b36f791SVedant Kumar 
11764b36f791SVedant Kumar   return false;
11774b36f791SVedant Kumar }
11784b36f791SVedant Kumar 
1179b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() {
1180baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetFunctionName);
1181baf5664fSJonas Devlieghere 
118205f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->GetFunctionName();
118305f75e9fSOleksiy Vyalov }
118405f75e9fSOleksiy Vyalov 
1185bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const {
1186baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::LanguageType, SBFrame, GuessLanguage);
1187baf5664fSJonas Devlieghere 
1188bdbdd229SJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1189bdbdd229SJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1190bdbdd229SJim Ingham 
1191bdbdd229SJim Ingham   StackFrame *frame = nullptr;
1192bdbdd229SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
1193bdbdd229SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1194bdbdd229SJim Ingham   if (target && process) {
1195bdbdd229SJim Ingham     Process::StopLocker stop_locker;
1196bdbdd229SJim Ingham     if (stop_locker.TryLock(&process->GetRunLock())) {
1197bdbdd229SJim Ingham       frame = exe_ctx.GetFramePtr();
1198bdbdd229SJim Ingham       if (frame) {
1199bdbdd229SJim Ingham         return frame->GuessLanguage();
1200bdbdd229SJim Ingham       }
1201bdbdd229SJim Ingham     }
1202bdbdd229SJim Ingham   }
1203bdbdd229SJim Ingham   return eLanguageTypeUnknown;
1204bdbdd229SJim Ingham }
1205bdbdd229SJim Ingham 
1206b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const {
1207baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, GetFunctionName);
1208baf5664fSJonas Devlieghere 
1209dbb0abbfSEugene Zelenko   const char *name = nullptr;
1210c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1211c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1212c481c7eeSJim Ingham 
1213dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1214d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
12157730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1216b9c1b51eSKate Stone   if (target && process) {
12177fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1218b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
12197730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1220b9c1b51eSKate Stone       if (frame) {
1221b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1222b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1223b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1224b9c1b51eSKate Stone         if (sc.block) {
1225316d498bSGreg Clayton           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1226b9c1b51eSKate Stone           if (inlined_block) {
1227b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1228b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
122922b04487SAlex Langford             name = inlined_info->GetName().AsCString();
1230316d498bSGreg Clayton           }
1231316d498bSGreg Clayton         }
1232316d498bSGreg Clayton 
1233b9c1b51eSKate Stone         if (name == nullptr) {
1234316d498bSGreg Clayton           if (sc.function)
1235316d498bSGreg Clayton             name = sc.function->GetName().GetCString();
1236316d498bSGreg Clayton         }
1237316d498bSGreg Clayton 
1238b9c1b51eSKate Stone         if (name == nullptr) {
1239316d498bSGreg Clayton           if (sc.symbol)
1240316d498bSGreg Clayton             name = sc.symbol->GetName().GetCString();
1241316d498bSGreg Clayton         }
12427730b9a4SJim Ingham       }
1243c9858e4dSGreg Clayton     }
12447fdf9ef1SGreg Clayton   }
1245316d498bSGreg Clayton   return name;
1246316d498bSGreg Clayton }
1247c1f705c2SEnrico Granata 
1248b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() {
1249baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetDisplayFunctionName);
1250baf5664fSJonas Devlieghere 
1251dbb0abbfSEugene Zelenko   const char *name = nullptr;
1252c481c7eeSJim Ingham 
1253c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1254c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1255c481c7eeSJim Ingham 
1256dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1257c1f705c2SEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
1258c1f705c2SEnrico Granata   Process *process = exe_ctx.GetProcessPtr();
1259b9c1b51eSKate Stone   if (target && process) {
1260c1f705c2SEnrico Granata     Process::StopLocker stop_locker;
1261b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1262c1f705c2SEnrico Granata       frame = exe_ctx.GetFramePtr();
1263b9c1b51eSKate Stone       if (frame) {
1264b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1265b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1266b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1267b9c1b51eSKate Stone         if (sc.block) {
1268c1f705c2SEnrico Granata           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1269b9c1b51eSKate Stone           if (inlined_block) {
1270b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1271b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
127222b04487SAlex Langford             name = inlined_info->GetDisplayName().AsCString();
1273c1f705c2SEnrico Granata           }
1274c1f705c2SEnrico Granata         }
1275c1f705c2SEnrico Granata 
1276b9c1b51eSKate Stone         if (name == nullptr) {
1277c1f705c2SEnrico Granata           if (sc.function)
1278c1f705c2SEnrico Granata             name = sc.function->GetDisplayName().GetCString();
1279c1f705c2SEnrico Granata         }
1280c1f705c2SEnrico Granata 
1281b9c1b51eSKate Stone         if (name == nullptr) {
1282c1f705c2SEnrico Granata           if (sc.symbol)
1283c1f705c2SEnrico Granata             name = sc.symbol->GetDisplayName().GetCString();
1284c1f705c2SEnrico Granata         }
1285c1f705c2SEnrico Granata       }
1286c1f705c2SEnrico Granata     }
1287c1f705c2SEnrico Granata   }
1288c1f705c2SEnrico Granata   return name;
1289c1f705c2SEnrico Granata }
1290ae211eceSMichal Gorny 
1291ae211eceSMichal Gorny namespace lldb_private {
1292ae211eceSMichal Gorny namespace repro {
1293ae211eceSMichal Gorny 
1294ae211eceSMichal Gorny template <>
1295ae211eceSMichal Gorny void RegisterMethods<SBFrame>(Registry &R) {
1296ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBFrame, ());
1297ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBFrame, (const lldb::StackFrameSP &));
1298ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBFrame, (const lldb::SBFrame &));
1299ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const lldb::SBFrame &,
1300ae211eceSMichal Gorny                        SBFrame, operator=,(const lldb::SBFrame &));
1301ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsValid, ());
1302ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBFrame, operator bool, ());
1303ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBSymbolContext, SBFrame, GetSymbolContext,
1304ae211eceSMichal Gorny                              (uint32_t));
1305ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBModule, SBFrame, GetModule, ());
1306ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBCompileUnit, SBFrame, GetCompileUnit,
1307ae211eceSMichal Gorny                              ());
1308ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBFunction, SBFrame, GetFunction, ());
1309ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBSymbol, SBFrame, GetSymbol, ());
1310ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBBlock, SBFrame, GetBlock, ());
1311ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBBlock, SBFrame, GetFrameBlock, ());
1312ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBLineEntry, SBFrame, GetLineEntry, ());
1313ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(uint32_t, SBFrame, GetFrameID, ());
1314ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetCFA, ());
1315ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetPC, ());
1316ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBFrame, SetPC, (lldb::addr_t));
1317ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetSP, ());
1318ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetFP, ());
1319ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBFrame, GetPCAddress, ());
1320ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBFrame, Clear, ());
1321ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath,
1322ae211eceSMichal Gorny                        (const char *));
1323ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath,
1324ae211eceSMichal Gorny                        (const char *, lldb::DynamicValueType));
1325ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *));
1326ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindVariable,
1327ae211eceSMichal Gorny                        (const char *, lldb::DynamicValueType));
1328ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindValue,
1329ae211eceSMichal Gorny                        (const char *, lldb::ValueType));
1330ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(
1331ae211eceSMichal Gorny       lldb::SBValue, SBFrame, FindValue,
1332ae211eceSMichal Gorny       (const char *, lldb::ValueType, lldb::DynamicValueType));
1333ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &));
1334ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool,
1335ae211eceSMichal Gorny                              SBFrame, operator==,(const lldb::SBFrame &));
1336ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool,
1337ae211eceSMichal Gorny                              SBFrame, operator!=,(const lldb::SBFrame &));
1338ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBThread, SBFrame, GetThread, ());
1339ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(const char *, SBFrame, Disassemble, ());
1340ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables,
1341ae211eceSMichal Gorny                        (bool, bool, bool, bool));
1342ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables,
1343ae211eceSMichal Gorny                        (bool, bool, bool, bool, lldb::DynamicValueType));
1344ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables,
1345ae211eceSMichal Gorny                        (const lldb::SBVariablesOptions &));
1346ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetRegisters, ());
1347ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *));
1348ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &));
1349ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1350ae211eceSMichal Gorny                        (const char *));
1351ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1352ae211eceSMichal Gorny                        (const char *, lldb::DynamicValueType));
1353ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1354ae211eceSMichal Gorny                        (const char *, lldb::DynamicValueType, bool));
1355ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1356ae211eceSMichal Gorny                        (const char *, const lldb::SBExpressionOptions &));
1357ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBFrame, IsInlined, ());
1358ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsInlined, ());
1359ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBFrame, IsArtificial, ());
1360ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsArtificial, ());
1361ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const char *, SBFrame, GetFunctionName, ());
1362ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::LanguageType, SBFrame, GuessLanguage, ());
1363ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(const char *, SBFrame, GetFunctionName, ());
1364ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const char *, SBFrame, GetDisplayFunctionName, ());
1365ae211eceSMichal Gorny }
1366ae211eceSMichal Gorny 
1367ae211eceSMichal Gorny }
1368ae211eceSMichal Gorny }
1369