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);
94baf5664fSJonas Devlieghere 
95bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
96bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
977fa7dc36SJim Ingham 
987fa7dc36SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
997fa7dc36SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
100b9c1b51eSKate Stone   if (target && process) {
1017fa7dc36SJim Ingham     Process::StopLocker stop_locker;
1027fa7dc36SJim Ingham     if (stop_locker.TryLock(&process->GetRunLock()))
103dbb0abbfSEugene Zelenko       return GetFrameSP().get() != nullptr;
10430fdc8d8SChris Lattner   }
10530fdc8d8SChris Lattner 
1067fa7dc36SJim Ingham   // Without a target & process we can't have a valid stack frame.
1077fa7dc36SJim Ingham   return false;
1087fa7dc36SJim Ingham }
1097fa7dc36SJim Ingham 
110b9c1b51eSKate Stone SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const {
111baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(lldb::SBSymbolContext, SBFrame, GetSymbolContext,
112baf5664fSJonas Devlieghere                            (uint32_t), resolve_scope);
113baf5664fSJonas Devlieghere 
11430fdc8d8SChris Lattner   SBSymbolContext sb_sym_ctx;
115bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
116bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
117991e4453SZachary Turner   SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope);
118dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
119d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1207730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
121b9c1b51eSKate Stone   if (target && process) {
1227fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
123b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1247730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
125*581af8b0SJonas Devlieghere       if (frame)
126991e4453SZachary Turner         sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext(scope));
127c9858e4dSGreg Clayton     }
1287fdf9ef1SGreg Clayton   }
129ceb6b139SCaroline Tice 
130baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_sym_ctx);
13130fdc8d8SChris Lattner }
13230fdc8d8SChris Lattner 
133b9c1b51eSKate Stone SBModule SBFrame::GetModule() const {
134baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBModule, SBFrame, GetModule);
135baf5664fSJonas Devlieghere 
13672eff18aSGreg Clayton   SBModule sb_module;
137acdbe816SGreg Clayton   ModuleSP module_sp;
138bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
139bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1404fc6cb9cSJim Ingham 
141dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
142d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1437730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
144b9c1b51eSKate Stone   if (target && process) {
1457fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
146b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1477730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
148b9c1b51eSKate Stone       if (frame) {
149d9e416c0SGreg Clayton         module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp;
150acdbe816SGreg Clayton         sb_module.SetSP(module_sp);
151c9858e4dSGreg Clayton       }
1527fdf9ef1SGreg Clayton     }
153*581af8b0SJonas Devlieghere   }
1544838131bSGreg Clayton 
155baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_module);
15630fdc8d8SChris Lattner }
15730fdc8d8SChris Lattner 
158b9c1b51eSKate Stone SBCompileUnit SBFrame::GetCompileUnit() const {
159baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBCompileUnit, SBFrame,
160baf5664fSJonas Devlieghere                                    GetCompileUnit);
161baf5664fSJonas Devlieghere 
16272eff18aSGreg Clayton   SBCompileUnit sb_comp_unit;
163bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
164bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1654fc6cb9cSJim Ingham 
166dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
167d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1687730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
169b9c1b51eSKate Stone   if (target && process) {
1707fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
171b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1727730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
173b9c1b51eSKate Stone       if (frame) {
174b9c1b51eSKate Stone         sb_comp_unit.reset(
175b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit);
176c9858e4dSGreg Clayton       }
177c9858e4dSGreg Clayton     }
178*581af8b0SJonas Devlieghere   }
179ceb6b139SCaroline Tice 
180baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_comp_unit);
18130fdc8d8SChris Lattner }
18230fdc8d8SChris Lattner 
183b9c1b51eSKate Stone SBFunction SBFrame::GetFunction() const {
184baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFunction, SBFrame, GetFunction);
185baf5664fSJonas Devlieghere 
18672eff18aSGreg Clayton   SBFunction sb_function;
187bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
188bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1894fc6cb9cSJim Ingham 
190dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
191d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1927730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
193b9c1b51eSKate Stone   if (target && process) {
1947fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
195b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1967730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
197b9c1b51eSKate Stone       if (frame) {
198b9c1b51eSKate Stone         sb_function.reset(
199b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextFunction).function);
2007fdf9ef1SGreg Clayton       }
201c9858e4dSGreg Clayton     }
202*581af8b0SJonas Devlieghere   }
2034838131bSGreg Clayton 
204baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_function);
20530fdc8d8SChris Lattner }
20630fdc8d8SChris Lattner 
207b9c1b51eSKate Stone SBSymbol SBFrame::GetSymbol() const {
208baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBSymbol, SBFrame, GetSymbol);
209baf5664fSJonas Devlieghere 
21072eff18aSGreg Clayton   SBSymbol sb_symbol;
211bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
212bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2134fc6cb9cSJim Ingham 
214dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
215d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2167730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
217b9c1b51eSKate Stone   if (target && process) {
2187fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
219b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2207730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
221b9c1b51eSKate Stone       if (frame) {
222d9e416c0SGreg Clayton         sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol);
2237fdf9ef1SGreg Clayton       }
224c9858e4dSGreg Clayton     }
225*581af8b0SJonas Devlieghere   }
226*581af8b0SJonas Devlieghere 
227baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_symbol);
2283b06557eSGreg Clayton }
2293b06557eSGreg Clayton 
230b9c1b51eSKate Stone SBBlock SBFrame::GetBlock() const {
231baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBlock, SBFrame, GetBlock);
232baf5664fSJonas Devlieghere 
23372eff18aSGreg Clayton   SBBlock sb_block;
234bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
235bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2364fc6cb9cSJim Ingham 
237dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
238d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2397730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
240b9c1b51eSKate Stone   if (target && process) {
2417fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
242b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2437730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
244*581af8b0SJonas Devlieghere       if (frame)
245d9e416c0SGreg Clayton         sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block);
2467fdf9ef1SGreg Clayton     }
247c9858e4dSGreg Clayton   }
248baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_block);
24930fdc8d8SChris Lattner }
25030fdc8d8SChris Lattner 
251b9c1b51eSKate Stone SBBlock SBFrame::GetFrameBlock() const {
252baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBlock, SBFrame, GetFrameBlock);
253baf5664fSJonas Devlieghere 
25472eff18aSGreg Clayton   SBBlock sb_block;
255bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
256bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2574fc6cb9cSJim Ingham 
258dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
259d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2607730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
261b9c1b51eSKate Stone   if (target && process) {
2627fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
263b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2647730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
265*581af8b0SJonas Devlieghere       if (frame)
266d9e416c0SGreg Clayton         sb_block.SetPtr(frame->GetFrameBlock());
2677fdf9ef1SGreg Clayton     }
268c9858e4dSGreg Clayton   }
269baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_block);
27095897c6aSGreg Clayton }
27195897c6aSGreg Clayton 
272b9c1b51eSKate Stone SBLineEntry SBFrame::GetLineEntry() const {
273baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBLineEntry, SBFrame, GetLineEntry);
274baf5664fSJonas Devlieghere 
27572eff18aSGreg Clayton   SBLineEntry sb_line_entry;
276bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
277bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2784fc6cb9cSJim Ingham 
279dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
280d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2817730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
282b9c1b51eSKate Stone   if (target && process) {
2837fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
284b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2857730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
286b9c1b51eSKate Stone       if (frame) {
287b9c1b51eSKate Stone         sb_line_entry.SetLineEntry(
288b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextLineEntry).line_entry);
2897fdf9ef1SGreg Clayton       }
290c9858e4dSGreg Clayton     }
291*581af8b0SJonas Devlieghere   }
292baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_line_entry);
29330fdc8d8SChris Lattner }
29430fdc8d8SChris Lattner 
295b9c1b51eSKate Stone uint32_t SBFrame::GetFrameID() const {
296baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBFrame, GetFrameID);
297baf5664fSJonas Devlieghere 
298b9556accSGreg Clayton   uint32_t frame_idx = UINT32_MAX;
299b9556accSGreg Clayton 
300c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
301c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
302c481c7eeSJim Ingham 
303b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
3047fdf9ef1SGreg Clayton   if (frame)
305d9e416c0SGreg Clayton     frame_idx = frame->GetFrameIndex();
3064838131bSGreg Clayton 
3074838131bSGreg Clayton   return frame_idx;
30830fdc8d8SChris Lattner }
30930fdc8d8SChris Lattner 
310b9c1b51eSKate Stone lldb::addr_t SBFrame::GetCFA() const {
311baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetCFA);
312baf5664fSJonas Devlieghere 
313c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
314c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
315c481c7eeSJim Ingham 
316424a5dbcSGreg Clayton   StackFrame *frame = exe_ctx.GetFramePtr();
317424a5dbcSGreg Clayton   if (frame)
318424a5dbcSGreg Clayton     return frame->GetStackID().GetCallFrameAddress();
319424a5dbcSGreg Clayton   return LLDB_INVALID_ADDRESS;
320424a5dbcSGreg Clayton }
321424a5dbcSGreg Clayton 
322b9c1b51eSKate Stone addr_t SBFrame::GetPC() const {
323baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetPC);
324baf5664fSJonas Devlieghere 
32569b582faSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
326bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
327bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3284fc6cb9cSJim Ingham 
329dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
330d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3317730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
332b9c1b51eSKate Stone   if (target && process) {
3337fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
334b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3357730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
336b9c1b51eSKate Stone       if (frame) {
337b9c1b51eSKate Stone         addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress(
33804803b3eSTatyana Krasnukha             target, AddressClass::eCode);
339c9858e4dSGreg Clayton       }
3407fdf9ef1SGreg Clayton     }
341*581af8b0SJonas Devlieghere   }
342ceb6b139SCaroline Tice 
343ceb6b139SCaroline Tice   return addr;
34430fdc8d8SChris Lattner }
34530fdc8d8SChris Lattner 
346b9c1b51eSKate Stone bool SBFrame::SetPC(addr_t new_pc) {
347baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBFrame, SetPC, (lldb::addr_t), new_pc);
348baf5664fSJonas Devlieghere 
349ceb6b139SCaroline Tice   bool ret_val = false;
350bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
351bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3524fc6cb9cSJim Ingham 
353dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
354d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3557730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
356b9c1b51eSKate Stone   if (target && process) {
3577fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
358b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3597730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
360b9c1b51eSKate Stone       if (frame) {
361d9e416c0SGreg Clayton         ret_val = frame->GetRegisterContext()->SetPC(new_pc);
362c9858e4dSGreg Clayton       }
3637fdf9ef1SGreg Clayton     }
364*581af8b0SJonas Devlieghere   }
365ceb6b139SCaroline Tice 
366ceb6b139SCaroline Tice   return ret_val;
36730fdc8d8SChris Lattner }
36830fdc8d8SChris Lattner 
369b9c1b51eSKate Stone addr_t SBFrame::GetSP() const {
370baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetSP);
371baf5664fSJonas Devlieghere 
3724838131bSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
373bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
374bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3754fc6cb9cSJim Ingham 
376dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
377d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3787730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
379b9c1b51eSKate Stone   if (target && process) {
3807fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
381b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3827730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
383b9c1b51eSKate Stone       if (frame) {
384d9e416c0SGreg Clayton         addr = frame->GetRegisterContext()->GetSP();
3857fdf9ef1SGreg Clayton       }
386c9858e4dSGreg Clayton     }
387*581af8b0SJonas Devlieghere   }
3884838131bSGreg Clayton 
3894838131bSGreg Clayton   return addr;
39030fdc8d8SChris Lattner }
39130fdc8d8SChris Lattner 
392b9c1b51eSKate Stone addr_t SBFrame::GetFP() const {
393baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetFP);
394baf5664fSJonas Devlieghere 
39569b582faSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
396bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
397bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3984fc6cb9cSJim Ingham 
399dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
400d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4017730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
402b9c1b51eSKate Stone   if (target && process) {
4037fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
404b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4057730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
406*581af8b0SJonas Devlieghere       if (frame)
407d9e416c0SGreg Clayton         addr = frame->GetRegisterContext()->GetFP();
408c9858e4dSGreg Clayton     }
4097fdf9ef1SGreg Clayton   }
410ceb6b139SCaroline Tice 
411ceb6b139SCaroline Tice   return addr;
41230fdc8d8SChris Lattner }
41330fdc8d8SChris Lattner 
414b9c1b51eSKate Stone SBAddress SBFrame::GetPCAddress() const {
415baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBFrame, GetPCAddress);
416baf5664fSJonas Devlieghere 
41730fdc8d8SChris Lattner   SBAddress sb_addr;
418bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
419bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4204fc6cb9cSJim Ingham 
421b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
422d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4237730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
424b9c1b51eSKate Stone   if (target && process) {
4257fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
426b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4277730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
428*581af8b0SJonas Devlieghere       if (frame)
429d9e416c0SGreg Clayton         sb_addr.SetAddress(&frame->GetFrameCodeAddress());
4307fdf9ef1SGreg Clayton     }
431c9858e4dSGreg Clayton   }
432baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_addr);
43330fdc8d8SChris Lattner }
43430fdc8d8SChris Lattner 
435baf5664fSJonas Devlieghere void SBFrame::Clear() {
436baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBFrame, Clear);
437baf5664fSJonas Devlieghere 
438baf5664fSJonas Devlieghere   m_opaque_sp->Clear();
439baf5664fSJonas Devlieghere }
44030fdc8d8SChris Lattner 
441b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) {
442baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath,
443baf5664fSJonas Devlieghere                      (const char *), var_path);
444baf5664fSJonas Devlieghere 
4457edbdfc9SGreg Clayton   SBValue sb_value;
446c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
447c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
448c481c7eeSJim Ingham 
449b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
450d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
451b9c1b51eSKate Stone   if (frame && target) {
452b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
453b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
4547edbdfc9SGreg Clayton     sb_value = GetValueForVariablePath(var_path, use_dynamic);
4557edbdfc9SGreg Clayton   }
456baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value);
4577edbdfc9SGreg Clayton }
4587edbdfc9SGreg Clayton 
459b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path,
460b9c1b51eSKate Stone                                                DynamicValueType use_dynamic) {
461baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath,
462baf5664fSJonas Devlieghere                      (const char *, lldb::DynamicValueType), var_path,
463baf5664fSJonas Devlieghere                      use_dynamic);
464baf5664fSJonas Devlieghere 
4657edbdfc9SGreg Clayton   SBValue sb_value;
466b9c1b51eSKate Stone   if (var_path == nullptr || var_path[0] == '\0') {
467baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_value);
4687730b9a4SJim Ingham   }
4697730b9a4SJim Ingham 
470bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
471bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4724fc6cb9cSJim Ingham 
473dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
474d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4757730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
476b9c1b51eSKate Stone   if (target && process) {
4777fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
478b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4797730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
480b9c1b51eSKate Stone       if (frame) {
4817edbdfc9SGreg Clayton         VariableSP var_sp;
48297206d57SZachary Turner         Status error;
483b9c1b51eSKate Stone         ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath(
484b9c1b51eSKate Stone             var_path, eNoDynamicValues,
485b9c1b51eSKate Stone             StackFrame::eExpressionPathOptionCheckPtrVsMember |
486b9c1b51eSKate Stone                 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
487b9c1b51eSKate Stone             var_sp, error));
488e3e91517SEnrico Granata         sb_value.SetSP(value_sp, use_dynamic);
4897730b9a4SJim Ingham       }
490c9858e4dSGreg Clayton     }
4917fdf9ef1SGreg Clayton   }
492baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value);
4937edbdfc9SGreg Clayton }
4947edbdfc9SGreg Clayton 
495b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name) {
496baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *),
497baf5664fSJonas Devlieghere                      name);
498baf5664fSJonas Devlieghere 
499316d498bSGreg Clayton   SBValue value;
500c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
501c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
502c481c7eeSJim Ingham 
503b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
504d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
505b9c1b51eSKate Stone   if (frame && target) {
506b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
507b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
508316d498bSGreg Clayton     value = FindVariable(name, use_dynamic);
509316d498bSGreg Clayton   }
510baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value);
51178a685aaSJim Ingham }
51278a685aaSJim Ingham 
513b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name,
514b9c1b51eSKate Stone                               lldb::DynamicValueType use_dynamic) {
515baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable,
516baf5664fSJonas Devlieghere                      (const char *, lldb::DynamicValueType), name, use_dynamic);
517baf5664fSJonas Devlieghere 
51869b582faSGreg Clayton   VariableSP var_sp;
51958b59f95SJim Ingham   SBValue sb_value;
5207730b9a4SJim Ingham 
521b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
522baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_value);
5237730b9a4SJim Ingham   }
5247730b9a4SJim Ingham 
52581e871edSGreg Clayton   ValueObjectSP value_sp;
526bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
527bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5284fc6cb9cSJim Ingham 
529dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
530d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5317730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
532b9c1b51eSKate Stone   if (target && process) {
5337fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
534b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5357730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
536b9c1b51eSKate Stone       if (frame) {
537e23d0b63SShafik Yaghmour         value_sp = frame->FindVariable(ConstString(name));
53830fdc8d8SChris Lattner 
539e23d0b63SShafik Yaghmour         if (value_sp)
540e3e91517SEnrico Granata           sb_value.SetSP(value_sp, use_dynamic);
541c9858e4dSGreg Clayton       }
542316d498bSGreg Clayton     }
543*581af8b0SJonas Devlieghere   }
5444838131bSGreg Clayton 
545baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value);
546dde9cff3SCaroline Tice }
547dde9cff3SCaroline Tice 
548b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) {
549baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue,
550baf5664fSJonas Devlieghere                      (const char *, lldb::ValueType), name, value_type);
551baf5664fSJonas Devlieghere 
552316d498bSGreg Clayton   SBValue value;
553c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
554c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
555c481c7eeSJim Ingham 
556b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
557d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
558b9c1b51eSKate Stone   if (frame && target) {
559b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
560b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
561316d498bSGreg Clayton     value = FindValue(name, value_type, use_dynamic);
562316d498bSGreg Clayton   }
563baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value);
56478a685aaSJim Ingham }
56578a685aaSJim Ingham 
566b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type,
567b9c1b51eSKate Stone                            lldb::DynamicValueType use_dynamic) {
568baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue,
569baf5664fSJonas Devlieghere                      (const char *, lldb::ValueType, lldb::DynamicValueType),
570baf5664fSJonas Devlieghere                      name, value_type, use_dynamic);
571baf5664fSJonas Devlieghere 
57269b582faSGreg Clayton   SBValue sb_value;
5737730b9a4SJim Ingham 
574b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
575baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_value);
5767730b9a4SJim Ingham   }
5777730b9a4SJim Ingham 
57881e871edSGreg Clayton   ValueObjectSP value_sp;
579bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
580bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5814fc6cb9cSJim Ingham 
582dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
583d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5847730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
585b9c1b51eSKate Stone   if (target && process) {
5867fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
587b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5887730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
589b9c1b51eSKate Stone       if (frame) {
5908a2a0dfbSEnrico Granata         VariableList variable_list;
5918a2a0dfbSEnrico Granata 
592b9c1b51eSKate Stone         switch (value_type) {
59369b582faSGreg Clayton         case eValueTypeVariableGlobal:      // global variable
59469b582faSGreg Clayton         case eValueTypeVariableStatic:      // static variable
59569b582faSGreg Clayton         case eValueTypeVariableArgument:    // function argument variables
59669b582faSGreg Clayton         case eValueTypeVariableLocal:       // function local variables
59763a27afaSGreg Clayton         case eValueTypeVariableThreadLocal: // thread local variables
59869b582faSGreg Clayton         {
599d9e416c0SGreg Clayton           SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock));
60072eff18aSGreg Clayton 
60172eff18aSGreg Clayton           const bool can_create = true;
60272eff18aSGreg Clayton           const bool get_parent_variables = true;
60372eff18aSGreg Clayton           const bool stop_if_block_is_inlined_function = true;
60472eff18aSGreg Clayton 
6050efb51a0SChaoren Lin           if (sc.block)
606b9c1b51eSKate Stone             sc.block->AppendVariables(
607b9c1b51eSKate Stone                 can_create, get_parent_variables,
608b9c1b51eSKate Stone                 stop_if_block_is_inlined_function,
609b9c1b51eSKate Stone                 [frame](Variable *v) { return v->IsInScope(frame); },
610b9c1b51eSKate Stone                 &variable_list);
611b9c1b51eSKate Stone           if (value_type == eValueTypeVariableGlobal) {
6128a2a0dfbSEnrico Granata             const bool get_file_globals = true;
6138a2a0dfbSEnrico Granata             VariableList *frame_vars = frame->GetVariableList(get_file_globals);
6148a2a0dfbSEnrico Granata             if (frame_vars)
6158a2a0dfbSEnrico Granata               frame_vars->AppendVariablesIfUnique(variable_list);
6168a2a0dfbSEnrico Granata           }
61769b582faSGreg Clayton           ConstString const_name(name);
618b9c1b51eSKate Stone           VariableSP variable_sp(
619b9c1b51eSKate Stone               variable_list.FindVariable(const_name, value_type));
620b9c1b51eSKate Stone           if (variable_sp) {
621b9c1b51eSKate Stone             value_sp = frame->GetValueObjectForFrameVariable(variable_sp,
622b9c1b51eSKate Stone                                                              eNoDynamicValues);
623e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
62430fdc8d8SChris Lattner           }
625b9c1b51eSKate Stone         } break;
62669b582faSGreg Clayton 
62769b582faSGreg Clayton         case eValueTypeRegister: // stack frame register value
62869b582faSGreg Clayton         {
629d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
630b9c1b51eSKate Stone           if (reg_ctx) {
63169b582faSGreg Clayton             const uint32_t num_regs = reg_ctx->GetRegisterCount();
632b9c1b51eSKate Stone             for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) {
633b9c1b51eSKate Stone               const RegisterInfo *reg_info =
634b9c1b51eSKate Stone                   reg_ctx->GetRegisterInfoAtIndex(reg_idx);
63569b582faSGreg Clayton               if (reg_info &&
63669b582faSGreg Clayton                   ((reg_info->name && strcasecmp(reg_info->name, name) == 0) ||
637b9c1b51eSKate Stone                    (reg_info->alt_name &&
638b9c1b51eSKate Stone                     strcasecmp(reg_info->alt_name, name) == 0))) {
639d9e416c0SGreg Clayton                 value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx);
64081e871edSGreg Clayton                 sb_value.SetSP(value_sp);
64181e871edSGreg Clayton                 break;
64269b582faSGreg Clayton               }
64369b582faSGreg Clayton             }
64469b582faSGreg Clayton           }
645b9c1b51eSKate Stone         } break;
64669b582faSGreg Clayton 
647b9c1b51eSKate Stone         case eValueTypeRegisterSet: // A collection of stack frame register
648b9c1b51eSKate Stone                                     // values
64969b582faSGreg Clayton         {
650d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
651b9c1b51eSKate Stone           if (reg_ctx) {
65269b582faSGreg Clayton             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
653b9c1b51eSKate Stone             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
65469b582faSGreg Clayton               const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx);
65569b582faSGreg Clayton               if (reg_set &&
65669b582faSGreg Clayton                   ((reg_set->name && strcasecmp(reg_set->name, name) == 0) ||
657b9c1b51eSKate Stone                    (reg_set->short_name &&
658b9c1b51eSKate Stone                     strcasecmp(reg_set->short_name, name) == 0))) {
659b9c1b51eSKate Stone                 value_sp =
660b9c1b51eSKate Stone                     ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx);
66181e871edSGreg Clayton                 sb_value.SetSP(value_sp);
66281e871edSGreg Clayton                 break;
66369b582faSGreg Clayton               }
66469b582faSGreg Clayton             }
66569b582faSGreg Clayton           }
666b9c1b51eSKate Stone         } break;
66769b582faSGreg Clayton 
66869b582faSGreg Clayton         case eValueTypeConstResult: // constant result variables
66969b582faSGreg Clayton         {
67069b582faSGreg Clayton           ConstString const_name(name);
671b9c1b51eSKate Stone           ExpressionVariableSP expr_var_sp(
672b9c1b51eSKate Stone               target->GetPersistentVariable(const_name));
673b9c1b51eSKate Stone           if (expr_var_sp) {
67481e871edSGreg Clayton             value_sp = expr_var_sp->GetValueObject();
675e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
67681e871edSGreg Clayton           }
677b9c1b51eSKate Stone         } break;
67869b582faSGreg Clayton 
67969b582faSGreg Clayton         default:
68069b582faSGreg Clayton           break;
68169b582faSGreg Clayton         }
682c9858e4dSGreg Clayton       }
6837fdf9ef1SGreg Clayton     }
684*581af8b0SJonas Devlieghere   }
6854838131bSGreg Clayton 
686baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value);
687dde9cff3SCaroline Tice }
688dde9cff3SCaroline Tice 
689b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const {
690baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &),
691baf5664fSJonas Devlieghere                            that);
692baf5664fSJonas Devlieghere 
693b57e4a1bSJason Molenda   lldb::StackFrameSP this_sp = GetFrameSP();
694b57e4a1bSJason Molenda   lldb::StackFrameSP that_sp = that.GetFrameSP();
69535e2ab60SJohnny Chen   return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
69635e2ab60SJohnny Chen }
69735e2ab60SJohnny Chen 
698baf5664fSJonas Devlieghere bool SBFrame::operator==(const SBFrame &rhs) const {
699baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator==,(const lldb::SBFrame &),
700baf5664fSJonas Devlieghere                            rhs);
70130fdc8d8SChris Lattner 
702baf5664fSJonas Devlieghere   return IsEqual(rhs);
703baf5664fSJonas Devlieghere }
704baf5664fSJonas Devlieghere 
705baf5664fSJonas Devlieghere bool SBFrame::operator!=(const SBFrame &rhs) const {
706baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator!=,(const lldb::SBFrame &),
707baf5664fSJonas Devlieghere                            rhs);
708baf5664fSJonas Devlieghere 
709baf5664fSJonas Devlieghere   return !IsEqual(rhs);
710baf5664fSJonas Devlieghere }
71130fdc8d8SChris Lattner 
712b9c1b51eSKate Stone SBThread SBFrame::GetThread() const {
713baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBThread, SBFrame, GetThread);
714baf5664fSJonas Devlieghere 
715c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
716c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
717c481c7eeSJim Ingham 
718d9e416c0SGreg Clayton   ThreadSP thread_sp(exe_ctx.GetThreadSP());
719d9e416c0SGreg Clayton   SBThread sb_thread(thread_sp);
720ceb6b139SCaroline Tice 
721baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_thread);
72230fdc8d8SChris Lattner }
72330fdc8d8SChris Lattner 
724b9c1b51eSKate Stone const char *SBFrame::Disassemble() const {
725baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, Disassemble);
726baf5664fSJonas Devlieghere 
727dbb0abbfSEugene Zelenko   const char *disassembly = nullptr;
728bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
729bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
7304fc6cb9cSJim Ingham 
731dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
732d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
7337730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
734b9c1b51eSKate Stone   if (target && process) {
7357fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
736b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
7377730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
738b9c1b51eSKate Stone       if (frame) {
739d9e416c0SGreg Clayton         disassembly = frame->Disassemble();
7407fdf9ef1SGreg Clayton       }
741c9858e4dSGreg Clayton     }
742*581af8b0SJonas Devlieghere   }
7434838131bSGreg Clayton 
7444838131bSGreg Clayton   return disassembly;
74530fdc8d8SChris Lattner }
74630fdc8d8SChris Lattner 
747b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics,
748b9c1b51eSKate Stone                                   bool in_scope_only) {
749baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables,
750baf5664fSJonas Devlieghere                      (bool, bool, bool, bool), arguments, locals, statics,
751baf5664fSJonas Devlieghere                      in_scope_only);
752baf5664fSJonas Devlieghere 
753316d498bSGreg Clayton   SBValueList value_list;
754c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
755c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
756c481c7eeSJim Ingham 
757b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
758d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
759b9c1b51eSKate Stone   if (frame && target) {
760b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
761b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
762b9c1b51eSKate Stone     const bool include_runtime_support_values =
763b9c1b51eSKate Stone         target ? target->GetDisplayRuntimeSupportValues() : false;
76451f96eebSZachary Turner 
76551f96eebSZachary Turner     SBVariablesOptions options;
76651f96eebSZachary Turner     options.SetIncludeArguments(arguments);
76751f96eebSZachary Turner     options.SetIncludeLocals(locals);
76851f96eebSZachary Turner     options.SetIncludeStatics(statics);
76951f96eebSZachary Turner     options.SetInScopeOnly(in_scope_only);
77051f96eebSZachary Turner     options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
77151f96eebSZachary Turner     options.SetUseDynamic(use_dynamic);
77251f96eebSZachary Turner 
77351f96eebSZachary Turner     value_list = GetVariables(options);
774316d498bSGreg Clayton   }
775baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value_list);
77678a685aaSJim Ingham }
77778a685aaSJim Ingham 
778b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals,
779b9c1b51eSKate Stone                                         bool statics, bool in_scope_only,
780b9c1b51eSKate Stone                                         lldb::DynamicValueType use_dynamic) {
781baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables,
782baf5664fSJonas Devlieghere                      (bool, bool, bool, bool, lldb::DynamicValueType),
783baf5664fSJonas Devlieghere                      arguments, locals, statics, in_scope_only, use_dynamic);
784baf5664fSJonas Devlieghere 
785c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
786c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
787c481c7eeSJim Ingham 
788560558ebSEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
789b9c1b51eSKate Stone   const bool include_runtime_support_values =
790b9c1b51eSKate Stone       target ? target->GetDisplayRuntimeSupportValues() : false;
79151f96eebSZachary Turner   SBVariablesOptions options;
79251f96eebSZachary Turner   options.SetIncludeArguments(arguments);
79351f96eebSZachary Turner   options.SetIncludeLocals(locals);
79451f96eebSZachary Turner   options.SetIncludeStatics(statics);
79551f96eebSZachary Turner   options.SetInScopeOnly(in_scope_only);
79651f96eebSZachary Turner   options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
79751f96eebSZachary Turner   options.SetUseDynamic(use_dynamic);
798baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(GetVariables(options));
799560558ebSEnrico Granata }
800560558ebSEnrico Granata 
801b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) {
802baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables,
803baf5664fSJonas Devlieghere                      (const lldb::SBVariablesOptions &), options);
804baf5664fSJonas Devlieghere 
805b9556accSGreg Clayton   SBValueList value_list;
806bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
807bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
8084fc6cb9cSJim Ingham 
809dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
810d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
811b9556accSGreg Clayton 
81251f96eebSZachary Turner   const bool statics = options.GetIncludeStatics();
81351f96eebSZachary Turner   const bool arguments = options.GetIncludeArguments();
8144c7f5d5cSKuba Mracek   const bool recognized_arguments =
8154c7f5d5cSKuba Mracek         options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP()));
81651f96eebSZachary Turner   const bool locals = options.GetIncludeLocals();
81751f96eebSZachary Turner   const bool in_scope_only = options.GetInScopeOnly();
818b9c1b51eSKate Stone   const bool include_runtime_support_values =
819b9c1b51eSKate Stone       options.GetIncludeRuntimeSupportValues();
82051f96eebSZachary Turner   const lldb::DynamicValueType use_dynamic = options.GetUseDynamic();
82151f96eebSZachary Turner 
822ceb6b139SCaroline Tice 
823349213f9SGreg Clayton   std::set<VariableSP> variable_set;
8247730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
825b9c1b51eSKate Stone   if (target && process) {
8267fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
827b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
8287730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
829b9c1b51eSKate Stone       if (frame) {
83030fdc8d8SChris Lattner         size_t i;
831dbb0abbfSEugene Zelenko         VariableList *variable_list = nullptr;
832d9e416c0SGreg Clayton         variable_list = frame->GetVariableList(true);
833b9c1b51eSKate Stone         if (variable_list) {
83430fdc8d8SChris Lattner           const size_t num_variables = variable_list->GetSize();
835b9c1b51eSKate Stone           if (num_variables) {
836b9c1b51eSKate Stone             for (i = 0; i < num_variables; ++i) {
83730fdc8d8SChris Lattner               VariableSP variable_sp(variable_list->GetVariableAtIndex(i));
838b9c1b51eSKate Stone               if (variable_sp) {
83930fdc8d8SChris Lattner                 bool add_variable = false;
840b9c1b51eSKate Stone                 switch (variable_sp->GetScope()) {
84130fdc8d8SChris Lattner                 case eValueTypeVariableGlobal:
84230fdc8d8SChris Lattner                 case eValueTypeVariableStatic:
84363a27afaSGreg Clayton                 case eValueTypeVariableThreadLocal:
84430fdc8d8SChris Lattner                   add_variable = statics;
84530fdc8d8SChris Lattner                   break;
84630fdc8d8SChris Lattner 
84730fdc8d8SChris Lattner                 case eValueTypeVariableArgument:
84830fdc8d8SChris Lattner                   add_variable = arguments;
84930fdc8d8SChris Lattner                   break;
85030fdc8d8SChris Lattner 
85130fdc8d8SChris Lattner                 case eValueTypeVariableLocal:
85230fdc8d8SChris Lattner                   add_variable = locals;
85330fdc8d8SChris Lattner                   break;
854c982c768SGreg Clayton 
855c982c768SGreg Clayton                 default:
856c982c768SGreg Clayton                   break;
85730fdc8d8SChris Lattner                 }
858b9c1b51eSKate Stone                 if (add_variable) {
859349213f9SGreg Clayton                   // Only add variables once so we don't end up with duplicates
860349213f9SGreg Clayton                   if (variable_set.find(variable_sp) == variable_set.end())
861349213f9SGreg Clayton                     variable_set.insert(variable_sp);
862349213f9SGreg Clayton                   else
863349213f9SGreg Clayton                     continue;
864349213f9SGreg Clayton 
865d9e416c0SGreg Clayton                   if (in_scope_only && !variable_sp->IsInScope(frame))
86630fdc8d8SChris Lattner                     continue;
86730fdc8d8SChris Lattner 
868b9c1b51eSKate Stone                   ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable(
869b9c1b51eSKate Stone                       variable_sp, eNoDynamicValues));
870560558ebSEnrico Granata 
871b9c1b51eSKate Stone                   if (!include_runtime_support_values && valobj_sp != nullptr &&
872dbb0abbfSEugene Zelenko                       valobj_sp->IsRuntimeSupportValue())
873560558ebSEnrico Granata                     continue;
874560558ebSEnrico Granata 
875e3e91517SEnrico Granata                   SBValue value_sb;
876e3e91517SEnrico Granata                   value_sb.SetSP(valobj_sp, use_dynamic);
877e3e91517SEnrico Granata                   value_list.Append(value_sb);
87830fdc8d8SChris Lattner                 }
87930fdc8d8SChris Lattner               }
88030fdc8d8SChris Lattner             }
88130fdc8d8SChris Lattner           }
88230fdc8d8SChris Lattner         }
88341ae8e74SKuba Mracek         if (recognized_arguments) {
88441ae8e74SKuba Mracek           auto recognized_frame = frame->GetRecognizedFrame();
88541ae8e74SKuba Mracek           if (recognized_frame) {
88641ae8e74SKuba Mracek             ValueObjectListSP recognized_arg_list =
88741ae8e74SKuba Mracek                 recognized_frame->GetRecognizedArguments();
88841ae8e74SKuba Mracek             if (recognized_arg_list) {
88941ae8e74SKuba Mracek               for (auto &rec_value_sp : recognized_arg_list->GetObjects()) {
89041ae8e74SKuba Mracek                 SBValue value_sb;
89141ae8e74SKuba Mracek                 value_sb.SetSP(rec_value_sp, use_dynamic);
89241ae8e74SKuba Mracek                 value_list.Append(value_sb);
89341ae8e74SKuba Mracek               }
89441ae8e74SKuba Mracek             }
89541ae8e74SKuba Mracek           }
89641ae8e74SKuba Mracek         }
897c9858e4dSGreg Clayton       }
8987fdf9ef1SGreg Clayton     }
899*581af8b0SJonas Devlieghere   }
900ceb6b139SCaroline Tice 
901baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value_list);
90230fdc8d8SChris Lattner }
90330fdc8d8SChris Lattner 
904b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() {
905baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBValueList, SBFrame, GetRegisters);
906baf5664fSJonas Devlieghere 
90730fdc8d8SChris Lattner   SBValueList value_list;
908bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
909bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
9104fc6cb9cSJim Ingham 
911dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
912d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
9137730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
914b9c1b51eSKate Stone   if (target && process) {
9157fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
916b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
9177730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
918b9c1b51eSKate Stone       if (frame) {
919d9e416c0SGreg Clayton         RegisterContextSP reg_ctx(frame->GetRegisterContext());
920b9c1b51eSKate Stone         if (reg_ctx) {
92130fdc8d8SChris Lattner           const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
922b9c1b51eSKate Stone           for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
923b9c1b51eSKate Stone             value_list.Append(
924b9c1b51eSKate Stone                 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx));
92530fdc8d8SChris Lattner           }
92630fdc8d8SChris Lattner         }
927c9858e4dSGreg Clayton       }
9287fdf9ef1SGreg Clayton     }
929*581af8b0SJonas Devlieghere   }
930ceb6b139SCaroline Tice 
931baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(value_list);
93230fdc8d8SChris Lattner }
93330fdc8d8SChris Lattner 
934b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) {
935baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *),
936baf5664fSJonas Devlieghere                      name);
937baf5664fSJonas Devlieghere 
938ad9a53c5SJason Molenda   SBValue result;
939ad9a53c5SJason Molenda   ValueObjectSP value_sp;
940bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
941bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
942ad9a53c5SJason Molenda 
943dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
944ad9a53c5SJason Molenda   Target *target = exe_ctx.GetTargetPtr();
945ad9a53c5SJason Molenda   Process *process = exe_ctx.GetProcessPtr();
946b9c1b51eSKate Stone   if (target && process) {
947ad9a53c5SJason Molenda     Process::StopLocker stop_locker;
948b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
949ad9a53c5SJason Molenda       frame = exe_ctx.GetFramePtr();
950b9c1b51eSKate Stone       if (frame) {
951ad9a53c5SJason Molenda         RegisterContextSP reg_ctx(frame->GetRegisterContext());
952b9c1b51eSKate Stone         if (reg_ctx) {
953ad9a53c5SJason Molenda           const uint32_t num_regs = reg_ctx->GetRegisterCount();
954b9c1b51eSKate Stone           for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) {
955b9c1b51eSKate Stone             const RegisterInfo *reg_info =
956b9c1b51eSKate Stone                 reg_ctx->GetRegisterInfoAtIndex(reg_idx);
957ad9a53c5SJason Molenda             if (reg_info &&
958ad9a53c5SJason Molenda                 ((reg_info->name && strcasecmp(reg_info->name, name) == 0) ||
959b9c1b51eSKate Stone                  (reg_info->alt_name &&
960b9c1b51eSKate Stone                   strcasecmp(reg_info->alt_name, name) == 0))) {
961ad9a53c5SJason Molenda               value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx);
962ad9a53c5SJason Molenda               result.SetSP(value_sp);
963ad9a53c5SJason Molenda               break;
964ad9a53c5SJason Molenda             }
965ad9a53c5SJason Molenda           }
966ad9a53c5SJason Molenda         }
967ad9a53c5SJason Molenda       }
968ad9a53c5SJason Molenda     }
969*581af8b0SJonas Devlieghere   }
970ad9a53c5SJason Molenda 
971baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(result);
972ad9a53c5SJason Molenda }
973ad9a53c5SJason Molenda 
974b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) {
975baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &),
976baf5664fSJonas Devlieghere                      description);
977baf5664fSJonas Devlieghere 
978da7bc7d0SGreg Clayton   Stream &strm = description.ref();
979da7bc7d0SGreg Clayton 
980bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
981bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
9824fc6cb9cSJim Ingham 
983b57e4a1bSJason Molenda   StackFrame *frame;
984d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
9857730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
986b9c1b51eSKate Stone   if (target && process) {
9877fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
988b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
9897730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
990b9c1b51eSKate Stone       if (frame) {
991d9e416c0SGreg Clayton         frame->DumpUsingSettingsFormat(&strm);
9927730b9a4SJim Ingham       }
993c9858e4dSGreg Clayton     }
994c9858e4dSGreg Clayton 
995b9c1b51eSKate Stone   } else
996da7bc7d0SGreg Clayton     strm.PutCString("No value");
997dde9cff3SCaroline Tice 
998dde9cff3SCaroline Tice   return true;
999dde9cff3SCaroline Tice }
10001d3afba3SGreg Clayton 
1001b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) {
1002baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, (const char *),
1003baf5664fSJonas Devlieghere                      expr);
1004baf5664fSJonas Devlieghere 
1005316d498bSGreg Clayton   SBValue result;
1006c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1007c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1008c481c7eeSJim Ingham 
1009b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
1010d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1011b9c1b51eSKate Stone   if (frame && target) {
101235e1bda6SJim Ingham     SBExpressionOptions options;
1013b9c1b51eSKate Stone     lldb::DynamicValueType fetch_dynamic_value =
1014b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
1015cced1566SGreg Clayton     options.SetFetchDynamicValue(fetch_dynamic_value);
101635e1bda6SJim Ingham     options.SetUnwindOnError(true);
101724785bd0SEugene Leviant     options.SetIgnoreBreakpoints(true);
1018998c8a1cSRyan Brown     if (target->GetLanguage() != eLanguageTypeUnknown)
1019998c8a1cSRyan Brown       options.SetLanguage(target->GetLanguage());
1020998c8a1cSRyan Brown     else
1021998c8a1cSRyan Brown       options.SetLanguage(frame->GetLanguage());
1022baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(EvaluateExpression(expr, options));
1023316d498bSGreg Clayton   }
1024baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(result);
102578a685aaSJim Ingham }
102678a685aaSJim Ingham 
102778a685aaSJim Ingham SBValue
1028b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr,
1029b9c1b51eSKate Stone                             lldb::DynamicValueType fetch_dynamic_value) {
1030baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1031baf5664fSJonas Devlieghere                      (const char *, lldb::DynamicValueType), expr,
1032baf5664fSJonas Devlieghere                      fetch_dynamic_value);
1033baf5664fSJonas Devlieghere 
103435e1bda6SJim Ingham   SBExpressionOptions options;
1035cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
103635e1bda6SJim Ingham   options.SetUnwindOnError(true);
103724785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1038c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1039c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1040c481c7eeSJim Ingham 
1041998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1042998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1043998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1044998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1045998c8a1cSRyan Brown   else if (frame)
1046998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
1047baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(EvaluateExpression(expr, options));
10487ba6e991SJim Ingham }
10497ba6e991SJim Ingham 
1050b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr,
1051b9c1b51eSKate Stone                                     lldb::DynamicValueType fetch_dynamic_value,
1052b9c1b51eSKate Stone                                     bool unwind_on_error) {
1053baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1054baf5664fSJonas Devlieghere                      (const char *, lldb::DynamicValueType, bool), expr,
1055baf5664fSJonas Devlieghere                      fetch_dynamic_value, unwind_on_error);
1056baf5664fSJonas Devlieghere 
105735e1bda6SJim Ingham   SBExpressionOptions options;
1058c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1059c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1060c481c7eeSJim Ingham 
1061cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
106235e1bda6SJim Ingham   options.SetUnwindOnError(unwind_on_error);
106324785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1064998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1065998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1066998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1067998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1068998c8a1cSRyan Brown   else if (frame)
1069998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
1070baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(EvaluateExpression(expr, options));
107135e1bda6SJim Ingham }
107235e1bda6SJim Ingham 
1073b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr,
1074b9c1b51eSKate Stone                                           const SBExpressionOptions &options) {
1075baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1076baf5664fSJonas Devlieghere                      (const char *, const lldb::SBExpressionOptions &), expr,
1077baf5664fSJonas Devlieghere                      options);
1078baf5664fSJonas Devlieghere 
1079358efd65SSaleem Abdulrasool #ifndef LLDB_DISABLE_PYTHON
10805160ce5cSGreg Clayton   Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1081358efd65SSaleem Abdulrasool #endif
1082a162ebafSSean Callanan 
10838646d3c1SJim Ingham   ExpressionResults exe_results = eExpressionSetupError;
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);
11098f7db52dSJim Ingham           stack_trace = llvm::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 
1116b9c1b51eSKate Stone         exe_results = target->EvaluateExpression(expr, frame, expr_value_sp,
111735e1bda6SJim Ingham                                                  options.ref());
1118e3e91517SEnrico Granata         expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
11197730b9a4SJim Ingham       }
1120c9858e4dSGreg Clayton     }
11217fdf9ef1SGreg Clayton   }
11224838131bSGreg Clayton 
1123cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1124a162ebafSSean Callanan   if (expr_log)
1125b9c1b51eSKate Stone     expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is "
1126b9c1b51eSKate Stone                      "%s, summary %s **",
1127324a1036SSaleem Abdulrasool                      expr_result.GetValue(), expr_result.GetSummary());
1128cf7e2dc0SJason Molenda #endif
11294838131bSGreg Clayton 
1130baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(expr_result);
11311d3afba3SGreg Clayton }
1132316d498bSGreg Clayton 
1133b9c1b51eSKate Stone bool SBFrame::IsInlined() {
1134baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsInlined);
1135baf5664fSJonas Devlieghere 
113605f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->IsInlined();
113705f75e9fSOleksiy Vyalov }
113805f75e9fSOleksiy Vyalov 
1139b9c1b51eSKate Stone bool SBFrame::IsInlined() const {
1140baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsInlined);
1141baf5664fSJonas Devlieghere 
1142c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1143c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1144c481c7eeSJim Ingham 
1145dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1146d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
11477730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1148b9c1b51eSKate Stone   if (target && process) {
11497fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1150b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
11517730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1152b9c1b51eSKate Stone       if (frame) {
11537fdf9ef1SGreg Clayton 
1154d9e416c0SGreg Clayton         Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1155316d498bSGreg Clayton         if (block)
1156dbb0abbfSEugene Zelenko           return block->GetContainingInlinedBlock() != nullptr;
11577730b9a4SJim Ingham       }
1158c9858e4dSGreg Clayton     }
11597fdf9ef1SGreg Clayton   }
1160316d498bSGreg Clayton   return false;
1161316d498bSGreg Clayton }
1162316d498bSGreg Clayton 
11634b36f791SVedant Kumar bool SBFrame::IsArtificial() {
1164baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsArtificial);
1165baf5664fSJonas Devlieghere 
11664b36f791SVedant Kumar   return static_cast<const SBFrame *>(this)->IsArtificial();
11674b36f791SVedant Kumar }
11684b36f791SVedant Kumar 
11694b36f791SVedant Kumar bool SBFrame::IsArtificial() const {
1170baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsArtificial);
1171baf5664fSJonas Devlieghere 
11724b36f791SVedant Kumar   std::unique_lock<std::recursive_mutex> lock;
11734b36f791SVedant Kumar   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
11744b36f791SVedant Kumar 
11754b36f791SVedant Kumar   StackFrame *frame = exe_ctx.GetFramePtr();
11764b36f791SVedant Kumar   if (frame)
11774b36f791SVedant Kumar     return frame->IsArtificial();
11784b36f791SVedant Kumar 
11794b36f791SVedant Kumar   return false;
11804b36f791SVedant Kumar }
11814b36f791SVedant Kumar 
1182b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() {
1183baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetFunctionName);
1184baf5664fSJonas Devlieghere 
118505f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->GetFunctionName();
118605f75e9fSOleksiy Vyalov }
118705f75e9fSOleksiy Vyalov 
1188bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const {
1189baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::LanguageType, SBFrame, GuessLanguage);
1190baf5664fSJonas Devlieghere 
1191bdbdd229SJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1192bdbdd229SJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1193bdbdd229SJim Ingham 
1194bdbdd229SJim Ingham   StackFrame *frame = nullptr;
1195bdbdd229SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
1196bdbdd229SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1197bdbdd229SJim Ingham   if (target && process) {
1198bdbdd229SJim Ingham     Process::StopLocker stop_locker;
1199bdbdd229SJim Ingham     if (stop_locker.TryLock(&process->GetRunLock())) {
1200bdbdd229SJim Ingham       frame = exe_ctx.GetFramePtr();
1201bdbdd229SJim Ingham       if (frame) {
1202bdbdd229SJim Ingham         return frame->GuessLanguage();
1203bdbdd229SJim Ingham       }
1204bdbdd229SJim Ingham     }
1205bdbdd229SJim Ingham   }
1206bdbdd229SJim Ingham   return eLanguageTypeUnknown;
1207bdbdd229SJim Ingham }
1208bdbdd229SJim Ingham 
1209b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const {
1210baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, GetFunctionName);
1211baf5664fSJonas Devlieghere 
1212dbb0abbfSEugene Zelenko   const char *name = nullptr;
1213c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1214c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1215c481c7eeSJim Ingham 
1216dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1217d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
12187730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1219b9c1b51eSKate Stone   if (target && process) {
12207fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1221b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
12227730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1223b9c1b51eSKate Stone       if (frame) {
1224b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1225b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1226b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1227b9c1b51eSKate Stone         if (sc.block) {
1228316d498bSGreg Clayton           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1229b9c1b51eSKate Stone           if (inlined_block) {
1230b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1231b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
1232b9c1b51eSKate Stone             name =
1233b9c1b51eSKate Stone                 inlined_info->GetName(sc.function->GetLanguage()).AsCString();
1234316d498bSGreg Clayton           }
1235316d498bSGreg Clayton         }
1236316d498bSGreg Clayton 
1237b9c1b51eSKate Stone         if (name == nullptr) {
1238316d498bSGreg Clayton           if (sc.function)
1239316d498bSGreg Clayton             name = sc.function->GetName().GetCString();
1240316d498bSGreg Clayton         }
1241316d498bSGreg Clayton 
1242b9c1b51eSKate Stone         if (name == nullptr) {
1243316d498bSGreg Clayton           if (sc.symbol)
1244316d498bSGreg Clayton             name = sc.symbol->GetName().GetCString();
1245316d498bSGreg Clayton         }
12467730b9a4SJim Ingham       }
1247c9858e4dSGreg Clayton     }
12487fdf9ef1SGreg Clayton   }
1249316d498bSGreg Clayton   return name;
1250316d498bSGreg Clayton }
1251c1f705c2SEnrico Granata 
1252b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() {
1253baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetDisplayFunctionName);
1254baf5664fSJonas Devlieghere 
1255dbb0abbfSEugene Zelenko   const char *name = nullptr;
1256c481c7eeSJim Ingham 
1257c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1258c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1259c481c7eeSJim Ingham 
1260dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1261c1f705c2SEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
1262c1f705c2SEnrico Granata   Process *process = exe_ctx.GetProcessPtr();
1263b9c1b51eSKate Stone   if (target && process) {
1264c1f705c2SEnrico Granata     Process::StopLocker stop_locker;
1265b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1266c1f705c2SEnrico Granata       frame = exe_ctx.GetFramePtr();
1267b9c1b51eSKate Stone       if (frame) {
1268b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1269b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1270b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1271b9c1b51eSKate Stone         if (sc.block) {
1272c1f705c2SEnrico Granata           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1273b9c1b51eSKate Stone           if (inlined_block) {
1274b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1275b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
1276b9c1b51eSKate Stone             name = inlined_info->GetDisplayName(sc.function->GetLanguage())
1277b9c1b51eSKate Stone                        .AsCString();
1278c1f705c2SEnrico Granata           }
1279c1f705c2SEnrico Granata         }
1280c1f705c2SEnrico Granata 
1281b9c1b51eSKate Stone         if (name == nullptr) {
1282c1f705c2SEnrico Granata           if (sc.function)
1283c1f705c2SEnrico Granata             name = sc.function->GetDisplayName().GetCString();
1284c1f705c2SEnrico Granata         }
1285c1f705c2SEnrico Granata 
1286b9c1b51eSKate Stone         if (name == nullptr) {
1287c1f705c2SEnrico Granata           if (sc.symbol)
1288c1f705c2SEnrico Granata             name = sc.symbol->GetDisplayName().GetCString();
1289c1f705c2SEnrico Granata         }
1290c1f705c2SEnrico Granata       }
1291c1f705c2SEnrico Granata     }
1292c1f705c2SEnrico Granata   }
1293c1f705c2SEnrico Granata   return name;
1294c1f705c2SEnrico Granata }
1295