130fdc8d8SChris Lattner //===-- SBFrame.cpp ---------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner 
930fdc8d8SChris Lattner #include <algorithm>
10349213f9SGreg Clayton #include <set>
11dbb0abbfSEugene Zelenko #include <string>
12dbb0abbfSEugene Zelenko 
13dbb0abbfSEugene Zelenko #include "lldb/API/SBFrame.h"
1430fdc8d8SChris Lattner 
1530fdc8d8SChris Lattner #include "lldb/lldb-types.h"
1630fdc8d8SChris Lattner 
17b9c1b51eSKate Stone #include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h"
18baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h"
19bd4bf82aSJonas Devlieghere #include "Utils.h"
2030fdc8d8SChris Lattner #include "lldb/Core/Address.h"
2130fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2230fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h"
2330fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h"
24151c032cSJim Ingham #include "lldb/Expression/UserExpression.h"
251ba7c4d0SGreg Clayton #include "lldb/Host/Host.h"
2630fdc8d8SChris Lattner #include "lldb/Symbol/Block.h"
271f746071SGreg Clayton #include "lldb/Symbol/Function.h"
281f746071SGreg Clayton #include "lldb/Symbol/Symbol.h"
2930fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h"
3030fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h"
31b9c1b51eSKate Stone #include "lldb/Symbol/VariableList.h"
3230fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h"
3330fdc8d8SChris Lattner #include "lldb/Target/Process.h"
3430fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
35b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h"
3641ae8e74SKuba Mracek #include "lldb/Target/StackFrameRecognizer.h"
37b9556accSGreg Clayton #include "lldb/Target/StackID.h"
38b9c1b51eSKate Stone #include "lldb/Target/Target.h"
3930fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
40bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h"
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);
81efabb123SGreg Clayton   return *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 
357dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
358d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3597730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
360b9c1b51eSKate Stone   if (target && process) {
3617fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
362b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3637730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
364b9c1b51eSKate Stone       if (frame) {
365d9e416c0SGreg Clayton         ret_val = frame->GetRegisterContext()->SetPC(new_pc);
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 
380dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
381d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3827730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
383b9c1b51eSKate Stone   if (target && process) {
3847fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
385b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3867730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
387b9c1b51eSKate Stone       if (frame) {
388d9e416c0SGreg Clayton         addr = frame->GetRegisterContext()->GetSP();
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 
403dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
404d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4057730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
406b9c1b51eSKate Stone   if (target && process) {
4077fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
408b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4097730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
410581af8b0SJonas Devlieghere       if (frame)
411d9e416c0SGreg Clayton         addr = frame->GetRegisterContext()->GetFP();
412c9858e4dSGreg Clayton     }
4137fdf9ef1SGreg Clayton   }
414ceb6b139SCaroline Tice 
415ceb6b139SCaroline Tice   return addr;
41630fdc8d8SChris Lattner }
41730fdc8d8SChris Lattner 
418b9c1b51eSKate Stone SBAddress SBFrame::GetPCAddress() const {
419baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBFrame, GetPCAddress);
420baf5664fSJonas Devlieghere 
42130fdc8d8SChris Lattner   SBAddress sb_addr;
422bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
423bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4244fc6cb9cSJim Ingham 
425b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
426d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4277730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
428b9c1b51eSKate Stone   if (target && process) {
4297fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
430b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4317730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
432581af8b0SJonas Devlieghere       if (frame)
433d9e416c0SGreg Clayton         sb_addr.SetAddress(&frame->GetFrameCodeAddress());
4347fdf9ef1SGreg Clayton     }
435c9858e4dSGreg Clayton   }
436baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_addr);
43730fdc8d8SChris Lattner }
43830fdc8d8SChris Lattner 
439baf5664fSJonas Devlieghere void SBFrame::Clear() {
440baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBFrame, Clear);
441baf5664fSJonas Devlieghere 
442baf5664fSJonas Devlieghere   m_opaque_sp->Clear();
443baf5664fSJonas Devlieghere }
44430fdc8d8SChris Lattner 
445b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) {
446baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath,
447baf5664fSJonas Devlieghere                      (const char *), var_path);
448baf5664fSJonas Devlieghere 
4497edbdfc9SGreg Clayton   SBValue sb_value;
450c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
451c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
452c481c7eeSJim Ingham 
453b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
454d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
455b9c1b51eSKate Stone   if (frame && target) {
456b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
457b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
4587edbdfc9SGreg Clayton     sb_value = GetValueForVariablePath(var_path, use_dynamic);
4597edbdfc9SGreg Clayton   }
460baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value);
4617edbdfc9SGreg Clayton }
4627edbdfc9SGreg Clayton 
463b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path,
464b9c1b51eSKate Stone                                                DynamicValueType use_dynamic) {
465baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath,
466baf5664fSJonas Devlieghere                      (const char *, lldb::DynamicValueType), var_path,
467baf5664fSJonas Devlieghere                      use_dynamic);
468baf5664fSJonas Devlieghere 
4697edbdfc9SGreg Clayton   SBValue sb_value;
470b9c1b51eSKate Stone   if (var_path == nullptr || var_path[0] == '\0') {
471baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_value);
4727730b9a4SJim Ingham   }
4737730b9a4SJim Ingham 
474bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
475bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4764fc6cb9cSJim Ingham 
477dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
478d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4797730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
480b9c1b51eSKate Stone   if (target && process) {
4817fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
482b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4837730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
484b9c1b51eSKate Stone       if (frame) {
4857edbdfc9SGreg Clayton         VariableSP var_sp;
48697206d57SZachary Turner         Status error;
487b9c1b51eSKate Stone         ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath(
488b9c1b51eSKate Stone             var_path, eNoDynamicValues,
489b9c1b51eSKate Stone             StackFrame::eExpressionPathOptionCheckPtrVsMember |
490b9c1b51eSKate Stone                 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
491b9c1b51eSKate Stone             var_sp, error));
492e3e91517SEnrico Granata         sb_value.SetSP(value_sp, use_dynamic);
4937730b9a4SJim Ingham       }
494c9858e4dSGreg Clayton     }
4957fdf9ef1SGreg Clayton   }
496baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value);
4977edbdfc9SGreg Clayton }
4987edbdfc9SGreg Clayton 
499b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name) {
500baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *),
501baf5664fSJonas Devlieghere                      name);
502baf5664fSJonas Devlieghere 
503316d498bSGreg Clayton   SBValue value;
504c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
505c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
506c481c7eeSJim Ingham 
507b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
508d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
509b9c1b51eSKate Stone   if (frame && target) {
510b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
511b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
512316d498bSGreg Clayton     value = FindVariable(name, use_dynamic);
513316d498bSGreg Clayton   }
514baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value);
51578a685aaSJim Ingham }
51678a685aaSJim Ingham 
517b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name,
518b9c1b51eSKate Stone                               lldb::DynamicValueType use_dynamic) {
519baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable,
520baf5664fSJonas Devlieghere                      (const char *, lldb::DynamicValueType), name, use_dynamic);
521baf5664fSJonas Devlieghere 
52269b582faSGreg Clayton   VariableSP var_sp;
52358b59f95SJim Ingham   SBValue sb_value;
5247730b9a4SJim Ingham 
525b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
526baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_value);
5277730b9a4SJim Ingham   }
5287730b9a4SJim Ingham 
52981e871edSGreg Clayton   ValueObjectSP value_sp;
530bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
531bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5324fc6cb9cSJim Ingham 
533dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
534d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5357730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
536b9c1b51eSKate Stone   if (target && process) {
5377fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
538b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5397730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
540b9c1b51eSKate Stone       if (frame) {
541e23d0b63SShafik Yaghmour         value_sp = frame->FindVariable(ConstString(name));
54230fdc8d8SChris Lattner 
543e23d0b63SShafik Yaghmour         if (value_sp)
544e3e91517SEnrico Granata           sb_value.SetSP(value_sp, use_dynamic);
545c9858e4dSGreg Clayton       }
546316d498bSGreg Clayton     }
547581af8b0SJonas Devlieghere   }
5484838131bSGreg Clayton 
549baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value);
550dde9cff3SCaroline Tice }
551dde9cff3SCaroline Tice 
552b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) {
553baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue,
554baf5664fSJonas Devlieghere                      (const char *, lldb::ValueType), name, value_type);
555baf5664fSJonas Devlieghere 
556316d498bSGreg Clayton   SBValue value;
557c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
558c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
559c481c7eeSJim Ingham 
560b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
561d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
562b9c1b51eSKate Stone   if (frame && target) {
563b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
564b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
565316d498bSGreg Clayton     value = FindValue(name, value_type, use_dynamic);
566316d498bSGreg Clayton   }
567baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value);
56878a685aaSJim Ingham }
56978a685aaSJim Ingham 
570b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type,
571b9c1b51eSKate Stone                            lldb::DynamicValueType use_dynamic) {
572baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue,
573baf5664fSJonas Devlieghere                      (const char *, lldb::ValueType, lldb::DynamicValueType),
574baf5664fSJonas Devlieghere                      name, value_type, use_dynamic);
575baf5664fSJonas Devlieghere 
57669b582faSGreg Clayton   SBValue sb_value;
5777730b9a4SJim Ingham 
578b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
579baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_value);
5807730b9a4SJim Ingham   }
5817730b9a4SJim Ingham 
58281e871edSGreg Clayton   ValueObjectSP value_sp;
583bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
584bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5854fc6cb9cSJim Ingham 
586dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
587d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5887730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
589b9c1b51eSKate Stone   if (target && process) {
5907fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
591b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5927730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
593b9c1b51eSKate Stone       if (frame) {
5948a2a0dfbSEnrico Granata         VariableList variable_list;
5958a2a0dfbSEnrico Granata 
596b9c1b51eSKate Stone         switch (value_type) {
59769b582faSGreg Clayton         case eValueTypeVariableGlobal:      // global variable
59869b582faSGreg Clayton         case eValueTypeVariableStatic:      // static variable
59969b582faSGreg Clayton         case eValueTypeVariableArgument:    // function argument variables
60069b582faSGreg Clayton         case eValueTypeVariableLocal:       // function local variables
60163a27afaSGreg Clayton         case eValueTypeVariableThreadLocal: // thread local variables
60269b582faSGreg Clayton         {
603d9e416c0SGreg Clayton           SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock));
60472eff18aSGreg Clayton 
60572eff18aSGreg Clayton           const bool can_create = true;
60672eff18aSGreg Clayton           const bool get_parent_variables = true;
60772eff18aSGreg Clayton           const bool stop_if_block_is_inlined_function = true;
60872eff18aSGreg Clayton 
6090efb51a0SChaoren Lin           if (sc.block)
610b9c1b51eSKate Stone             sc.block->AppendVariables(
611b9c1b51eSKate Stone                 can_create, get_parent_variables,
612b9c1b51eSKate Stone                 stop_if_block_is_inlined_function,
613b9c1b51eSKate Stone                 [frame](Variable *v) { return v->IsInScope(frame); },
614b9c1b51eSKate Stone                 &variable_list);
615b9c1b51eSKate Stone           if (value_type == eValueTypeVariableGlobal) {
6168a2a0dfbSEnrico Granata             const bool get_file_globals = true;
6178a2a0dfbSEnrico Granata             VariableList *frame_vars = frame->GetVariableList(get_file_globals);
6188a2a0dfbSEnrico Granata             if (frame_vars)
6198a2a0dfbSEnrico Granata               frame_vars->AppendVariablesIfUnique(variable_list);
6208a2a0dfbSEnrico Granata           }
62169b582faSGreg Clayton           ConstString const_name(name);
622b9c1b51eSKate Stone           VariableSP variable_sp(
623b9c1b51eSKate Stone               variable_list.FindVariable(const_name, value_type));
624b9c1b51eSKate Stone           if (variable_sp) {
625b9c1b51eSKate Stone             value_sp = frame->GetValueObjectForFrameVariable(variable_sp,
626b9c1b51eSKate Stone                                                              eNoDynamicValues);
627e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
62830fdc8d8SChris Lattner           }
629b9c1b51eSKate Stone         } break;
63069b582faSGreg Clayton 
63169b582faSGreg Clayton         case eValueTypeRegister: // stack frame register value
63269b582faSGreg Clayton         {
633d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
634b9c1b51eSKate Stone           if (reg_ctx) {
63569b582faSGreg Clayton             const uint32_t num_regs = reg_ctx->GetRegisterCount();
636b9c1b51eSKate Stone             for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) {
637b9c1b51eSKate Stone               const RegisterInfo *reg_info =
638b9c1b51eSKate Stone                   reg_ctx->GetRegisterInfoAtIndex(reg_idx);
63969b582faSGreg Clayton               if (reg_info &&
64069b582faSGreg Clayton                   ((reg_info->name && strcasecmp(reg_info->name, name) == 0) ||
641b9c1b51eSKate Stone                    (reg_info->alt_name &&
642b9c1b51eSKate Stone                     strcasecmp(reg_info->alt_name, name) == 0))) {
643d9e416c0SGreg Clayton                 value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx);
64481e871edSGreg Clayton                 sb_value.SetSP(value_sp);
64581e871edSGreg Clayton                 break;
64669b582faSGreg Clayton               }
64769b582faSGreg Clayton             }
64869b582faSGreg Clayton           }
649b9c1b51eSKate Stone         } break;
65069b582faSGreg Clayton 
651b9c1b51eSKate Stone         case eValueTypeRegisterSet: // A collection of stack frame register
652b9c1b51eSKate Stone                                     // values
65369b582faSGreg Clayton         {
654d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
655b9c1b51eSKate Stone           if (reg_ctx) {
65669b582faSGreg Clayton             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
657b9c1b51eSKate Stone             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
65869b582faSGreg Clayton               const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx);
65969b582faSGreg Clayton               if (reg_set &&
66069b582faSGreg Clayton                   ((reg_set->name && strcasecmp(reg_set->name, name) == 0) ||
661b9c1b51eSKate Stone                    (reg_set->short_name &&
662b9c1b51eSKate Stone                     strcasecmp(reg_set->short_name, name) == 0))) {
663b9c1b51eSKate Stone                 value_sp =
664b9c1b51eSKate Stone                     ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx);
66581e871edSGreg Clayton                 sb_value.SetSP(value_sp);
66681e871edSGreg Clayton                 break;
66769b582faSGreg Clayton               }
66869b582faSGreg Clayton             }
66969b582faSGreg Clayton           }
670b9c1b51eSKate Stone         } break;
67169b582faSGreg Clayton 
67269b582faSGreg Clayton         case eValueTypeConstResult: // constant result variables
67369b582faSGreg Clayton         {
67469b582faSGreg Clayton           ConstString const_name(name);
675b9c1b51eSKate Stone           ExpressionVariableSP expr_var_sp(
676b9c1b51eSKate Stone               target->GetPersistentVariable(const_name));
677b9c1b51eSKate Stone           if (expr_var_sp) {
67881e871edSGreg Clayton             value_sp = expr_var_sp->GetValueObject();
679e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
68081e871edSGreg Clayton           }
681b9c1b51eSKate Stone         } break;
68269b582faSGreg Clayton 
68369b582faSGreg Clayton         default:
68469b582faSGreg Clayton           break;
68569b582faSGreg Clayton         }
686c9858e4dSGreg Clayton       }
6877fdf9ef1SGreg Clayton     }
688581af8b0SJonas Devlieghere   }
6894838131bSGreg Clayton 
690baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value);
691dde9cff3SCaroline Tice }
692dde9cff3SCaroline Tice 
693b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const {
694baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &),
695baf5664fSJonas Devlieghere                            that);
696baf5664fSJonas Devlieghere 
697b57e4a1bSJason Molenda   lldb::StackFrameSP this_sp = GetFrameSP();
698b57e4a1bSJason Molenda   lldb::StackFrameSP that_sp = that.GetFrameSP();
69935e2ab60SJohnny Chen   return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
70035e2ab60SJohnny Chen }
70135e2ab60SJohnny Chen 
702baf5664fSJonas Devlieghere bool SBFrame::operator==(const SBFrame &rhs) const {
703baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator==,(const lldb::SBFrame &),
704baf5664fSJonas Devlieghere                            rhs);
70530fdc8d8SChris Lattner 
706baf5664fSJonas Devlieghere   return IsEqual(rhs);
707baf5664fSJonas Devlieghere }
708baf5664fSJonas Devlieghere 
709baf5664fSJonas Devlieghere bool SBFrame::operator!=(const SBFrame &rhs) const {
710baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator!=,(const lldb::SBFrame &),
711baf5664fSJonas Devlieghere                            rhs);
712baf5664fSJonas Devlieghere 
713baf5664fSJonas Devlieghere   return !IsEqual(rhs);
714baf5664fSJonas Devlieghere }
71530fdc8d8SChris Lattner 
716b9c1b51eSKate Stone SBThread SBFrame::GetThread() const {
717baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBThread, SBFrame, GetThread);
718baf5664fSJonas Devlieghere 
719c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
720c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
721c481c7eeSJim Ingham 
722d9e416c0SGreg Clayton   ThreadSP thread_sp(exe_ctx.GetThreadSP());
723d9e416c0SGreg Clayton   SBThread sb_thread(thread_sp);
724ceb6b139SCaroline Tice 
725baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_thread);
72630fdc8d8SChris Lattner }
72730fdc8d8SChris Lattner 
728b9c1b51eSKate Stone const char *SBFrame::Disassemble() const {
729baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, Disassemble);
730baf5664fSJonas Devlieghere 
731dbb0abbfSEugene Zelenko   const char *disassembly = nullptr;
732bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
733bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
7344fc6cb9cSJim Ingham 
735dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
736d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
7377730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
738b9c1b51eSKate Stone   if (target && process) {
7397fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
740b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
7417730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
742b9c1b51eSKate Stone       if (frame) {
743d9e416c0SGreg Clayton         disassembly = frame->Disassemble();
7447fdf9ef1SGreg Clayton       }
745c9858e4dSGreg Clayton     }
746581af8b0SJonas Devlieghere   }
7474838131bSGreg Clayton 
7484838131bSGreg Clayton   return disassembly;
74930fdc8d8SChris Lattner }
75030fdc8d8SChris Lattner 
751b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics,
752b9c1b51eSKate Stone                                   bool in_scope_only) {
753baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables,
754baf5664fSJonas Devlieghere                      (bool, bool, bool, bool), arguments, locals, statics,
755baf5664fSJonas Devlieghere                      in_scope_only);
756baf5664fSJonas Devlieghere 
757316d498bSGreg Clayton   SBValueList value_list;
758c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
759c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
760c481c7eeSJim Ingham 
761b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
762d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
763b9c1b51eSKate Stone   if (frame && target) {
764b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
765b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
766b9c1b51eSKate Stone     const bool include_runtime_support_values =
767b9c1b51eSKate Stone         target ? target->GetDisplayRuntimeSupportValues() : false;
76851f96eebSZachary Turner 
76951f96eebSZachary Turner     SBVariablesOptions options;
77051f96eebSZachary Turner     options.SetIncludeArguments(arguments);
77151f96eebSZachary Turner     options.SetIncludeLocals(locals);
77251f96eebSZachary Turner     options.SetIncludeStatics(statics);
77351f96eebSZachary Turner     options.SetInScopeOnly(in_scope_only);
77451f96eebSZachary Turner     options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
77551f96eebSZachary Turner     options.SetUseDynamic(use_dynamic);
77651f96eebSZachary Turner 
77751f96eebSZachary Turner     value_list = GetVariables(options);
778316d498bSGreg Clayton   }
779baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value_list);
78078a685aaSJim Ingham }
78178a685aaSJim Ingham 
782b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals,
783b9c1b51eSKate Stone                                         bool statics, bool in_scope_only,
784b9c1b51eSKate Stone                                         lldb::DynamicValueType use_dynamic) {
785baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables,
786baf5664fSJonas Devlieghere                      (bool, bool, bool, bool, lldb::DynamicValueType),
787baf5664fSJonas Devlieghere                      arguments, locals, statics, in_scope_only, use_dynamic);
788baf5664fSJonas Devlieghere 
789c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
790c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
791c481c7eeSJim Ingham 
792560558ebSEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
793b9c1b51eSKate Stone   const bool include_runtime_support_values =
794b9c1b51eSKate Stone       target ? target->GetDisplayRuntimeSupportValues() : false;
79551f96eebSZachary Turner   SBVariablesOptions options;
79651f96eebSZachary Turner   options.SetIncludeArguments(arguments);
79751f96eebSZachary Turner   options.SetIncludeLocals(locals);
79851f96eebSZachary Turner   options.SetIncludeStatics(statics);
79951f96eebSZachary Turner   options.SetInScopeOnly(in_scope_only);
80051f96eebSZachary Turner   options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
80151f96eebSZachary Turner   options.SetUseDynamic(use_dynamic);
802baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(GetVariables(options));
803560558ebSEnrico Granata }
804560558ebSEnrico Granata 
805b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) {
806baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables,
807baf5664fSJonas Devlieghere                      (const lldb::SBVariablesOptions &), options);
808baf5664fSJonas Devlieghere 
809b9556accSGreg Clayton   SBValueList value_list;
810bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
811bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
8124fc6cb9cSJim Ingham 
813dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
814d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
815b9556accSGreg Clayton 
81651f96eebSZachary Turner   const bool statics = options.GetIncludeStatics();
81751f96eebSZachary Turner   const bool arguments = options.GetIncludeArguments();
8184c7f5d5cSKuba Mracek   const bool recognized_arguments =
8194c7f5d5cSKuba Mracek         options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP()));
82051f96eebSZachary Turner   const bool locals = options.GetIncludeLocals();
82151f96eebSZachary Turner   const bool in_scope_only = options.GetInScopeOnly();
822b9c1b51eSKate Stone   const bool include_runtime_support_values =
823b9c1b51eSKate Stone       options.GetIncludeRuntimeSupportValues();
82451f96eebSZachary Turner   const lldb::DynamicValueType use_dynamic = options.GetUseDynamic();
82551f96eebSZachary Turner 
826ceb6b139SCaroline Tice 
827349213f9SGreg Clayton   std::set<VariableSP> variable_set;
8287730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
829b9c1b51eSKate Stone   if (target && process) {
8307fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
831b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
8327730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
833b9c1b51eSKate Stone       if (frame) {
83430fdc8d8SChris Lattner         size_t i;
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) {
840b9c1b51eSKate Stone             for (i = 0; i < num_variables; ++i) {
84130fdc8d8SChris Lattner               VariableSP variable_sp(variable_list->GetVariableAtIndex(i));
842b9c1b51eSKate Stone               if (variable_sp) {
84330fdc8d8SChris Lattner                 bool add_variable = false;
844b9c1b51eSKate Stone                 switch (variable_sp->GetScope()) {
84530fdc8d8SChris Lattner                 case eValueTypeVariableGlobal:
84630fdc8d8SChris Lattner                 case eValueTypeVariableStatic:
84763a27afaSGreg Clayton                 case eValueTypeVariableThreadLocal:
84830fdc8d8SChris Lattner                   add_variable = statics;
84930fdc8d8SChris Lattner                   break;
85030fdc8d8SChris Lattner 
85130fdc8d8SChris Lattner                 case eValueTypeVariableArgument:
85230fdc8d8SChris Lattner                   add_variable = arguments;
85330fdc8d8SChris Lattner                   break;
85430fdc8d8SChris Lattner 
85530fdc8d8SChris Lattner                 case eValueTypeVariableLocal:
85630fdc8d8SChris Lattner                   add_variable = locals;
85730fdc8d8SChris Lattner                   break;
858c982c768SGreg Clayton 
859c982c768SGreg Clayton                 default:
860c982c768SGreg Clayton                   break;
86130fdc8d8SChris Lattner                 }
862b9c1b51eSKate Stone                 if (add_variable) {
863349213f9SGreg Clayton                   // Only add variables once so we don't end up with duplicates
864349213f9SGreg Clayton                   if (variable_set.find(variable_sp) == variable_set.end())
865349213f9SGreg Clayton                     variable_set.insert(variable_sp);
866349213f9SGreg Clayton                   else
867349213f9SGreg Clayton                     continue;
868349213f9SGreg Clayton 
869d9e416c0SGreg Clayton                   if (in_scope_only && !variable_sp->IsInScope(frame))
87030fdc8d8SChris Lattner                     continue;
87130fdc8d8SChris Lattner 
872b9c1b51eSKate Stone                   ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable(
873b9c1b51eSKate Stone                       variable_sp, eNoDynamicValues));
874560558ebSEnrico Granata 
875b9c1b51eSKate Stone                   if (!include_runtime_support_values && valobj_sp != nullptr &&
876dbb0abbfSEugene Zelenko                       valobj_sp->IsRuntimeSupportValue())
877560558ebSEnrico Granata                     continue;
878560558ebSEnrico Granata 
879e3e91517SEnrico Granata                   SBValue value_sb;
880e3e91517SEnrico Granata                   value_sb.SetSP(valobj_sp, use_dynamic);
881e3e91517SEnrico Granata                   value_list.Append(value_sb);
88230fdc8d8SChris Lattner                 }
88330fdc8d8SChris Lattner               }
88430fdc8d8SChris Lattner             }
88530fdc8d8SChris Lattner           }
88630fdc8d8SChris Lattner         }
88741ae8e74SKuba Mracek         if (recognized_arguments) {
88841ae8e74SKuba Mracek           auto recognized_frame = frame->GetRecognizedFrame();
88941ae8e74SKuba Mracek           if (recognized_frame) {
89041ae8e74SKuba Mracek             ValueObjectListSP recognized_arg_list =
89141ae8e74SKuba Mracek                 recognized_frame->GetRecognizedArguments();
89241ae8e74SKuba Mracek             if (recognized_arg_list) {
89341ae8e74SKuba Mracek               for (auto &rec_value_sp : recognized_arg_list->GetObjects()) {
89441ae8e74SKuba Mracek                 SBValue value_sb;
89541ae8e74SKuba Mracek                 value_sb.SetSP(rec_value_sp, use_dynamic);
89641ae8e74SKuba Mracek                 value_list.Append(value_sb);
89741ae8e74SKuba Mracek               }
89841ae8e74SKuba Mracek             }
89941ae8e74SKuba Mracek           }
90041ae8e74SKuba Mracek         }
901c9858e4dSGreg Clayton       }
9027fdf9ef1SGreg Clayton     }
903581af8b0SJonas Devlieghere   }
904ceb6b139SCaroline Tice 
905baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value_list);
90630fdc8d8SChris Lattner }
90730fdc8d8SChris Lattner 
908b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() {
909baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBValueList, SBFrame, GetRegisters);
910baf5664fSJonas Devlieghere 
91130fdc8d8SChris Lattner   SBValueList value_list;
912bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
913bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
9144fc6cb9cSJim Ingham 
915dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
916d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
9177730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
918b9c1b51eSKate Stone   if (target && process) {
9197fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
920b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
9217730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
922b9c1b51eSKate Stone       if (frame) {
923d9e416c0SGreg Clayton         RegisterContextSP reg_ctx(frame->GetRegisterContext());
924b9c1b51eSKate Stone         if (reg_ctx) {
92530fdc8d8SChris Lattner           const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
926b9c1b51eSKate Stone           for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
927b9c1b51eSKate Stone             value_list.Append(
928b9c1b51eSKate Stone                 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx));
92930fdc8d8SChris Lattner           }
93030fdc8d8SChris Lattner         }
931c9858e4dSGreg Clayton       }
9327fdf9ef1SGreg Clayton     }
933581af8b0SJonas Devlieghere   }
934ceb6b139SCaroline Tice 
935baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value_list);
93630fdc8d8SChris Lattner }
93730fdc8d8SChris Lattner 
938b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) {
939baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *),
940baf5664fSJonas Devlieghere                      name);
941baf5664fSJonas Devlieghere 
942ad9a53c5SJason Molenda   SBValue result;
943ad9a53c5SJason Molenda   ValueObjectSP value_sp;
944bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
945bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
946ad9a53c5SJason Molenda 
947dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
948ad9a53c5SJason Molenda   Target *target = exe_ctx.GetTargetPtr();
949ad9a53c5SJason Molenda   Process *process = exe_ctx.GetProcessPtr();
950b9c1b51eSKate Stone   if (target && process) {
951ad9a53c5SJason Molenda     Process::StopLocker stop_locker;
952b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
953ad9a53c5SJason Molenda       frame = exe_ctx.GetFramePtr();
954b9c1b51eSKate Stone       if (frame) {
955ad9a53c5SJason Molenda         RegisterContextSP reg_ctx(frame->GetRegisterContext());
956b9c1b51eSKate Stone         if (reg_ctx) {
957ad9a53c5SJason Molenda           const uint32_t num_regs = reg_ctx->GetRegisterCount();
958b9c1b51eSKate Stone           for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) {
959b9c1b51eSKate Stone             const RegisterInfo *reg_info =
960b9c1b51eSKate Stone                 reg_ctx->GetRegisterInfoAtIndex(reg_idx);
961ad9a53c5SJason Molenda             if (reg_info &&
962ad9a53c5SJason Molenda                 ((reg_info->name && strcasecmp(reg_info->name, name) == 0) ||
963b9c1b51eSKate Stone                  (reg_info->alt_name &&
964b9c1b51eSKate Stone                   strcasecmp(reg_info->alt_name, name) == 0))) {
965ad9a53c5SJason Molenda               value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx);
966ad9a53c5SJason Molenda               result.SetSP(value_sp);
967ad9a53c5SJason Molenda               break;
968ad9a53c5SJason Molenda             }
969ad9a53c5SJason Molenda           }
970ad9a53c5SJason Molenda         }
971ad9a53c5SJason Molenda       }
972ad9a53c5SJason Molenda     }
973581af8b0SJonas Devlieghere   }
974ad9a53c5SJason Molenda 
975baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(result);
976ad9a53c5SJason Molenda }
977ad9a53c5SJason Molenda 
978b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) {
979baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &),
980baf5664fSJonas Devlieghere                      description);
981baf5664fSJonas Devlieghere 
982da7bc7d0SGreg Clayton   Stream &strm = description.ref();
983da7bc7d0SGreg Clayton 
984bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
985bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
9864fc6cb9cSJim Ingham 
987b57e4a1bSJason Molenda   StackFrame *frame;
988d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
9897730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
990b9c1b51eSKate Stone   if (target && process) {
9917fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
992b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
9937730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
994b9c1b51eSKate Stone       if (frame) {
995d9e416c0SGreg Clayton         frame->DumpUsingSettingsFormat(&strm);
9967730b9a4SJim Ingham       }
997c9858e4dSGreg Clayton     }
998c9858e4dSGreg Clayton 
999b9c1b51eSKate Stone   } else
1000da7bc7d0SGreg Clayton     strm.PutCString("No value");
1001dde9cff3SCaroline Tice 
1002dde9cff3SCaroline Tice   return true;
1003dde9cff3SCaroline Tice }
10041d3afba3SGreg Clayton 
1005b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) {
1006baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, (const char *),
1007baf5664fSJonas Devlieghere                      expr);
1008baf5664fSJonas Devlieghere 
1009316d498bSGreg Clayton   SBValue result;
1010c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1011c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1012c481c7eeSJim Ingham 
1013b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
1014d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1015b9c1b51eSKate Stone   if (frame && target) {
101635e1bda6SJim Ingham     SBExpressionOptions options;
1017b9c1b51eSKate Stone     lldb::DynamicValueType fetch_dynamic_value =
1018b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
1019cced1566SGreg Clayton     options.SetFetchDynamicValue(fetch_dynamic_value);
102035e1bda6SJim Ingham     options.SetUnwindOnError(true);
102124785bd0SEugene Leviant     options.SetIgnoreBreakpoints(true);
1022998c8a1cSRyan Brown     if (target->GetLanguage() != eLanguageTypeUnknown)
1023998c8a1cSRyan Brown       options.SetLanguage(target->GetLanguage());
1024998c8a1cSRyan Brown     else
1025998c8a1cSRyan Brown       options.SetLanguage(frame->GetLanguage());
1026baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(EvaluateExpression(expr, options));
1027316d498bSGreg Clayton   }
1028baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(result);
102978a685aaSJim Ingham }
103078a685aaSJim Ingham 
103178a685aaSJim Ingham SBValue
1032b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr,
1033b9c1b51eSKate Stone                             lldb::DynamicValueType fetch_dynamic_value) {
1034baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1035baf5664fSJonas Devlieghere                      (const char *, lldb::DynamicValueType), expr,
1036baf5664fSJonas Devlieghere                      fetch_dynamic_value);
1037baf5664fSJonas Devlieghere 
103835e1bda6SJim Ingham   SBExpressionOptions options;
1039cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
104035e1bda6SJim Ingham   options.SetUnwindOnError(true);
104124785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1042c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1043c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1044c481c7eeSJim Ingham 
1045998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1046998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1047998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1048998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1049998c8a1cSRyan Brown   else if (frame)
1050998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
1051baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(EvaluateExpression(expr, options));
10527ba6e991SJim Ingham }
10537ba6e991SJim Ingham 
1054b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr,
1055b9c1b51eSKate Stone                                     lldb::DynamicValueType fetch_dynamic_value,
1056b9c1b51eSKate Stone                                     bool unwind_on_error) {
1057baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1058baf5664fSJonas Devlieghere                      (const char *, lldb::DynamicValueType, bool), expr,
1059baf5664fSJonas Devlieghere                      fetch_dynamic_value, unwind_on_error);
1060baf5664fSJonas Devlieghere 
106135e1bda6SJim Ingham   SBExpressionOptions options;
1062c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1063c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1064c481c7eeSJim Ingham 
1065cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
106635e1bda6SJim Ingham   options.SetUnwindOnError(unwind_on_error);
106724785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1068998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1069998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1070998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1071998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1072998c8a1cSRyan Brown   else if (frame)
1073998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
1074baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(EvaluateExpression(expr, options));
107535e1bda6SJim Ingham }
107635e1bda6SJim Ingham 
1077b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr,
1078b9c1b51eSKate Stone                                           const SBExpressionOptions &options) {
1079baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1080baf5664fSJonas Devlieghere                      (const char *, const lldb::SBExpressionOptions &), expr,
1081baf5664fSJonas Devlieghere                      options);
1082baf5664fSJonas Devlieghere 
10835160ce5cSGreg Clayton   Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1084a162ebafSSean Callanan 
108569b582faSGreg Clayton   SBValue expr_result;
10867730b9a4SJim Ingham 
1087b9c1b51eSKate Stone   if (expr == nullptr || expr[0] == '\0') {
1088baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(expr_result);
10897730b9a4SJim Ingham   }
10907730b9a4SJim Ingham 
109181e871edSGreg Clayton   ValueObjectSP expr_value_sp;
10924838131bSGreg Clayton 
1093bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1094bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
10954fc6cb9cSJim Ingham 
1096b9556accSGreg Clayton 
1097dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
10987730b9a4SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
10997730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
11007730b9a4SJim Ingham 
1101b9c1b51eSKate Stone   if (target && process) {
11027fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1103b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
11047730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1105b9c1b51eSKate Stone       if (frame) {
11068f7db52dSJim Ingham         std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace;
1107b9c1b51eSKate Stone         if (target->GetDisplayExpressionsInCrashlogs()) {
11081ba7c4d0SGreg Clayton           StreamString frame_description;
1109d9e416c0SGreg Clayton           frame->DumpUsingSettingsFormat(&frame_description);
11108f7db52dSJim Ingham           stack_trace = llvm::make_unique<llvm::PrettyStackTraceFormat>(
1111b9c1b51eSKate Stone               "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value "
1112b9c1b51eSKate Stone               "= %u) %s",
1113b9c1b51eSKate Stone               expr, options.GetFetchDynamicValue(),
1114c156427dSZachary Turner               frame_description.GetData());
1115fb6621efSGreg Clayton         }
1116fb6621efSGreg Clayton 
1117370e5dbaSPavel Labath         target->EvaluateExpression(expr, frame, expr_value_sp, options.ref());
1118e3e91517SEnrico Granata         expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
11197730b9a4SJim Ingham       }
1120c9858e4dSGreg Clayton     }
11217fdf9ef1SGreg Clayton   }
11224838131bSGreg Clayton 
1123a162ebafSSean Callanan   if (expr_log)
1124b9c1b51eSKate Stone     expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is "
1125b9c1b51eSKate Stone                      "%s, summary %s **",
1126324a1036SSaleem Abdulrasool                      expr_result.GetValue(), expr_result.GetSummary());
11274838131bSGreg Clayton 
1128baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(expr_result);
11291d3afba3SGreg Clayton }
1130316d498bSGreg Clayton 
1131b9c1b51eSKate Stone bool SBFrame::IsInlined() {
1132baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsInlined);
1133baf5664fSJonas Devlieghere 
113405f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->IsInlined();
113505f75e9fSOleksiy Vyalov }
113605f75e9fSOleksiy Vyalov 
1137b9c1b51eSKate Stone bool SBFrame::IsInlined() const {
1138baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsInlined);
1139baf5664fSJonas Devlieghere 
1140c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1141c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1142c481c7eeSJim Ingham 
1143dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1144d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
11457730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1146b9c1b51eSKate Stone   if (target && process) {
11477fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1148b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
11497730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1150b9c1b51eSKate Stone       if (frame) {
11517fdf9ef1SGreg Clayton 
1152d9e416c0SGreg Clayton         Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1153316d498bSGreg Clayton         if (block)
1154dbb0abbfSEugene Zelenko           return block->GetContainingInlinedBlock() != nullptr;
11557730b9a4SJim Ingham       }
1156c9858e4dSGreg Clayton     }
11577fdf9ef1SGreg Clayton   }
1158316d498bSGreg Clayton   return false;
1159316d498bSGreg Clayton }
1160316d498bSGreg Clayton 
11614b36f791SVedant Kumar bool SBFrame::IsArtificial() {
1162baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsArtificial);
1163baf5664fSJonas Devlieghere 
11644b36f791SVedant Kumar   return static_cast<const SBFrame *>(this)->IsArtificial();
11654b36f791SVedant Kumar }
11664b36f791SVedant Kumar 
11674b36f791SVedant Kumar bool SBFrame::IsArtificial() const {
1168baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsArtificial);
1169baf5664fSJonas Devlieghere 
11704b36f791SVedant Kumar   std::unique_lock<std::recursive_mutex> lock;
11714b36f791SVedant Kumar   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
11724b36f791SVedant Kumar 
11734b36f791SVedant Kumar   StackFrame *frame = exe_ctx.GetFramePtr();
11744b36f791SVedant Kumar   if (frame)
11754b36f791SVedant Kumar     return frame->IsArtificial();
11764b36f791SVedant Kumar 
11774b36f791SVedant Kumar   return false;
11784b36f791SVedant Kumar }
11794b36f791SVedant Kumar 
1180b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() {
1181baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetFunctionName);
1182baf5664fSJonas Devlieghere 
118305f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->GetFunctionName();
118405f75e9fSOleksiy Vyalov }
118505f75e9fSOleksiy Vyalov 
1186bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const {
1187baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::LanguageType, SBFrame, GuessLanguage);
1188baf5664fSJonas Devlieghere 
1189bdbdd229SJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1190bdbdd229SJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1191bdbdd229SJim Ingham 
1192bdbdd229SJim Ingham   StackFrame *frame = nullptr;
1193bdbdd229SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
1194bdbdd229SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1195bdbdd229SJim Ingham   if (target && process) {
1196bdbdd229SJim Ingham     Process::StopLocker stop_locker;
1197bdbdd229SJim Ingham     if (stop_locker.TryLock(&process->GetRunLock())) {
1198bdbdd229SJim Ingham       frame = exe_ctx.GetFramePtr();
1199bdbdd229SJim Ingham       if (frame) {
1200bdbdd229SJim Ingham         return frame->GuessLanguage();
1201bdbdd229SJim Ingham       }
1202bdbdd229SJim Ingham     }
1203bdbdd229SJim Ingham   }
1204bdbdd229SJim Ingham   return eLanguageTypeUnknown;
1205bdbdd229SJim Ingham }
1206bdbdd229SJim Ingham 
1207b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const {
1208baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, GetFunctionName);
1209baf5664fSJonas Devlieghere 
1210dbb0abbfSEugene Zelenko   const char *name = nullptr;
1211c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1212c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1213c481c7eeSJim Ingham 
1214dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1215d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
12167730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1217b9c1b51eSKate Stone   if (target && process) {
12187fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1219b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
12207730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1221b9c1b51eSKate Stone       if (frame) {
1222b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1223b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1224b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1225b9c1b51eSKate Stone         if (sc.block) {
1226316d498bSGreg Clayton           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1227b9c1b51eSKate Stone           if (inlined_block) {
1228b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1229b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
1230b9c1b51eSKate Stone             name =
1231b9c1b51eSKate Stone                 inlined_info->GetName(sc.function->GetLanguage()).AsCString();
1232316d498bSGreg Clayton           }
1233316d498bSGreg Clayton         }
1234316d498bSGreg Clayton 
1235b9c1b51eSKate Stone         if (name == nullptr) {
1236316d498bSGreg Clayton           if (sc.function)
1237316d498bSGreg Clayton             name = sc.function->GetName().GetCString();
1238316d498bSGreg Clayton         }
1239316d498bSGreg Clayton 
1240b9c1b51eSKate Stone         if (name == nullptr) {
1241316d498bSGreg Clayton           if (sc.symbol)
1242316d498bSGreg Clayton             name = sc.symbol->GetName().GetCString();
1243316d498bSGreg Clayton         }
12447730b9a4SJim Ingham       }
1245c9858e4dSGreg Clayton     }
12467fdf9ef1SGreg Clayton   }
1247316d498bSGreg Clayton   return name;
1248316d498bSGreg Clayton }
1249c1f705c2SEnrico Granata 
1250b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() {
1251baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetDisplayFunctionName);
1252baf5664fSJonas Devlieghere 
1253dbb0abbfSEugene Zelenko   const char *name = nullptr;
1254c481c7eeSJim Ingham 
1255c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1256c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1257c481c7eeSJim Ingham 
1258dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1259c1f705c2SEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
1260c1f705c2SEnrico Granata   Process *process = exe_ctx.GetProcessPtr();
1261b9c1b51eSKate Stone   if (target && process) {
1262c1f705c2SEnrico Granata     Process::StopLocker stop_locker;
1263b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1264c1f705c2SEnrico Granata       frame = exe_ctx.GetFramePtr();
1265b9c1b51eSKate Stone       if (frame) {
1266b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1267b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1268b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1269b9c1b51eSKate Stone         if (sc.block) {
1270c1f705c2SEnrico Granata           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1271b9c1b51eSKate Stone           if (inlined_block) {
1272b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1273b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
1274b9c1b51eSKate Stone             name = inlined_info->GetDisplayName(sc.function->GetLanguage())
1275b9c1b51eSKate Stone                        .AsCString();
1276c1f705c2SEnrico Granata           }
1277c1f705c2SEnrico Granata         }
1278c1f705c2SEnrico Granata 
1279b9c1b51eSKate Stone         if (name == nullptr) {
1280c1f705c2SEnrico Granata           if (sc.function)
1281c1f705c2SEnrico Granata             name = sc.function->GetDisplayName().GetCString();
1282c1f705c2SEnrico Granata         }
1283c1f705c2SEnrico Granata 
1284b9c1b51eSKate Stone         if (name == nullptr) {
1285c1f705c2SEnrico Granata           if (sc.symbol)
1286c1f705c2SEnrico Granata             name = sc.symbol->GetDisplayName().GetCString();
1287c1f705c2SEnrico Granata         }
1288c1f705c2SEnrico Granata       }
1289c1f705c2SEnrico Granata     }
1290c1f705c2SEnrico Granata   }
1291c1f705c2SEnrico Granata   return name;
1292c1f705c2SEnrico Granata }
1293*ae211eceSMichal Gorny 
1294*ae211eceSMichal Gorny namespace lldb_private {
1295*ae211eceSMichal Gorny namespace repro {
1296*ae211eceSMichal Gorny 
1297*ae211eceSMichal Gorny template <>
1298*ae211eceSMichal Gorny void RegisterMethods<SBFrame>(Registry &R) {
1299*ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBFrame, ());
1300*ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBFrame, (const lldb::StackFrameSP &));
1301*ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBFrame, (const lldb::SBFrame &));
1302*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const lldb::SBFrame &,
1303*ae211eceSMichal Gorny                        SBFrame, operator=,(const lldb::SBFrame &));
1304*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsValid, ());
1305*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBFrame, operator bool, ());
1306*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBSymbolContext, SBFrame, GetSymbolContext,
1307*ae211eceSMichal Gorny                              (uint32_t));
1308*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBModule, SBFrame, GetModule, ());
1309*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBCompileUnit, SBFrame, GetCompileUnit,
1310*ae211eceSMichal Gorny                              ());
1311*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBFunction, SBFrame, GetFunction, ());
1312*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBSymbol, SBFrame, GetSymbol, ());
1313*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBBlock, SBFrame, GetBlock, ());
1314*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBBlock, SBFrame, GetFrameBlock, ());
1315*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBLineEntry, SBFrame, GetLineEntry, ());
1316*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(uint32_t, SBFrame, GetFrameID, ());
1317*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetCFA, ());
1318*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetPC, ());
1319*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBFrame, SetPC, (lldb::addr_t));
1320*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetSP, ());
1321*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetFP, ());
1322*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBFrame, GetPCAddress, ());
1323*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBFrame, Clear, ());
1324*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath,
1325*ae211eceSMichal Gorny                        (const char *));
1326*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath,
1327*ae211eceSMichal Gorny                        (const char *, lldb::DynamicValueType));
1328*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *));
1329*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindVariable,
1330*ae211eceSMichal Gorny                        (const char *, lldb::DynamicValueType));
1331*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindValue,
1332*ae211eceSMichal Gorny                        (const char *, lldb::ValueType));
1333*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(
1334*ae211eceSMichal Gorny       lldb::SBValue, SBFrame, FindValue,
1335*ae211eceSMichal Gorny       (const char *, lldb::ValueType, lldb::DynamicValueType));
1336*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &));
1337*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool,
1338*ae211eceSMichal Gorny                              SBFrame, operator==,(const lldb::SBFrame &));
1339*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool,
1340*ae211eceSMichal Gorny                              SBFrame, operator!=,(const lldb::SBFrame &));
1341*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBThread, SBFrame, GetThread, ());
1342*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(const char *, SBFrame, Disassemble, ());
1343*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables,
1344*ae211eceSMichal Gorny                        (bool, bool, bool, bool));
1345*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables,
1346*ae211eceSMichal Gorny                        (bool, bool, bool, bool, lldb::DynamicValueType));
1347*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables,
1348*ae211eceSMichal Gorny                        (const lldb::SBVariablesOptions &));
1349*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetRegisters, ());
1350*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *));
1351*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &));
1352*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1353*ae211eceSMichal Gorny                        (const char *));
1354*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1355*ae211eceSMichal Gorny                        (const char *, lldb::DynamicValueType));
1356*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1357*ae211eceSMichal Gorny                        (const char *, lldb::DynamicValueType, bool));
1358*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1359*ae211eceSMichal Gorny                        (const char *, const lldb::SBExpressionOptions &));
1360*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBFrame, IsInlined, ());
1361*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsInlined, ());
1362*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBFrame, IsArtificial, ());
1363*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsArtificial, ());
1364*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const char *, SBFrame, GetFunctionName, ());
1365*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::LanguageType, SBFrame, GuessLanguage, ());
1366*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(const char *, SBFrame, GetFunctionName, ());
1367*ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const char *, SBFrame, GetDisplayFunctionName, ());
1368*ae211eceSMichal Gorny }
1369*ae211eceSMichal Gorny 
1370*ae211eceSMichal Gorny }
1371*ae211eceSMichal Gorny }
1372