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"
18*bd4bf82aSJonas Devlieghere #include "Utils.h"
1930fdc8d8SChris Lattner #include "lldb/Core/Address.h"
2030fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2130fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h"
2230fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h"
23151c032cSJim Ingham #include "lldb/Expression/UserExpression.h"
241ba7c4d0SGreg Clayton #include "lldb/Host/Host.h"
2530fdc8d8SChris Lattner #include "lldb/Symbol/Block.h"
261f746071SGreg Clayton #include "lldb/Symbol/Function.h"
271f746071SGreg Clayton #include "lldb/Symbol/Symbol.h"
2830fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h"
2930fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h"
30b9c1b51eSKate Stone #include "lldb/Symbol/VariableList.h"
3130fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h"
3230fdc8d8SChris Lattner #include "lldb/Target/Process.h"
3330fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
34b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h"
3541ae8e74SKuba Mracek #include "lldb/Target/StackFrameRecognizer.h"
36b9556accSGreg Clayton #include "lldb/Target/StackID.h"
37b9c1b51eSKate Stone #include "lldb/Target/Target.h"
3830fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
39bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h"
406f9e6901SZachary Turner #include "lldb/Utility/Log.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 
57b9c1b51eSKate Stone SBFrame::SBFrame() : m_opaque_sp(new ExecutionContextRef()) {}
5830fdc8d8SChris Lattner 
59b9c1b51eSKate Stone SBFrame::SBFrame(const StackFrameSP &lldb_object_sp)
60b9c1b51eSKate Stone     : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) {
615160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
62ceb6b139SCaroline Tice 
63b9c1b51eSKate Stone   if (log) {
64ceb6b139SCaroline Tice     SBStream sstr;
65ceb6b139SCaroline Tice     GetDescription(sstr);
664838131bSGreg Clayton     log->Printf("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s",
67324a1036SSaleem Abdulrasool                 static_cast<void *>(lldb_object_sp.get()),
68324a1036SSaleem Abdulrasool                 static_cast<void *>(lldb_object_sp.get()), sstr.GetData());
69ceb6b139SCaroline Tice   }
7030fdc8d8SChris Lattner }
7130fdc8d8SChris Lattner 
72*bd4bf82aSJonas Devlieghere SBFrame::SBFrame(const SBFrame &rhs) : m_opaque_sp() {
73*bd4bf82aSJonas Devlieghere   m_opaque_sp = clone(rhs.m_opaque_sp);
74*bd4bf82aSJonas Devlieghere }
75efabb123SGreg Clayton 
76dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default;
77dbb0abbfSEugene Zelenko 
78b9c1b51eSKate Stone const SBFrame &SBFrame::operator=(const SBFrame &rhs) {
79efabb123SGreg Clayton   if (this != &rhs)
80*bd4bf82aSJonas 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 {
93bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
94bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
957fa7dc36SJim Ingham 
967fa7dc36SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
977fa7dc36SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
98b9c1b51eSKate Stone   if (target && process) {
997fa7dc36SJim Ingham     Process::StopLocker stop_locker;
1007fa7dc36SJim Ingham     if (stop_locker.TryLock(&process->GetRunLock()))
101dbb0abbfSEugene Zelenko       return GetFrameSP().get() != nullptr;
10230fdc8d8SChris Lattner   }
10330fdc8d8SChris Lattner 
1047fa7dc36SJim Ingham   // Without a target & process we can't have a valid stack frame.
1057fa7dc36SJim Ingham   return false;
1067fa7dc36SJim Ingham }
1077fa7dc36SJim Ingham 
108b9c1b51eSKate Stone SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const {
1095160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
11030fdc8d8SChris Lattner   SBSymbolContext sb_sym_ctx;
111bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
112bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
113991e4453SZachary Turner   SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope);
114dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
115d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1167730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
117b9c1b51eSKate Stone   if (target && process) {
1187fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
119b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1207730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
121b9c1b51eSKate Stone       if (frame) {
122991e4453SZachary Turner         sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext(scope));
123b9c1b51eSKate Stone       } else {
124c9858e4dSGreg Clayton         if (log)
125b9c1b51eSKate Stone           log->Printf("SBFrame::GetVariables () => error: could not "
126b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
1277730b9a4SJim Ingham       }
128b9c1b51eSKate Stone     } else {
1297730b9a4SJim Ingham       if (log)
130b9c1b51eSKate Stone         log->Printf(
131b9c1b51eSKate Stone             "SBFrame::GetSymbolContext () => error: process is running");
132c9858e4dSGreg Clayton     }
1337fdf9ef1SGreg Clayton   }
134ceb6b139SCaroline Tice 
135ceb6b139SCaroline Tice   if (log)
136b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => "
137b9c1b51eSKate Stone                 "SBSymbolContext(%p)",
138324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), resolve_scope,
139324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_sym_ctx.get()));
140ceb6b139SCaroline Tice 
14130fdc8d8SChris Lattner   return sb_sym_ctx;
14230fdc8d8SChris Lattner }
14330fdc8d8SChris Lattner 
144b9c1b51eSKate Stone SBModule SBFrame::GetModule() const {
1455160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
14672eff18aSGreg Clayton   SBModule sb_module;
147acdbe816SGreg Clayton   ModuleSP module_sp;
148bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
149bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1504fc6cb9cSJim Ingham 
151dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
152d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1537730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
154b9c1b51eSKate Stone   if (target && process) {
1557fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
156b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1577730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
158b9c1b51eSKate Stone       if (frame) {
159d9e416c0SGreg Clayton         module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp;
160acdbe816SGreg Clayton         sb_module.SetSP(module_sp);
161b9c1b51eSKate Stone       } else {
162c9858e4dSGreg Clayton         if (log)
163b9c1b51eSKate Stone           log->Printf("SBFrame::GetModule () => error: could not reconstruct "
164b9c1b51eSKate Stone                       "frame object for this SBFrame.");
1657730b9a4SJim Ingham       }
166b9c1b51eSKate Stone     } else {
1677730b9a4SJim Ingham       if (log)
1687730b9a4SJim Ingham         log->Printf("SBFrame::GetModule () => error: process is running");
169c9858e4dSGreg Clayton     }
1707fdf9ef1SGreg Clayton   }
17172eff18aSGreg Clayton 
1724838131bSGreg Clayton   if (log)
1734838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetModule () => SBModule(%p)",
174324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
175324a1036SSaleem Abdulrasool                 static_cast<void *>(module_sp.get()));
1764838131bSGreg Clayton 
17730fdc8d8SChris Lattner   return sb_module;
17830fdc8d8SChris Lattner }
17930fdc8d8SChris Lattner 
180b9c1b51eSKate Stone SBCompileUnit SBFrame::GetCompileUnit() const {
1815160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
18272eff18aSGreg Clayton   SBCompileUnit sb_comp_unit;
183bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
184bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1854fc6cb9cSJim Ingham 
186dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
187d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1887730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
189b9c1b51eSKate Stone   if (target && process) {
1907fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
191b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1927730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
193b9c1b51eSKate Stone       if (frame) {
194b9c1b51eSKate Stone         sb_comp_unit.reset(
195b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit);
196b9c1b51eSKate Stone       } else {
197ceb6b139SCaroline Tice         if (log)
198b9c1b51eSKate Stone           log->Printf("SBFrame::GetCompileUnit () => error: could not "
199b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
2007730b9a4SJim Ingham       }
201b9c1b51eSKate Stone     } else {
2027730b9a4SJim Ingham       if (log)
2037730b9a4SJim Ingham         log->Printf("SBFrame::GetCompileUnit () => error: process is running");
204c9858e4dSGreg Clayton     }
205c9858e4dSGreg Clayton   }
206c9858e4dSGreg Clayton   if (log)
207c9858e4dSGreg Clayton     log->Printf("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)",
208324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
209324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_comp_unit.get()));
210ceb6b139SCaroline Tice 
21130fdc8d8SChris Lattner   return sb_comp_unit;
21230fdc8d8SChris Lattner }
21330fdc8d8SChris Lattner 
214b9c1b51eSKate Stone SBFunction SBFrame::GetFunction() const {
2155160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
21672eff18aSGreg Clayton   SBFunction sb_function;
217bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
218bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2194fc6cb9cSJim Ingham 
220dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
221d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2227730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
223b9c1b51eSKate Stone   if (target && process) {
2247fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
225b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2267730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
227b9c1b51eSKate Stone       if (frame) {
228b9c1b51eSKate Stone         sb_function.reset(
229b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextFunction).function);
230b9c1b51eSKate Stone       } else {
231c9858e4dSGreg Clayton         if (log)
232b9c1b51eSKate Stone           log->Printf("SBFrame::GetFunction () => error: could not reconstruct "
233b9c1b51eSKate Stone                       "frame object for this SBFrame.");
2347730b9a4SJim Ingham       }
235b9c1b51eSKate Stone     } else {
2367730b9a4SJim Ingham       if (log)
2377730b9a4SJim Ingham         log->Printf("SBFrame::GetFunction () => error: process is running");
2387fdf9ef1SGreg Clayton     }
239c9858e4dSGreg Clayton   }
2404838131bSGreg Clayton   if (log)
2414838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetFunction () => SBFunction(%p)",
242324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
243324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_function.get()));
2444838131bSGreg Clayton 
24530fdc8d8SChris Lattner   return sb_function;
24630fdc8d8SChris Lattner }
24730fdc8d8SChris Lattner 
248b9c1b51eSKate Stone SBSymbol SBFrame::GetSymbol() const {
2495160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
25072eff18aSGreg Clayton   SBSymbol sb_symbol;
251bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
252bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2534fc6cb9cSJim Ingham 
254dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
255d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2567730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
257b9c1b51eSKate Stone   if (target && process) {
2587fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
259b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2607730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
261b9c1b51eSKate Stone       if (frame) {
262d9e416c0SGreg Clayton         sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol);
263b9c1b51eSKate Stone       } else {
264c9858e4dSGreg Clayton         if (log)
265b9c1b51eSKate Stone           log->Printf("SBFrame::GetSymbol () => error: could not reconstruct "
266b9c1b51eSKate Stone                       "frame object for this SBFrame.");
2677730b9a4SJim Ingham       }
268b9c1b51eSKate Stone     } else {
2697730b9a4SJim Ingham       if (log)
2707730b9a4SJim Ingham         log->Printf("SBFrame::GetSymbol () => error: process is running");
2717fdf9ef1SGreg Clayton     }
272c9858e4dSGreg Clayton   }
2734838131bSGreg Clayton   if (log)
2744838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetSymbol () => SBSymbol(%p)",
275324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
276324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_symbol.get()));
2773b06557eSGreg Clayton   return sb_symbol;
2783b06557eSGreg Clayton }
2793b06557eSGreg Clayton 
280b9c1b51eSKate Stone SBBlock SBFrame::GetBlock() const {
2815160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
28272eff18aSGreg Clayton   SBBlock sb_block;
283bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
284bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2854fc6cb9cSJim Ingham 
286dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
287d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2887730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
289b9c1b51eSKate Stone   if (target && process) {
2907fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
291b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2927730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
293b9c1b51eSKate Stone       if (frame) {
294d9e416c0SGreg Clayton         sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block);
295b9c1b51eSKate Stone       } else {
296c9858e4dSGreg Clayton         if (log)
297b9c1b51eSKate Stone           log->Printf("SBFrame::GetBlock () => error: could not reconstruct "
298b9c1b51eSKate Stone                       "frame object for this SBFrame.");
2997730b9a4SJim Ingham       }
300b9c1b51eSKate Stone     } else {
3017730b9a4SJim Ingham       if (log)
302324a1036SSaleem Abdulrasool         log->Printf("SBFrame(%p)::GetBlock () => error: process is running",
303324a1036SSaleem Abdulrasool                     static_cast<void *>(frame));
3047fdf9ef1SGreg Clayton     }
305c9858e4dSGreg Clayton   }
3064838131bSGreg Clayton   if (log)
3074838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetBlock () => SBBlock(%p)",
308324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
309324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_block.GetPtr()));
31030fdc8d8SChris Lattner   return sb_block;
31130fdc8d8SChris Lattner }
31230fdc8d8SChris Lattner 
313b9c1b51eSKate Stone SBBlock SBFrame::GetFrameBlock() const {
31472eff18aSGreg Clayton   SBBlock sb_block;
315bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
316bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3174fc6cb9cSJim Ingham 
318dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
319d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3205160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
3217730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
322b9c1b51eSKate Stone   if (target && process) {
3237fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
324b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3257730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
326b9c1b51eSKate Stone       if (frame) {
327d9e416c0SGreg Clayton         sb_block.SetPtr(frame->GetFrameBlock());
328b9c1b51eSKate Stone       } else {
329c9858e4dSGreg Clayton         if (log)
330b9c1b51eSKate Stone           log->Printf("SBFrame::GetFrameBlock () => error: could not "
331b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
3327730b9a4SJim Ingham       }
333b9c1b51eSKate Stone     } else {
3347730b9a4SJim Ingham       if (log)
3357730b9a4SJim Ingham         log->Printf("SBFrame::GetFrameBlock () => error: process is running");
3367fdf9ef1SGreg Clayton     }
337c9858e4dSGreg Clayton   }
3384838131bSGreg Clayton   if (log)
3394838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)",
340324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
341324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_block.GetPtr()));
34295897c6aSGreg Clayton   return sb_block;
34395897c6aSGreg Clayton }
34495897c6aSGreg Clayton 
345b9c1b51eSKate Stone SBLineEntry SBFrame::GetLineEntry() const {
3465160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
34772eff18aSGreg Clayton   SBLineEntry sb_line_entry;
348bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
349bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3504fc6cb9cSJim Ingham 
351dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
352d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3537730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
354b9c1b51eSKate Stone   if (target && process) {
3557fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
356b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3577730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
358b9c1b51eSKate Stone       if (frame) {
359b9c1b51eSKate Stone         sb_line_entry.SetLineEntry(
360b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextLineEntry).line_entry);
361b9c1b51eSKate Stone       } else {
362c9858e4dSGreg Clayton         if (log)
363b9c1b51eSKate Stone           log->Printf("SBFrame::GetLineEntry () => error: could not "
364b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
3657730b9a4SJim Ingham       }
366b9c1b51eSKate Stone     } else {
3677730b9a4SJim Ingham       if (log)
3687730b9a4SJim Ingham         log->Printf("SBFrame::GetLineEntry () => error: process is running");
3697fdf9ef1SGreg Clayton     }
370c9858e4dSGreg Clayton   }
3714838131bSGreg Clayton   if (log)
3724838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)",
373324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
374324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_line_entry.get()));
37530fdc8d8SChris Lattner   return sb_line_entry;
37630fdc8d8SChris Lattner }
37730fdc8d8SChris Lattner 
378b9c1b51eSKate Stone uint32_t SBFrame::GetFrameID() const {
379b9556accSGreg Clayton   uint32_t frame_idx = UINT32_MAX;
380b9556accSGreg Clayton 
381c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
382c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
383c481c7eeSJim Ingham 
384b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
3857fdf9ef1SGreg Clayton   if (frame)
386d9e416c0SGreg Clayton     frame_idx = frame->GetFrameIndex();
3874838131bSGreg Clayton 
3885160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
3894838131bSGreg Clayton   if (log)
390b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::GetFrameID () => %u", static_cast<void *>(frame),
391b9c1b51eSKate Stone                 frame_idx);
3924838131bSGreg Clayton   return frame_idx;
39330fdc8d8SChris Lattner }
39430fdc8d8SChris Lattner 
395b9c1b51eSKate Stone lldb::addr_t SBFrame::GetCFA() const {
396c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
397c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
398c481c7eeSJim Ingham 
399424a5dbcSGreg Clayton   StackFrame *frame = exe_ctx.GetFramePtr();
400424a5dbcSGreg Clayton   if (frame)
401424a5dbcSGreg Clayton     return frame->GetStackID().GetCallFrameAddress();
402424a5dbcSGreg Clayton   return LLDB_INVALID_ADDRESS;
403424a5dbcSGreg Clayton }
404424a5dbcSGreg Clayton 
405b9c1b51eSKate Stone addr_t SBFrame::GetPC() const {
4065160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
40769b582faSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
408bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
409bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4104fc6cb9cSJim Ingham 
411dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
412d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4137730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
414b9c1b51eSKate Stone   if (target && process) {
4157fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
416b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4177730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
418b9c1b51eSKate Stone       if (frame) {
419b9c1b51eSKate Stone         addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress(
42004803b3eSTatyana Krasnukha             target, AddressClass::eCode);
421b9c1b51eSKate Stone       } else {
422c9858e4dSGreg Clayton         if (log)
423b9c1b51eSKate Stone           log->Printf("SBFrame::GetPC () => error: could not reconstruct frame "
424b9c1b51eSKate Stone                       "object for this SBFrame.");
4257730b9a4SJim Ingham       }
426b9c1b51eSKate Stone     } else {
4277730b9a4SJim Ingham       if (log)
4287730b9a4SJim Ingham         log->Printf("SBFrame::GetPC () => error: process is running");
429c9858e4dSGreg Clayton     }
4307fdf9ef1SGreg Clayton   }
431ceb6b139SCaroline Tice 
432ceb6b139SCaroline Tice   if (log)
433324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetPC () => 0x%" PRIx64,
434324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), addr);
435ceb6b139SCaroline Tice 
436ceb6b139SCaroline Tice   return addr;
43730fdc8d8SChris Lattner }
43830fdc8d8SChris Lattner 
439b9c1b51eSKate Stone bool SBFrame::SetPC(addr_t new_pc) {
4405160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
441ceb6b139SCaroline Tice   bool ret_val = false;
442bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
443bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4444fc6cb9cSJim Ingham 
445dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
446d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4477730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
448b9c1b51eSKate Stone   if (target && process) {
4497fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
450b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4517730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
452b9c1b51eSKate Stone       if (frame) {
453d9e416c0SGreg Clayton         ret_val = frame->GetRegisterContext()->SetPC(new_pc);
454b9c1b51eSKate Stone       } else {
455c9858e4dSGreg Clayton         if (log)
456b9c1b51eSKate Stone           log->Printf("SBFrame::SetPC () => error: could not reconstruct frame "
457b9c1b51eSKate Stone                       "object for this SBFrame.");
4587730b9a4SJim Ingham       }
459b9c1b51eSKate Stone     } else {
4607730b9a4SJim Ingham       if (log)
4617730b9a4SJim Ingham         log->Printf("SBFrame::SetPC () => error: process is running");
462c9858e4dSGreg Clayton     }
4637fdf9ef1SGreg Clayton   }
464ceb6b139SCaroline Tice 
465ceb6b139SCaroline Tice   if (log)
466d01b2953SDaniel Malea     log->Printf("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i",
467324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), new_pc, ret_val);
468ceb6b139SCaroline Tice 
469ceb6b139SCaroline Tice   return ret_val;
47030fdc8d8SChris Lattner }
47130fdc8d8SChris Lattner 
472b9c1b51eSKate Stone addr_t SBFrame::GetSP() const {
4735160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
4744838131bSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
475bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
476bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4774fc6cb9cSJim Ingham 
478dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
479d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4807730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
481b9c1b51eSKate Stone   if (target && process) {
4827fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
483b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4847730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
485b9c1b51eSKate Stone       if (frame) {
486d9e416c0SGreg Clayton         addr = frame->GetRegisterContext()->GetSP();
487b9c1b51eSKate Stone       } else {
488c9858e4dSGreg Clayton         if (log)
489b9c1b51eSKate Stone           log->Printf("SBFrame::GetSP () => error: could not reconstruct frame "
490b9c1b51eSKate Stone                       "object for this SBFrame.");
4917730b9a4SJim Ingham       }
492b9c1b51eSKate Stone     } else {
4937730b9a4SJim Ingham       if (log)
4947730b9a4SJim Ingham         log->Printf("SBFrame::GetSP () => error: process is running");
4957fdf9ef1SGreg Clayton     }
496c9858e4dSGreg Clayton   }
4974838131bSGreg Clayton   if (log)
498324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetSP () => 0x%" PRIx64,
499324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), addr);
5004838131bSGreg Clayton 
5014838131bSGreg Clayton   return addr;
50230fdc8d8SChris Lattner }
50330fdc8d8SChris Lattner 
504b9c1b51eSKate Stone addr_t SBFrame::GetFP() const {
5055160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
50669b582faSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
507bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
508bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5094fc6cb9cSJim Ingham 
510dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
511d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5127730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
513b9c1b51eSKate Stone   if (target && process) {
5147fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
515b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5167730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
517b9c1b51eSKate Stone       if (frame) {
518d9e416c0SGreg Clayton         addr = frame->GetRegisterContext()->GetFP();
519b9c1b51eSKate Stone       } else {
520c9858e4dSGreg Clayton         if (log)
521b9c1b51eSKate Stone           log->Printf("SBFrame::GetFP () => error: could not reconstruct frame "
522b9c1b51eSKate Stone                       "object for this SBFrame.");
5237730b9a4SJim Ingham       }
524b9c1b51eSKate Stone     } else {
5257730b9a4SJim Ingham       if (log)
5267730b9a4SJim Ingham         log->Printf("SBFrame::GetFP () => error: process is running");
527c9858e4dSGreg Clayton     }
5287fdf9ef1SGreg Clayton   }
529ceb6b139SCaroline Tice 
530ceb6b139SCaroline Tice   if (log)
531324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetFP () => 0x%" PRIx64,
532324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), addr);
533ceb6b139SCaroline Tice   return addr;
53430fdc8d8SChris Lattner }
53530fdc8d8SChris Lattner 
536b9c1b51eSKate Stone SBAddress SBFrame::GetPCAddress() const {
5375160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
53830fdc8d8SChris Lattner   SBAddress sb_addr;
539bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
540bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5414fc6cb9cSJim Ingham 
542b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
543d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5447730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
545b9c1b51eSKate Stone   if (target && process) {
5467fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
547b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5487730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
549b9c1b51eSKate Stone       if (frame) {
550d9e416c0SGreg Clayton         sb_addr.SetAddress(&frame->GetFrameCodeAddress());
551b9c1b51eSKate Stone       } else {
552c9858e4dSGreg Clayton         if (log)
553b9c1b51eSKate Stone           log->Printf("SBFrame::GetPCAddress () => error: could not "
554b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
5557730b9a4SJim Ingham       }
556b9c1b51eSKate Stone     } else {
5577730b9a4SJim Ingham       if (log)
5587730b9a4SJim Ingham         log->Printf("SBFrame::GetPCAddress () => error: process is running");
5597fdf9ef1SGreg Clayton     }
560c9858e4dSGreg Clayton   }
5614838131bSGreg Clayton   if (log)
562324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetPCAddress () => SBAddress(%p)",
563b9c1b51eSKate Stone                 static_cast<void *>(frame), static_cast<void *>(sb_addr.get()));
56430fdc8d8SChris Lattner   return sb_addr;
56530fdc8d8SChris Lattner }
56630fdc8d8SChris Lattner 
567b9c1b51eSKate Stone void SBFrame::Clear() { m_opaque_sp->Clear(); }
56830fdc8d8SChris Lattner 
569b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) {
5707edbdfc9SGreg Clayton   SBValue sb_value;
571c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
572c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
573c481c7eeSJim Ingham 
574b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
575d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
576b9c1b51eSKate Stone   if (frame && target) {
577b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
578b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
5797edbdfc9SGreg Clayton     sb_value = GetValueForVariablePath(var_path, use_dynamic);
5807edbdfc9SGreg Clayton   }
5817edbdfc9SGreg Clayton   return sb_value;
5827edbdfc9SGreg Clayton }
5837edbdfc9SGreg Clayton 
584b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path,
585b9c1b51eSKate Stone                                                DynamicValueType use_dynamic) {
5867edbdfc9SGreg Clayton   SBValue sb_value;
5875160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
588b9c1b51eSKate Stone   if (var_path == nullptr || var_path[0] == '\0') {
5897730b9a4SJim Ingham     if (log)
590b9c1b51eSKate Stone       log->Printf(
591b9c1b51eSKate Stone           "SBFrame::GetValueForVariablePath called with empty variable path.");
5927730b9a4SJim Ingham     return sb_value;
5937730b9a4SJim Ingham   }
5947730b9a4SJim Ingham 
595bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
596bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5974fc6cb9cSJim Ingham 
598dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
599d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
6007730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
601b9c1b51eSKate Stone   if (target && process) {
6027fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
603b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
6047730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
605b9c1b51eSKate Stone       if (frame) {
6067edbdfc9SGreg Clayton         VariableSP var_sp;
60797206d57SZachary Turner         Status error;
608b9c1b51eSKate Stone         ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath(
609b9c1b51eSKate Stone             var_path, eNoDynamicValues,
610b9c1b51eSKate Stone             StackFrame::eExpressionPathOptionCheckPtrVsMember |
611b9c1b51eSKate Stone                 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
612b9c1b51eSKate Stone             var_sp, error));
613e3e91517SEnrico Granata         sb_value.SetSP(value_sp, use_dynamic);
614b9c1b51eSKate Stone       } else {
615c9858e4dSGreg Clayton         if (log)
616b9c1b51eSKate Stone           log->Printf("SBFrame::GetValueForVariablePath () => error: could not "
617b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
6187730b9a4SJim Ingham       }
619b9c1b51eSKate Stone     } else {
6207730b9a4SJim Ingham       if (log)
621b9c1b51eSKate Stone         log->Printf(
622b9c1b51eSKate Stone             "SBFrame::GetValueForVariablePath () => error: process is running");
623c9858e4dSGreg Clayton     }
6247fdf9ef1SGreg Clayton   }
6257edbdfc9SGreg Clayton   return sb_value;
6267edbdfc9SGreg Clayton }
6277edbdfc9SGreg Clayton 
628b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name) {
629316d498bSGreg Clayton   SBValue value;
630c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
631c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
632c481c7eeSJim Ingham 
633b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
634d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
635b9c1b51eSKate Stone   if (frame && target) {
636b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
637b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
638316d498bSGreg Clayton     value = FindVariable(name, use_dynamic);
639316d498bSGreg Clayton   }
640316d498bSGreg Clayton   return value;
64178a685aaSJim Ingham }
64278a685aaSJim Ingham 
643b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name,
644b9c1b51eSKate Stone                               lldb::DynamicValueType use_dynamic) {
6455160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
64669b582faSGreg Clayton   VariableSP var_sp;
64758b59f95SJim Ingham   SBValue sb_value;
6487730b9a4SJim Ingham 
649b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
6507730b9a4SJim Ingham     if (log)
6517730b9a4SJim Ingham       log->Printf("SBFrame::FindVariable called with empty name");
6527730b9a4SJim Ingham     return sb_value;
6537730b9a4SJim Ingham   }
6547730b9a4SJim Ingham 
65581e871edSGreg Clayton   ValueObjectSP value_sp;
656bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
657bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
6584fc6cb9cSJim Ingham 
659dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
660d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
6617730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
662b9c1b51eSKate Stone   if (target && process) {
6637fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
664b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
6657730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
666b9c1b51eSKate Stone       if (frame) {
667e23d0b63SShafik Yaghmour         value_sp = frame->FindVariable(ConstString(name));
66830fdc8d8SChris Lattner 
669e23d0b63SShafik Yaghmour         if (value_sp)
670e3e91517SEnrico Granata           sb_value.SetSP(value_sp, use_dynamic);
671b9c1b51eSKate Stone       } else {
672c9858e4dSGreg Clayton         if (log)
673b9c1b51eSKate Stone           log->Printf("SBFrame::FindVariable () => error: could not "
674b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
6757730b9a4SJim Ingham       }
676b9c1b51eSKate Stone     } else {
6777730b9a4SJim Ingham       if (log)
6787730b9a4SJim Ingham         log->Printf("SBFrame::FindVariable () => error: process is running");
679c9858e4dSGreg Clayton     }
680316d498bSGreg Clayton   }
681316d498bSGreg Clayton 
6824838131bSGreg Clayton   if (log)
68369b582faSGreg Clayton     log->Printf("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
684324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), name,
685324a1036SSaleem Abdulrasool                 static_cast<void *>(value_sp.get()));
6864838131bSGreg Clayton 
687dde9cff3SCaroline Tice   return sb_value;
688dde9cff3SCaroline Tice }
689dde9cff3SCaroline Tice 
690b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) {
691316d498bSGreg Clayton   SBValue value;
692c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
693c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
694c481c7eeSJim Ingham 
695b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
696d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
697b9c1b51eSKate Stone   if (frame && target) {
698b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
699b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
700316d498bSGreg Clayton     value = FindValue(name, value_type, use_dynamic);
701316d498bSGreg Clayton   }
702316d498bSGreg Clayton   return value;
70378a685aaSJim Ingham }
70478a685aaSJim Ingham 
705b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type,
706b9c1b51eSKate Stone                            lldb::DynamicValueType use_dynamic) {
7075160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
70869b582faSGreg Clayton   SBValue sb_value;
7097730b9a4SJim Ingham 
710b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
7117730b9a4SJim Ingham     if (log)
7127730b9a4SJim Ingham       log->Printf("SBFrame::FindValue called with empty name.");
7137730b9a4SJim Ingham     return sb_value;
7147730b9a4SJim Ingham   }
7157730b9a4SJim Ingham 
71681e871edSGreg Clayton   ValueObjectSP value_sp;
717bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
718bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
7194fc6cb9cSJim Ingham 
720dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
721d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
7227730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
723b9c1b51eSKate Stone   if (target && process) {
7247fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
725b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
7267730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
727b9c1b51eSKate Stone       if (frame) {
7288a2a0dfbSEnrico Granata         VariableList variable_list;
7298a2a0dfbSEnrico Granata 
730b9c1b51eSKate Stone         switch (value_type) {
73169b582faSGreg Clayton         case eValueTypeVariableGlobal:      // global variable
73269b582faSGreg Clayton         case eValueTypeVariableStatic:      // static variable
73369b582faSGreg Clayton         case eValueTypeVariableArgument:    // function argument variables
73469b582faSGreg Clayton         case eValueTypeVariableLocal:       // function local variables
73563a27afaSGreg Clayton         case eValueTypeVariableThreadLocal: // thread local variables
73669b582faSGreg Clayton         {
737d9e416c0SGreg Clayton           SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock));
73872eff18aSGreg Clayton 
73972eff18aSGreg Clayton           const bool can_create = true;
74072eff18aSGreg Clayton           const bool get_parent_variables = true;
74172eff18aSGreg Clayton           const bool stop_if_block_is_inlined_function = true;
74272eff18aSGreg Clayton 
7430efb51a0SChaoren Lin           if (sc.block)
744b9c1b51eSKate Stone             sc.block->AppendVariables(
745b9c1b51eSKate Stone                 can_create, get_parent_variables,
746b9c1b51eSKate Stone                 stop_if_block_is_inlined_function,
747b9c1b51eSKate Stone                 [frame](Variable *v) { return v->IsInScope(frame); },
748b9c1b51eSKate Stone                 &variable_list);
749b9c1b51eSKate Stone           if (value_type == eValueTypeVariableGlobal) {
7508a2a0dfbSEnrico Granata             const bool get_file_globals = true;
7518a2a0dfbSEnrico Granata             VariableList *frame_vars = frame->GetVariableList(get_file_globals);
7528a2a0dfbSEnrico Granata             if (frame_vars)
7538a2a0dfbSEnrico Granata               frame_vars->AppendVariablesIfUnique(variable_list);
7548a2a0dfbSEnrico Granata           }
75569b582faSGreg Clayton           ConstString const_name(name);
756b9c1b51eSKate Stone           VariableSP variable_sp(
757b9c1b51eSKate Stone               variable_list.FindVariable(const_name, value_type));
758b9c1b51eSKate Stone           if (variable_sp) {
759b9c1b51eSKate Stone             value_sp = frame->GetValueObjectForFrameVariable(variable_sp,
760b9c1b51eSKate Stone                                                              eNoDynamicValues);
761e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
76230fdc8d8SChris Lattner           }
763b9c1b51eSKate Stone         } break;
76469b582faSGreg Clayton 
76569b582faSGreg Clayton         case eValueTypeRegister: // stack frame register value
76669b582faSGreg Clayton         {
767d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
768b9c1b51eSKate Stone           if (reg_ctx) {
76969b582faSGreg Clayton             const uint32_t num_regs = reg_ctx->GetRegisterCount();
770b9c1b51eSKate Stone             for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) {
771b9c1b51eSKate Stone               const RegisterInfo *reg_info =
772b9c1b51eSKate Stone                   reg_ctx->GetRegisterInfoAtIndex(reg_idx);
77369b582faSGreg Clayton               if (reg_info &&
77469b582faSGreg Clayton                   ((reg_info->name && strcasecmp(reg_info->name, name) == 0) ||
775b9c1b51eSKate Stone                    (reg_info->alt_name &&
776b9c1b51eSKate Stone                     strcasecmp(reg_info->alt_name, name) == 0))) {
777d9e416c0SGreg Clayton                 value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx);
77881e871edSGreg Clayton                 sb_value.SetSP(value_sp);
77981e871edSGreg Clayton                 break;
78069b582faSGreg Clayton               }
78169b582faSGreg Clayton             }
78269b582faSGreg Clayton           }
783b9c1b51eSKate Stone         } break;
78469b582faSGreg Clayton 
785b9c1b51eSKate Stone         case eValueTypeRegisterSet: // A collection of stack frame register
786b9c1b51eSKate Stone                                     // values
78769b582faSGreg Clayton         {
788d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
789b9c1b51eSKate Stone           if (reg_ctx) {
79069b582faSGreg Clayton             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
791b9c1b51eSKate Stone             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
79269b582faSGreg Clayton               const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx);
79369b582faSGreg Clayton               if (reg_set &&
79469b582faSGreg Clayton                   ((reg_set->name && strcasecmp(reg_set->name, name) == 0) ||
795b9c1b51eSKate Stone                    (reg_set->short_name &&
796b9c1b51eSKate Stone                     strcasecmp(reg_set->short_name, name) == 0))) {
797b9c1b51eSKate Stone                 value_sp =
798b9c1b51eSKate Stone                     ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx);
79981e871edSGreg Clayton                 sb_value.SetSP(value_sp);
80081e871edSGreg Clayton                 break;
80169b582faSGreg Clayton               }
80269b582faSGreg Clayton             }
80369b582faSGreg Clayton           }
804b9c1b51eSKate Stone         } break;
80569b582faSGreg Clayton 
80669b582faSGreg Clayton         case eValueTypeConstResult: // constant result variables
80769b582faSGreg Clayton         {
80869b582faSGreg Clayton           ConstString const_name(name);
809b9c1b51eSKate Stone           ExpressionVariableSP expr_var_sp(
810b9c1b51eSKate Stone               target->GetPersistentVariable(const_name));
811b9c1b51eSKate Stone           if (expr_var_sp) {
81281e871edSGreg Clayton             value_sp = expr_var_sp->GetValueObject();
813e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
81481e871edSGreg Clayton           }
815b9c1b51eSKate Stone         } break;
81669b582faSGreg Clayton 
81769b582faSGreg Clayton         default:
81869b582faSGreg Clayton           break;
81969b582faSGreg Clayton         }
820b9c1b51eSKate Stone       } else {
821c9858e4dSGreg Clayton         if (log)
822b9c1b51eSKate Stone           log->Printf("SBFrame::FindValue () => error: could not reconstruct "
823b9c1b51eSKate Stone                       "frame object for this SBFrame.");
8247730b9a4SJim Ingham       }
825b9c1b51eSKate Stone     } else {
8267730b9a4SJim Ingham       if (log)
8277730b9a4SJim Ingham         log->Printf("SBFrame::FindValue () => error: process is running");
828c9858e4dSGreg Clayton     }
8297fdf9ef1SGreg Clayton   }
830dde9cff3SCaroline Tice 
8314838131bSGreg Clayton   if (log)
832b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) "
833b9c1b51eSKate Stone                 "=> SBValue(%p)",
834324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), name, value_type,
835324a1036SSaleem Abdulrasool                 static_cast<void *>(value_sp.get()));
8364838131bSGreg Clayton 
837dde9cff3SCaroline Tice   return sb_value;
838dde9cff3SCaroline Tice }
839dde9cff3SCaroline Tice 
840b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const {
841b57e4a1bSJason Molenda   lldb::StackFrameSP this_sp = GetFrameSP();
842b57e4a1bSJason Molenda   lldb::StackFrameSP that_sp = that.GetFrameSP();
84335e2ab60SJohnny Chen   return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
84435e2ab60SJohnny Chen }
84535e2ab60SJohnny Chen 
846b9c1b51eSKate Stone bool SBFrame::operator==(const SBFrame &rhs) const { return IsEqual(rhs); }
84730fdc8d8SChris Lattner 
848b9c1b51eSKate Stone bool SBFrame::operator!=(const SBFrame &rhs) const { return !IsEqual(rhs); }
84930fdc8d8SChris Lattner 
850b9c1b51eSKate Stone SBThread SBFrame::GetThread() const {
8515160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
852ceb6b139SCaroline Tice 
853c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
854c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
855c481c7eeSJim Ingham 
856d9e416c0SGreg Clayton   ThreadSP thread_sp(exe_ctx.GetThreadSP());
857d9e416c0SGreg Clayton   SBThread sb_thread(thread_sp);
858ceb6b139SCaroline Tice 
859b9c1b51eSKate Stone   if (log) {
860750cd175SCaroline Tice     SBStream sstr;
861750cd175SCaroline Tice     sb_thread.GetDescription(sstr);
862d9e416c0SGreg Clayton     log->Printf("SBFrame(%p)::GetThread () => SBThread(%p): %s",
863324a1036SSaleem Abdulrasool                 static_cast<void *>(exe_ctx.GetFramePtr()),
864324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()), sstr.GetData());
865750cd175SCaroline Tice   }
866ceb6b139SCaroline Tice 
86730fdc8d8SChris Lattner   return sb_thread;
86830fdc8d8SChris Lattner }
86930fdc8d8SChris Lattner 
870b9c1b51eSKate Stone const char *SBFrame::Disassemble() const {
8715160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
872dbb0abbfSEugene Zelenko   const char *disassembly = nullptr;
873bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
874bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
8754fc6cb9cSJim Ingham 
876dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
877d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
8787730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
879b9c1b51eSKate Stone   if (target && process) {
8807fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
881b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
8827730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
883b9c1b51eSKate Stone       if (frame) {
884d9e416c0SGreg Clayton         disassembly = frame->Disassemble();
885b9c1b51eSKate Stone       } else {
886c9858e4dSGreg Clayton         if (log)
887b9c1b51eSKate Stone           log->Printf("SBFrame::Disassemble () => error: could not reconstruct "
888b9c1b51eSKate Stone                       "frame object for this SBFrame.");
8897730b9a4SJim Ingham       }
890b9c1b51eSKate Stone     } else {
8917730b9a4SJim Ingham       if (log)
8927730b9a4SJim Ingham         log->Printf("SBFrame::Disassemble () => error: process is running");
8937fdf9ef1SGreg Clayton     }
894c9858e4dSGreg Clayton   }
8954838131bSGreg Clayton 
8964838131bSGreg Clayton   if (log)
897b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::Disassemble () => %s", static_cast<void *>(frame),
898b9c1b51eSKate Stone                 disassembly);
8994838131bSGreg Clayton 
9004838131bSGreg Clayton   return disassembly;
90130fdc8d8SChris Lattner }
90230fdc8d8SChris Lattner 
903b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics,
904b9c1b51eSKate Stone                                   bool in_scope_only) {
905316d498bSGreg Clayton   SBValueList value_list;
906c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
907c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
908c481c7eeSJim Ingham 
909b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
910d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
911b9c1b51eSKate Stone   if (frame && target) {
912b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
913b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
914b9c1b51eSKate Stone     const bool include_runtime_support_values =
915b9c1b51eSKate Stone         target ? target->GetDisplayRuntimeSupportValues() : false;
91651f96eebSZachary Turner 
91751f96eebSZachary Turner     SBVariablesOptions options;
91851f96eebSZachary Turner     options.SetIncludeArguments(arguments);
91951f96eebSZachary Turner     options.SetIncludeLocals(locals);
92051f96eebSZachary Turner     options.SetIncludeStatics(statics);
92151f96eebSZachary Turner     options.SetInScopeOnly(in_scope_only);
92251f96eebSZachary Turner     options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
92351f96eebSZachary Turner     options.SetUseDynamic(use_dynamic);
92451f96eebSZachary Turner 
92551f96eebSZachary Turner     value_list = GetVariables(options);
926316d498bSGreg Clayton   }
927316d498bSGreg Clayton   return value_list;
92878a685aaSJim Ingham }
92978a685aaSJim Ingham 
930b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals,
931b9c1b51eSKate Stone                                         bool statics, bool in_scope_only,
932b9c1b51eSKate Stone                                         lldb::DynamicValueType use_dynamic) {
933c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
934c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
935c481c7eeSJim Ingham 
936560558ebSEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
937b9c1b51eSKate Stone   const bool include_runtime_support_values =
938b9c1b51eSKate Stone       target ? target->GetDisplayRuntimeSupportValues() : false;
93951f96eebSZachary Turner   SBVariablesOptions options;
94051f96eebSZachary Turner   options.SetIncludeArguments(arguments);
94151f96eebSZachary Turner   options.SetIncludeLocals(locals);
94251f96eebSZachary Turner   options.SetIncludeStatics(statics);
94351f96eebSZachary Turner   options.SetInScopeOnly(in_scope_only);
94451f96eebSZachary Turner   options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
94551f96eebSZachary Turner   options.SetUseDynamic(use_dynamic);
94651f96eebSZachary Turner   return GetVariables(options);
947560558ebSEnrico Granata }
948560558ebSEnrico Granata 
949b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) {
9505160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
951ceb6b139SCaroline Tice 
952b9556accSGreg Clayton   SBValueList value_list;
953bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
954bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
9554fc6cb9cSJim Ingham 
956dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
957d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
958b9556accSGreg Clayton 
95951f96eebSZachary Turner   const bool statics = options.GetIncludeStatics();
96051f96eebSZachary Turner   const bool arguments = options.GetIncludeArguments();
9614c7f5d5cSKuba Mracek   const bool recognized_arguments =
9624c7f5d5cSKuba Mracek         options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP()));
96351f96eebSZachary Turner   const bool locals = options.GetIncludeLocals();
96451f96eebSZachary Turner   const bool in_scope_only = options.GetInScopeOnly();
965b9c1b51eSKate Stone   const bool include_runtime_support_values =
966b9c1b51eSKate Stone       options.GetIncludeRuntimeSupportValues();
96751f96eebSZachary Turner   const lldb::DynamicValueType use_dynamic = options.GetUseDynamic();
96851f96eebSZachary Turner 
969ceb6b139SCaroline Tice   if (log)
97041ae8e74SKuba Mracek     log->Printf(
97141ae8e74SKuba Mracek         "SBFrame::GetVariables (arguments=%i, recognized_arguments=%i, "
97241ae8e74SKuba Mracek         "locals=%i, statics=%i, in_scope_only=%i runtime=%i dynamic=%i)",
97341ae8e74SKuba Mracek         arguments, recognized_arguments, locals, statics, in_scope_only,
97451f96eebSZachary Turner         include_runtime_support_values, use_dynamic);
975ceb6b139SCaroline Tice 
976349213f9SGreg Clayton   std::set<VariableSP> variable_set;
9777730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
978b9c1b51eSKate Stone   if (target && process) {
9797fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
980b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
9817730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
982b9c1b51eSKate Stone       if (frame) {
98330fdc8d8SChris Lattner         size_t i;
984dbb0abbfSEugene Zelenko         VariableList *variable_list = nullptr;
985d9e416c0SGreg Clayton         variable_list = frame->GetVariableList(true);
986b9c1b51eSKate Stone         if (variable_list) {
98730fdc8d8SChris Lattner           const size_t num_variables = variable_list->GetSize();
988b9c1b51eSKate Stone           if (num_variables) {
989b9c1b51eSKate Stone             for (i = 0; i < num_variables; ++i) {
99030fdc8d8SChris Lattner               VariableSP variable_sp(variable_list->GetVariableAtIndex(i));
991b9c1b51eSKate Stone               if (variable_sp) {
99230fdc8d8SChris Lattner                 bool add_variable = false;
993b9c1b51eSKate Stone                 switch (variable_sp->GetScope()) {
99430fdc8d8SChris Lattner                 case eValueTypeVariableGlobal:
99530fdc8d8SChris Lattner                 case eValueTypeVariableStatic:
99663a27afaSGreg Clayton                 case eValueTypeVariableThreadLocal:
99730fdc8d8SChris Lattner                   add_variable = statics;
99830fdc8d8SChris Lattner                   break;
99930fdc8d8SChris Lattner 
100030fdc8d8SChris Lattner                 case eValueTypeVariableArgument:
100130fdc8d8SChris Lattner                   add_variable = arguments;
100230fdc8d8SChris Lattner                   break;
100330fdc8d8SChris Lattner 
100430fdc8d8SChris Lattner                 case eValueTypeVariableLocal:
100530fdc8d8SChris Lattner                   add_variable = locals;
100630fdc8d8SChris Lattner                   break;
1007c982c768SGreg Clayton 
1008c982c768SGreg Clayton                 default:
1009c982c768SGreg Clayton                   break;
101030fdc8d8SChris Lattner                 }
1011b9c1b51eSKate Stone                 if (add_variable) {
1012349213f9SGreg Clayton                   // Only add variables once so we don't end up with duplicates
1013349213f9SGreg Clayton                   if (variable_set.find(variable_sp) == variable_set.end())
1014349213f9SGreg Clayton                     variable_set.insert(variable_sp);
1015349213f9SGreg Clayton                   else
1016349213f9SGreg Clayton                     continue;
1017349213f9SGreg Clayton 
1018d9e416c0SGreg Clayton                   if (in_scope_only && !variable_sp->IsInScope(frame))
101930fdc8d8SChris Lattner                     continue;
102030fdc8d8SChris Lattner 
1021b9c1b51eSKate Stone                   ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable(
1022b9c1b51eSKate Stone                       variable_sp, eNoDynamicValues));
1023560558ebSEnrico Granata 
1024b9c1b51eSKate Stone                   if (!include_runtime_support_values && valobj_sp != nullptr &&
1025dbb0abbfSEugene Zelenko                       valobj_sp->IsRuntimeSupportValue())
1026560558ebSEnrico Granata                     continue;
1027560558ebSEnrico Granata 
1028e3e91517SEnrico Granata                   SBValue value_sb;
1029e3e91517SEnrico Granata                   value_sb.SetSP(valobj_sp, use_dynamic);
1030e3e91517SEnrico Granata                   value_list.Append(value_sb);
103130fdc8d8SChris Lattner                 }
103230fdc8d8SChris Lattner               }
103330fdc8d8SChris Lattner             }
103430fdc8d8SChris Lattner           }
103530fdc8d8SChris Lattner         }
103641ae8e74SKuba Mracek         if (recognized_arguments) {
103741ae8e74SKuba Mracek           auto recognized_frame = frame->GetRecognizedFrame();
103841ae8e74SKuba Mracek           if (recognized_frame) {
103941ae8e74SKuba Mracek             ValueObjectListSP recognized_arg_list =
104041ae8e74SKuba Mracek                 recognized_frame->GetRecognizedArguments();
104141ae8e74SKuba Mracek             if (recognized_arg_list) {
104241ae8e74SKuba Mracek               for (auto &rec_value_sp : recognized_arg_list->GetObjects()) {
104341ae8e74SKuba Mracek                 SBValue value_sb;
104441ae8e74SKuba Mracek                 value_sb.SetSP(rec_value_sp, use_dynamic);
104541ae8e74SKuba Mracek                 value_list.Append(value_sb);
104641ae8e74SKuba Mracek               }
104741ae8e74SKuba Mracek             }
104841ae8e74SKuba Mracek           }
104941ae8e74SKuba Mracek         }
1050b9c1b51eSKate Stone       } else {
1051c9858e4dSGreg Clayton         if (log)
1052b9c1b51eSKate Stone           log->Printf("SBFrame::GetVariables () => error: could not "
1053b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
10547730b9a4SJim Ingham       }
1055b9c1b51eSKate Stone     } else {
10567730b9a4SJim Ingham       if (log)
10577730b9a4SJim Ingham         log->Printf("SBFrame::GetVariables () => error: process is running");
1058c9858e4dSGreg Clayton     }
10597fdf9ef1SGreg Clayton   }
1060ceb6b139SCaroline Tice 
1061ceb6b139SCaroline Tice   if (log)
1062324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetVariables (...) => SBValueList(%p)",
1063324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
1064324a1036SSaleem Abdulrasool                 static_cast<void *>(value_list.opaque_ptr()));
1065ceb6b139SCaroline Tice 
106630fdc8d8SChris Lattner   return value_list;
106730fdc8d8SChris Lattner }
106830fdc8d8SChris Lattner 
1069b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() {
10705160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1071ceb6b139SCaroline Tice 
107230fdc8d8SChris Lattner   SBValueList value_list;
1073bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1074bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
10754fc6cb9cSJim Ingham 
1076dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1077d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
10787730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1079b9c1b51eSKate Stone   if (target && process) {
10807fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1081b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
10827730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1083b9c1b51eSKate Stone       if (frame) {
1084d9e416c0SGreg Clayton         RegisterContextSP reg_ctx(frame->GetRegisterContext());
1085b9c1b51eSKate Stone         if (reg_ctx) {
108630fdc8d8SChris Lattner           const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
1087b9c1b51eSKate Stone           for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
1088b9c1b51eSKate Stone             value_list.Append(
1089b9c1b51eSKate Stone                 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx));
109030fdc8d8SChris Lattner           }
109130fdc8d8SChris Lattner         }
1092b9c1b51eSKate Stone       } else {
1093c9858e4dSGreg Clayton         if (log)
1094b9c1b51eSKate Stone           log->Printf("SBFrame::GetRegisters () => error: could not "
1095b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
10967730b9a4SJim Ingham       }
1097b9c1b51eSKate Stone     } else {
10987730b9a4SJim Ingham       if (log)
10997730b9a4SJim Ingham         log->Printf("SBFrame::GetRegisters () => error: process is running");
1100c9858e4dSGreg Clayton     }
11017fdf9ef1SGreg Clayton   }
1102ceb6b139SCaroline Tice 
1103ceb6b139SCaroline Tice   if (log)
1104324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetRegisters () => SBValueList(%p)",
1105324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
1106324a1036SSaleem Abdulrasool                 static_cast<void *>(value_list.opaque_ptr()));
1107ceb6b139SCaroline Tice 
110830fdc8d8SChris Lattner   return value_list;
110930fdc8d8SChris Lattner }
111030fdc8d8SChris Lattner 
1111b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) {
1112ad9a53c5SJason Molenda   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1113ad9a53c5SJason Molenda 
1114ad9a53c5SJason Molenda   SBValue result;
1115ad9a53c5SJason Molenda   ValueObjectSP value_sp;
1116bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1117bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1118ad9a53c5SJason Molenda 
1119dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1120ad9a53c5SJason Molenda   Target *target = exe_ctx.GetTargetPtr();
1121ad9a53c5SJason Molenda   Process *process = exe_ctx.GetProcessPtr();
1122b9c1b51eSKate Stone   if (target && process) {
1123ad9a53c5SJason Molenda     Process::StopLocker stop_locker;
1124b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1125ad9a53c5SJason Molenda       frame = exe_ctx.GetFramePtr();
1126b9c1b51eSKate Stone       if (frame) {
1127ad9a53c5SJason Molenda         RegisterContextSP reg_ctx(frame->GetRegisterContext());
1128b9c1b51eSKate Stone         if (reg_ctx) {
1129ad9a53c5SJason Molenda           const uint32_t num_regs = reg_ctx->GetRegisterCount();
1130b9c1b51eSKate Stone           for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) {
1131b9c1b51eSKate Stone             const RegisterInfo *reg_info =
1132b9c1b51eSKate Stone                 reg_ctx->GetRegisterInfoAtIndex(reg_idx);
1133ad9a53c5SJason Molenda             if (reg_info &&
1134ad9a53c5SJason Molenda                 ((reg_info->name && strcasecmp(reg_info->name, name) == 0) ||
1135b9c1b51eSKate Stone                  (reg_info->alt_name &&
1136b9c1b51eSKate Stone                   strcasecmp(reg_info->alt_name, name) == 0))) {
1137ad9a53c5SJason Molenda               value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx);
1138ad9a53c5SJason Molenda               result.SetSP(value_sp);
1139ad9a53c5SJason Molenda               break;
1140ad9a53c5SJason Molenda             }
1141ad9a53c5SJason Molenda           }
1142ad9a53c5SJason Molenda         }
1143b9c1b51eSKate Stone       } else {
1144ad9a53c5SJason Molenda         if (log)
1145b9c1b51eSKate Stone           log->Printf("SBFrame::FindRegister () => error: could not "
1146b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
1147ad9a53c5SJason Molenda       }
1148b9c1b51eSKate Stone     } else {
1149ad9a53c5SJason Molenda       if (log)
11505d353842SJason Molenda         log->Printf("SBFrame::FindRegister () => error: process is running");
1151ad9a53c5SJason Molenda     }
1152ad9a53c5SJason Molenda   }
1153ad9a53c5SJason Molenda 
1154ad9a53c5SJason Molenda   if (log)
1155324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::FindRegister () => SBValue(%p)",
1156324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
1157324a1036SSaleem Abdulrasool                 static_cast<void *>(value_sp.get()));
1158ad9a53c5SJason Molenda 
1159ad9a53c5SJason Molenda   return result;
1160ad9a53c5SJason Molenda }
1161ad9a53c5SJason Molenda 
1162b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) {
11635160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1164da7bc7d0SGreg Clayton   Stream &strm = description.ref();
1165da7bc7d0SGreg Clayton 
1166bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1167bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
11684fc6cb9cSJim Ingham 
1169b57e4a1bSJason Molenda   StackFrame *frame;
1170d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
11717730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1172b9c1b51eSKate Stone   if (target && process) {
11737fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1174b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
11757730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1176b9c1b51eSKate Stone       if (frame) {
1177d9e416c0SGreg Clayton         frame->DumpUsingSettingsFormat(&strm);
1178b9c1b51eSKate Stone       } else {
1179c9858e4dSGreg Clayton         if (log)
1180b9c1b51eSKate Stone           log->Printf("SBFrame::GetDescription () => error: could not "
1181b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
11827730b9a4SJim Ingham       }
1183b9c1b51eSKate Stone     } else {
11847730b9a4SJim Ingham       if (log)
11857730b9a4SJim Ingham         log->Printf("SBFrame::GetDescription () => error: process is running");
1186c9858e4dSGreg Clayton     }
1187c9858e4dSGreg Clayton 
1188b9c1b51eSKate Stone   } else
1189da7bc7d0SGreg Clayton     strm.PutCString("No value");
1190dde9cff3SCaroline Tice 
1191dde9cff3SCaroline Tice   return true;
1192dde9cff3SCaroline Tice }
11931d3afba3SGreg Clayton 
1194b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) {
1195316d498bSGreg Clayton   SBValue result;
1196c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1197c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1198c481c7eeSJim Ingham 
1199b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
1200d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1201b9c1b51eSKate Stone   if (frame && target) {
120235e1bda6SJim Ingham     SBExpressionOptions options;
1203b9c1b51eSKate Stone     lldb::DynamicValueType fetch_dynamic_value =
1204b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
1205cced1566SGreg Clayton     options.SetFetchDynamicValue(fetch_dynamic_value);
120635e1bda6SJim Ingham     options.SetUnwindOnError(true);
120724785bd0SEugene Leviant     options.SetIgnoreBreakpoints(true);
1208998c8a1cSRyan Brown     if (target->GetLanguage() != eLanguageTypeUnknown)
1209998c8a1cSRyan Brown       options.SetLanguage(target->GetLanguage());
1210998c8a1cSRyan Brown     else
1211998c8a1cSRyan Brown       options.SetLanguage(frame->GetLanguage());
121235e1bda6SJim Ingham     return EvaluateExpression(expr, options);
1213316d498bSGreg Clayton   }
1214316d498bSGreg Clayton   return result;
121578a685aaSJim Ingham }
121678a685aaSJim Ingham 
121778a685aaSJim Ingham SBValue
1218b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr,
1219b9c1b51eSKate Stone                             lldb::DynamicValueType fetch_dynamic_value) {
122035e1bda6SJim Ingham   SBExpressionOptions options;
1221cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
122235e1bda6SJim Ingham   options.SetUnwindOnError(true);
122324785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1224c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1225c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1226c481c7eeSJim Ingham 
1227998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1228998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1229998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1230998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1231998c8a1cSRyan Brown   else if (frame)
1232998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
123335e1bda6SJim Ingham   return EvaluateExpression(expr, options);
12347ba6e991SJim Ingham }
12357ba6e991SJim Ingham 
1236b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr,
1237b9c1b51eSKate Stone                                     lldb::DynamicValueType fetch_dynamic_value,
1238b9c1b51eSKate Stone                                     bool unwind_on_error) {
123935e1bda6SJim Ingham   SBExpressionOptions options;
1240c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1241c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1242c481c7eeSJim Ingham 
1243cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
124435e1bda6SJim Ingham   options.SetUnwindOnError(unwind_on_error);
124524785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1246998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1247998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1248998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1249998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1250998c8a1cSRyan Brown   else if (frame)
1251998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
125235e1bda6SJim Ingham   return EvaluateExpression(expr, options);
125335e1bda6SJim Ingham }
125435e1bda6SJim Ingham 
1255b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr,
1256b9c1b51eSKate Stone                                           const SBExpressionOptions &options) {
12575160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
12584838131bSGreg Clayton 
1259358efd65SSaleem Abdulrasool #ifndef LLDB_DISABLE_PYTHON
12605160ce5cSGreg Clayton   Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1261358efd65SSaleem Abdulrasool #endif
1262a162ebafSSean Callanan 
12638646d3c1SJim Ingham   ExpressionResults exe_results = eExpressionSetupError;
126469b582faSGreg Clayton   SBValue expr_result;
12657730b9a4SJim Ingham 
1266b9c1b51eSKate Stone   if (expr == nullptr || expr[0] == '\0') {
12677730b9a4SJim Ingham     if (log)
1268b9c1b51eSKate Stone       log->Printf(
1269b9c1b51eSKate Stone           "SBFrame::EvaluateExpression called with an empty expression");
12707730b9a4SJim Ingham     return expr_result;
12717730b9a4SJim Ingham   }
12727730b9a4SJim Ingham 
127381e871edSGreg Clayton   ValueObjectSP expr_value_sp;
12744838131bSGreg Clayton 
1275bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1276bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
12774fc6cb9cSJim Ingham 
1278b9556accSGreg Clayton   if (log)
12797730b9a4SJim Ingham     log->Printf("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr);
1280b9556accSGreg Clayton 
1281dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
12827730b9a4SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
12837730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
12847730b9a4SJim Ingham 
1285b9c1b51eSKate Stone   if (target && process) {
12867fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1287b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
12887730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1289b9c1b51eSKate Stone       if (frame) {
12908f7db52dSJim Ingham         std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace;
1291b9c1b51eSKate Stone         if (target->GetDisplayExpressionsInCrashlogs()) {
12921ba7c4d0SGreg Clayton           StreamString frame_description;
1293d9e416c0SGreg Clayton           frame->DumpUsingSettingsFormat(&frame_description);
12948f7db52dSJim Ingham           stack_trace = llvm::make_unique<llvm::PrettyStackTraceFormat>(
1295b9c1b51eSKate Stone               "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value "
1296b9c1b51eSKate Stone               "= %u) %s",
1297b9c1b51eSKate Stone               expr, options.GetFetchDynamicValue(),
1298c156427dSZachary Turner               frame_description.GetData());
1299fb6621efSGreg Clayton         }
1300fb6621efSGreg Clayton 
1301b9c1b51eSKate Stone         exe_results = target->EvaluateExpression(expr, frame, expr_value_sp,
130235e1bda6SJim Ingham                                                  options.ref());
1303e3e91517SEnrico Granata         expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
1304b9c1b51eSKate Stone       } else {
1305c9858e4dSGreg Clayton         if (log)
1306b9c1b51eSKate Stone           log->Printf("SBFrame::EvaluateExpression () => error: could not "
1307b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
13087730b9a4SJim Ingham       }
1309b9c1b51eSKate Stone     } else {
13107730b9a4SJim Ingham       if (log)
1311b9c1b51eSKate Stone         log->Printf(
1312b9c1b51eSKate Stone             "SBFrame::EvaluateExpression () => error: process is running");
1313c9858e4dSGreg Clayton     }
13147fdf9ef1SGreg Clayton   }
13154838131bSGreg Clayton 
1316cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1317a162ebafSSean Callanan   if (expr_log)
1318b9c1b51eSKate Stone     expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is "
1319b9c1b51eSKate Stone                      "%s, summary %s **",
1320324a1036SSaleem Abdulrasool                      expr_result.GetValue(), expr_result.GetSummary());
1321a162ebafSSean Callanan 
13224838131bSGreg Clayton   if (log)
1323b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) "
1324b9c1b51eSKate Stone                 "(execution result=%d)",
1325324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), expr,
1326324a1036SSaleem Abdulrasool                 static_cast<void *>(expr_value_sp.get()), exe_results);
1327cf7e2dc0SJason Molenda #endif
13284838131bSGreg Clayton 
1329cfd1acedSGreg Clayton   return expr_result;
13301d3afba3SGreg Clayton }
1331316d498bSGreg Clayton 
1332b9c1b51eSKate Stone bool SBFrame::IsInlined() {
133305f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->IsInlined();
133405f75e9fSOleksiy Vyalov }
133505f75e9fSOleksiy Vyalov 
1336b9c1b51eSKate Stone bool SBFrame::IsInlined() const {
13375160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1338c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1339c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1340c481c7eeSJim Ingham 
1341dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1342d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
13437730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1344b9c1b51eSKate Stone   if (target && process) {
13457fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1346b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
13477730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1348b9c1b51eSKate Stone       if (frame) {
13497fdf9ef1SGreg Clayton 
1350d9e416c0SGreg Clayton         Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1351316d498bSGreg Clayton         if (block)
1352dbb0abbfSEugene Zelenko           return block->GetContainingInlinedBlock() != nullptr;
1353b9c1b51eSKate Stone       } else {
1354c9858e4dSGreg Clayton         if (log)
1355b9c1b51eSKate Stone           log->Printf("SBFrame::IsInlined () => error: could not reconstruct "
1356b9c1b51eSKate Stone                       "frame object for this SBFrame.");
13577730b9a4SJim Ingham       }
1358b9c1b51eSKate Stone     } else {
13597730b9a4SJim Ingham       if (log)
13607730b9a4SJim Ingham         log->Printf("SBFrame::IsInlined () => error: process is running");
1361c9858e4dSGreg Clayton     }
13627fdf9ef1SGreg Clayton   }
1363316d498bSGreg Clayton   return false;
1364316d498bSGreg Clayton }
1365316d498bSGreg Clayton 
13664b36f791SVedant Kumar bool SBFrame::IsArtificial() {
13674b36f791SVedant Kumar   return static_cast<const SBFrame *>(this)->IsArtificial();
13684b36f791SVedant Kumar }
13694b36f791SVedant Kumar 
13704b36f791SVedant Kumar bool SBFrame::IsArtificial() const {
13714b36f791SVedant Kumar   std::unique_lock<std::recursive_mutex> lock;
13724b36f791SVedant Kumar   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
13734b36f791SVedant Kumar 
13744b36f791SVedant Kumar   StackFrame *frame = exe_ctx.GetFramePtr();
13754b36f791SVedant Kumar   if (frame)
13764b36f791SVedant Kumar     return frame->IsArtificial();
13774b36f791SVedant Kumar 
13784b36f791SVedant Kumar   return false;
13794b36f791SVedant Kumar }
13804b36f791SVedant Kumar 
1381b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() {
138205f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->GetFunctionName();
138305f75e9fSOleksiy Vyalov }
138405f75e9fSOleksiy Vyalov 
1385bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const {
1386bdbdd229SJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1387bdbdd229SJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1388bdbdd229SJim Ingham 
1389bdbdd229SJim Ingham   StackFrame *frame = nullptr;
1390bdbdd229SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
1391bdbdd229SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1392bdbdd229SJim Ingham   if (target && process) {
1393bdbdd229SJim Ingham     Process::StopLocker stop_locker;
1394bdbdd229SJim Ingham     if (stop_locker.TryLock(&process->GetRunLock())) {
1395bdbdd229SJim Ingham       frame = exe_ctx.GetFramePtr();
1396bdbdd229SJim Ingham       if (frame) {
1397bdbdd229SJim Ingham         return frame->GuessLanguage();
1398bdbdd229SJim Ingham       }
1399bdbdd229SJim Ingham     }
1400bdbdd229SJim Ingham   }
1401bdbdd229SJim Ingham   return eLanguageTypeUnknown;
1402bdbdd229SJim Ingham }
1403bdbdd229SJim Ingham 
1404b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const {
14055160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1406dbb0abbfSEugene Zelenko   const char *name = nullptr;
1407c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1408c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1409c481c7eeSJim Ingham 
1410dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1411d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
14127730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1413b9c1b51eSKate Stone   if (target && process) {
14147fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1415b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
14167730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1417b9c1b51eSKate Stone       if (frame) {
1418b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1419b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1420b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1421b9c1b51eSKate Stone         if (sc.block) {
1422316d498bSGreg Clayton           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1423b9c1b51eSKate Stone           if (inlined_block) {
1424b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1425b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
1426b9c1b51eSKate Stone             name =
1427b9c1b51eSKate Stone                 inlined_info->GetName(sc.function->GetLanguage()).AsCString();
1428316d498bSGreg Clayton           }
1429316d498bSGreg Clayton         }
1430316d498bSGreg Clayton 
1431b9c1b51eSKate Stone         if (name == nullptr) {
1432316d498bSGreg Clayton           if (sc.function)
1433316d498bSGreg Clayton             name = sc.function->GetName().GetCString();
1434316d498bSGreg Clayton         }
1435316d498bSGreg Clayton 
1436b9c1b51eSKate Stone         if (name == nullptr) {
1437316d498bSGreg Clayton           if (sc.symbol)
1438316d498bSGreg Clayton             name = sc.symbol->GetName().GetCString();
1439316d498bSGreg Clayton         }
1440b9c1b51eSKate Stone       } else {
1441c9858e4dSGreg Clayton         if (log)
1442b9c1b51eSKate Stone           log->Printf("SBFrame::GetFunctionName () => error: could not "
1443b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
14447730b9a4SJim Ingham       }
1445b9c1b51eSKate Stone     } else {
14467730b9a4SJim Ingham       if (log)
14477730b9a4SJim Ingham         log->Printf("SBFrame::GetFunctionName() => error: process is running");
1448c9858e4dSGreg Clayton     }
14497fdf9ef1SGreg Clayton   }
1450316d498bSGreg Clayton   return name;
1451316d498bSGreg Clayton }
1452c1f705c2SEnrico Granata 
1453b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() {
1454c1f705c2SEnrico Granata   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1455dbb0abbfSEugene Zelenko   const char *name = nullptr;
1456c481c7eeSJim Ingham 
1457c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1458c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1459c481c7eeSJim Ingham 
1460dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1461c1f705c2SEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
1462c1f705c2SEnrico Granata   Process *process = exe_ctx.GetProcessPtr();
1463b9c1b51eSKate Stone   if (target && process) {
1464c1f705c2SEnrico Granata     Process::StopLocker stop_locker;
1465b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1466c1f705c2SEnrico Granata       frame = exe_ctx.GetFramePtr();
1467b9c1b51eSKate Stone       if (frame) {
1468b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1469b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1470b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1471b9c1b51eSKate Stone         if (sc.block) {
1472c1f705c2SEnrico Granata           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1473b9c1b51eSKate Stone           if (inlined_block) {
1474b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1475b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
1476b9c1b51eSKate Stone             name = inlined_info->GetDisplayName(sc.function->GetLanguage())
1477b9c1b51eSKate Stone                        .AsCString();
1478c1f705c2SEnrico Granata           }
1479c1f705c2SEnrico Granata         }
1480c1f705c2SEnrico Granata 
1481b9c1b51eSKate Stone         if (name == nullptr) {
1482c1f705c2SEnrico Granata           if (sc.function)
1483c1f705c2SEnrico Granata             name = sc.function->GetDisplayName().GetCString();
1484c1f705c2SEnrico Granata         }
1485c1f705c2SEnrico Granata 
1486b9c1b51eSKate Stone         if (name == nullptr) {
1487c1f705c2SEnrico Granata           if (sc.symbol)
1488c1f705c2SEnrico Granata             name = sc.symbol->GetDisplayName().GetCString();
1489c1f705c2SEnrico Granata         }
1490b9c1b51eSKate Stone       } else {
1491c1f705c2SEnrico Granata         if (log)
1492b9c1b51eSKate Stone           log->Printf("SBFrame::GetDisplayFunctionName () => error: could not "
1493b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
1494c1f705c2SEnrico Granata       }
1495b9c1b51eSKate Stone     } else {
1496c1f705c2SEnrico Granata       if (log)
1497b9c1b51eSKate Stone         log->Printf(
1498b9c1b51eSKate Stone             "SBFrame::GetDisplayFunctionName() => error: process is running");
1499c1f705c2SEnrico Granata     }
1500c1f705c2SEnrico Granata   }
1501c1f705c2SEnrico Granata   return name;
1502c1f705c2SEnrico Granata }
1503