130fdc8d8SChris Lattner //===-- SBFrame.cpp ---------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler 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"
1830fdc8d8SChris Lattner #include "lldb/Core/Address.h"
1930fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2030fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h"
2130fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h"
22151c032cSJim Ingham #include "lldb/Expression/UserExpression.h"
231ba7c4d0SGreg Clayton #include "lldb/Host/Host.h"
2430fdc8d8SChris Lattner #include "lldb/Symbol/Block.h"
251f746071SGreg Clayton #include "lldb/Symbol/Function.h"
261f746071SGreg Clayton #include "lldb/Symbol/Symbol.h"
2730fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h"
2830fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h"
29b9c1b51eSKate Stone #include "lldb/Symbol/VariableList.h"
3030fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h"
3130fdc8d8SChris Lattner #include "lldb/Target/Process.h"
3230fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
33b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h"
3441ae8e74SKuba Mracek #include "lldb/Target/StackFrameRecognizer.h"
35b9556accSGreg Clayton #include "lldb/Target/StackID.h"
36b9c1b51eSKate Stone #include "lldb/Target/Target.h"
3730fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
38bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h"
396f9e6901SZachary Turner #include "lldb/Utility/Log.h"
40bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
4130fdc8d8SChris Lattner 
424c5de699SEli Friedman #include "lldb/API/SBAddress.h"
43b9c1b51eSKate Stone #include "lldb/API/SBDebugger.h"
4435e1bda6SJim Ingham #include "lldb/API/SBExpressionOptions.h"
45dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
464c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h"
474c5de699SEli Friedman #include "lldb/API/SBThread.h"
48b9c1b51eSKate Stone #include "lldb/API/SBValue.h"
4951f96eebSZachary Turner #include "lldb/API/SBVariablesOptions.h"
5030fdc8d8SChris Lattner 
51237c3ed9SSean Callanan #include "llvm/Support/PrettyStackTrace.h"
52237c3ed9SSean Callanan 
5330fdc8d8SChris Lattner using namespace lldb;
5430fdc8d8SChris Lattner using namespace lldb_private;
5530fdc8d8SChris Lattner 
56b9c1b51eSKate Stone SBFrame::SBFrame() : m_opaque_sp(new ExecutionContextRef()) {}
5730fdc8d8SChris Lattner 
58b9c1b51eSKate Stone SBFrame::SBFrame(const StackFrameSP &lldb_object_sp)
59b9c1b51eSKate Stone     : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) {
605160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
61ceb6b139SCaroline Tice 
62b9c1b51eSKate Stone   if (log) {
63ceb6b139SCaroline Tice     SBStream sstr;
64ceb6b139SCaroline Tice     GetDescription(sstr);
654838131bSGreg Clayton     log->Printf("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s",
66324a1036SSaleem Abdulrasool                 static_cast<void *>(lldb_object_sp.get()),
67324a1036SSaleem Abdulrasool                 static_cast<void *>(lldb_object_sp.get()), sstr.GetData());
68ceb6b139SCaroline Tice   }
6930fdc8d8SChris Lattner }
7030fdc8d8SChris Lattner 
71b9c1b51eSKate Stone SBFrame::SBFrame(const SBFrame &rhs)
72b9c1b51eSKate Stone     : m_opaque_sp(new ExecutionContextRef(*rhs.m_opaque_sp)) {}
73efabb123SGreg Clayton 
74dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default;
75dbb0abbfSEugene Zelenko 
76b9c1b51eSKate Stone const SBFrame &SBFrame::operator=(const SBFrame &rhs) {
77efabb123SGreg Clayton   if (this != &rhs)
787fdf9ef1SGreg Clayton     *m_opaque_sp = *rhs.m_opaque_sp;
79efabb123SGreg Clayton   return *this;
80efabb123SGreg Clayton }
81efabb123SGreg Clayton 
82b9c1b51eSKate Stone StackFrameSP SBFrame::GetFrameSP() const {
83dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetFrameSP() : StackFrameSP());
84b9556accSGreg Clayton }
8530fdc8d8SChris Lattner 
86b9c1b51eSKate Stone void SBFrame::SetFrameSP(const StackFrameSP &lldb_object_sp) {
877fdf9ef1SGreg Clayton   return m_opaque_sp->SetFrameSP(lldb_object_sp);
88b9556accSGreg Clayton }
8930fdc8d8SChris Lattner 
90b9c1b51eSKate Stone bool SBFrame::IsValid() const {
91bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
92bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
937fa7dc36SJim Ingham 
947fa7dc36SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
957fa7dc36SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
96b9c1b51eSKate Stone   if (target && process) {
977fa7dc36SJim Ingham     Process::StopLocker stop_locker;
987fa7dc36SJim Ingham     if (stop_locker.TryLock(&process->GetRunLock()))
99dbb0abbfSEugene Zelenko       return GetFrameSP().get() != nullptr;
10030fdc8d8SChris Lattner   }
10130fdc8d8SChris Lattner 
1027fa7dc36SJim Ingham   // Without a target & process we can't have a valid stack frame.
1037fa7dc36SJim Ingham   return false;
1047fa7dc36SJim Ingham }
1057fa7dc36SJim Ingham 
106b9c1b51eSKate Stone SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const {
1075160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
10830fdc8d8SChris Lattner   SBSymbolContext sb_sym_ctx;
109bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
110bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
111991e4453SZachary Turner   SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope);
112dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
113d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1147730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
115b9c1b51eSKate Stone   if (target && process) {
1167fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
117b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1187730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
119b9c1b51eSKate Stone       if (frame) {
120991e4453SZachary Turner         sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext(scope));
121b9c1b51eSKate Stone       } else {
122c9858e4dSGreg Clayton         if (log)
123b9c1b51eSKate Stone           log->Printf("SBFrame::GetVariables () => error: could not "
124b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
1257730b9a4SJim Ingham       }
126b9c1b51eSKate Stone     } else {
1277730b9a4SJim Ingham       if (log)
128b9c1b51eSKate Stone         log->Printf(
129b9c1b51eSKate Stone             "SBFrame::GetSymbolContext () => error: process is running");
130c9858e4dSGreg Clayton     }
1317fdf9ef1SGreg Clayton   }
132ceb6b139SCaroline Tice 
133ceb6b139SCaroline Tice   if (log)
134b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => "
135b9c1b51eSKate Stone                 "SBSymbolContext(%p)",
136324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), resolve_scope,
137324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_sym_ctx.get()));
138ceb6b139SCaroline Tice 
13930fdc8d8SChris Lattner   return sb_sym_ctx;
14030fdc8d8SChris Lattner }
14130fdc8d8SChris Lattner 
142b9c1b51eSKate Stone SBModule SBFrame::GetModule() const {
1435160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
14472eff18aSGreg Clayton   SBModule sb_module;
145acdbe816SGreg Clayton   ModuleSP module_sp;
146bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
147bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1484fc6cb9cSJim Ingham 
149dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
150d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1517730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
152b9c1b51eSKate Stone   if (target && process) {
1537fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
154b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1557730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
156b9c1b51eSKate Stone       if (frame) {
157d9e416c0SGreg Clayton         module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp;
158acdbe816SGreg Clayton         sb_module.SetSP(module_sp);
159b9c1b51eSKate Stone       } else {
160c9858e4dSGreg Clayton         if (log)
161b9c1b51eSKate Stone           log->Printf("SBFrame::GetModule () => error: could not reconstruct "
162b9c1b51eSKate Stone                       "frame object for this SBFrame.");
1637730b9a4SJim Ingham       }
164b9c1b51eSKate Stone     } else {
1657730b9a4SJim Ingham       if (log)
1667730b9a4SJim Ingham         log->Printf("SBFrame::GetModule () => error: process is running");
167c9858e4dSGreg Clayton     }
1687fdf9ef1SGreg Clayton   }
16972eff18aSGreg Clayton 
1704838131bSGreg Clayton   if (log)
1714838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetModule () => SBModule(%p)",
172324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
173324a1036SSaleem Abdulrasool                 static_cast<void *>(module_sp.get()));
1744838131bSGreg Clayton 
17530fdc8d8SChris Lattner   return sb_module;
17630fdc8d8SChris Lattner }
17730fdc8d8SChris Lattner 
178b9c1b51eSKate Stone SBCompileUnit SBFrame::GetCompileUnit() const {
1795160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
18072eff18aSGreg Clayton   SBCompileUnit sb_comp_unit;
181bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
182bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1834fc6cb9cSJim Ingham 
184dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
185d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1867730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
187b9c1b51eSKate Stone   if (target && process) {
1887fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
189b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1907730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
191b9c1b51eSKate Stone       if (frame) {
192b9c1b51eSKate Stone         sb_comp_unit.reset(
193b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit);
194b9c1b51eSKate Stone       } else {
195ceb6b139SCaroline Tice         if (log)
196b9c1b51eSKate Stone           log->Printf("SBFrame::GetCompileUnit () => error: could not "
197b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
1987730b9a4SJim Ingham       }
199b9c1b51eSKate Stone     } else {
2007730b9a4SJim Ingham       if (log)
2017730b9a4SJim Ingham         log->Printf("SBFrame::GetCompileUnit () => error: process is running");
202c9858e4dSGreg Clayton     }
203c9858e4dSGreg Clayton   }
204c9858e4dSGreg Clayton   if (log)
205c9858e4dSGreg Clayton     log->Printf("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)",
206324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
207324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_comp_unit.get()));
208ceb6b139SCaroline Tice 
20930fdc8d8SChris Lattner   return sb_comp_unit;
21030fdc8d8SChris Lattner }
21130fdc8d8SChris Lattner 
212b9c1b51eSKate Stone SBFunction SBFrame::GetFunction() const {
2135160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
21472eff18aSGreg Clayton   SBFunction sb_function;
215bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
216bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2174fc6cb9cSJim Ingham 
218dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
219d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2207730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
221b9c1b51eSKate Stone   if (target && process) {
2227fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
223b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2247730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
225b9c1b51eSKate Stone       if (frame) {
226b9c1b51eSKate Stone         sb_function.reset(
227b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextFunction).function);
228b9c1b51eSKate Stone       } else {
229c9858e4dSGreg Clayton         if (log)
230b9c1b51eSKate Stone           log->Printf("SBFrame::GetFunction () => error: could not reconstruct "
231b9c1b51eSKate Stone                       "frame object for this SBFrame.");
2327730b9a4SJim Ingham       }
233b9c1b51eSKate Stone     } else {
2347730b9a4SJim Ingham       if (log)
2357730b9a4SJim Ingham         log->Printf("SBFrame::GetFunction () => error: process is running");
2367fdf9ef1SGreg Clayton     }
237c9858e4dSGreg Clayton   }
2384838131bSGreg Clayton   if (log)
2394838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetFunction () => SBFunction(%p)",
240324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
241324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_function.get()));
2424838131bSGreg Clayton 
24330fdc8d8SChris Lattner   return sb_function;
24430fdc8d8SChris Lattner }
24530fdc8d8SChris Lattner 
246b9c1b51eSKate Stone SBSymbol SBFrame::GetSymbol() const {
2475160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
24872eff18aSGreg Clayton   SBSymbol sb_symbol;
249bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
250bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2514fc6cb9cSJim Ingham 
252dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
253d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2547730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
255b9c1b51eSKate Stone   if (target && process) {
2567fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
257b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2587730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
259b9c1b51eSKate Stone       if (frame) {
260d9e416c0SGreg Clayton         sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol);
261b9c1b51eSKate Stone       } else {
262c9858e4dSGreg Clayton         if (log)
263b9c1b51eSKate Stone           log->Printf("SBFrame::GetSymbol () => error: could not reconstruct "
264b9c1b51eSKate Stone                       "frame object for this SBFrame.");
2657730b9a4SJim Ingham       }
266b9c1b51eSKate Stone     } else {
2677730b9a4SJim Ingham       if (log)
2687730b9a4SJim Ingham         log->Printf("SBFrame::GetSymbol () => error: process is running");
2697fdf9ef1SGreg Clayton     }
270c9858e4dSGreg Clayton   }
2714838131bSGreg Clayton   if (log)
2724838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetSymbol () => SBSymbol(%p)",
273324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
274324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_symbol.get()));
2753b06557eSGreg Clayton   return sb_symbol;
2763b06557eSGreg Clayton }
2773b06557eSGreg Clayton 
278b9c1b51eSKate Stone SBBlock SBFrame::GetBlock() const {
2795160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
28072eff18aSGreg Clayton   SBBlock sb_block;
281bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
282bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2834fc6cb9cSJim Ingham 
284dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
285d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2867730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
287b9c1b51eSKate Stone   if (target && process) {
2887fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
289b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2907730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
291b9c1b51eSKate Stone       if (frame) {
292d9e416c0SGreg Clayton         sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block);
293b9c1b51eSKate Stone       } else {
294c9858e4dSGreg Clayton         if (log)
295b9c1b51eSKate Stone           log->Printf("SBFrame::GetBlock () => error: could not reconstruct "
296b9c1b51eSKate Stone                       "frame object for this SBFrame.");
2977730b9a4SJim Ingham       }
298b9c1b51eSKate Stone     } else {
2997730b9a4SJim Ingham       if (log)
300324a1036SSaleem Abdulrasool         log->Printf("SBFrame(%p)::GetBlock () => error: process is running",
301324a1036SSaleem Abdulrasool                     static_cast<void *>(frame));
3027fdf9ef1SGreg Clayton     }
303c9858e4dSGreg Clayton   }
3044838131bSGreg Clayton   if (log)
3054838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetBlock () => SBBlock(%p)",
306324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
307324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_block.GetPtr()));
30830fdc8d8SChris Lattner   return sb_block;
30930fdc8d8SChris Lattner }
31030fdc8d8SChris Lattner 
311b9c1b51eSKate Stone SBBlock SBFrame::GetFrameBlock() const {
31272eff18aSGreg Clayton   SBBlock sb_block;
313bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
314bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3154fc6cb9cSJim Ingham 
316dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
317d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3185160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
3197730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
320b9c1b51eSKate Stone   if (target && process) {
3217fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
322b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3237730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
324b9c1b51eSKate Stone       if (frame) {
325d9e416c0SGreg Clayton         sb_block.SetPtr(frame->GetFrameBlock());
326b9c1b51eSKate Stone       } else {
327c9858e4dSGreg Clayton         if (log)
328b9c1b51eSKate Stone           log->Printf("SBFrame::GetFrameBlock () => error: could not "
329b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
3307730b9a4SJim Ingham       }
331b9c1b51eSKate Stone     } else {
3327730b9a4SJim Ingham       if (log)
3337730b9a4SJim Ingham         log->Printf("SBFrame::GetFrameBlock () => error: process is running");
3347fdf9ef1SGreg Clayton     }
335c9858e4dSGreg Clayton   }
3364838131bSGreg Clayton   if (log)
3374838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)",
338324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
339324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_block.GetPtr()));
34095897c6aSGreg Clayton   return sb_block;
34195897c6aSGreg Clayton }
34295897c6aSGreg Clayton 
343b9c1b51eSKate Stone SBLineEntry SBFrame::GetLineEntry() const {
3445160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
34572eff18aSGreg Clayton   SBLineEntry sb_line_entry;
346bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
347bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3484fc6cb9cSJim Ingham 
349dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
350d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3517730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
352b9c1b51eSKate Stone   if (target && process) {
3537fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
354b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3557730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
356b9c1b51eSKate Stone       if (frame) {
357b9c1b51eSKate Stone         sb_line_entry.SetLineEntry(
358b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextLineEntry).line_entry);
359b9c1b51eSKate Stone       } else {
360c9858e4dSGreg Clayton         if (log)
361b9c1b51eSKate Stone           log->Printf("SBFrame::GetLineEntry () => error: could not "
362b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
3637730b9a4SJim Ingham       }
364b9c1b51eSKate Stone     } else {
3657730b9a4SJim Ingham       if (log)
3667730b9a4SJim Ingham         log->Printf("SBFrame::GetLineEntry () => error: process is running");
3677fdf9ef1SGreg Clayton     }
368c9858e4dSGreg Clayton   }
3694838131bSGreg Clayton   if (log)
3704838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)",
371324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
372324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_line_entry.get()));
37330fdc8d8SChris Lattner   return sb_line_entry;
37430fdc8d8SChris Lattner }
37530fdc8d8SChris Lattner 
376b9c1b51eSKate Stone uint32_t SBFrame::GetFrameID() const {
377b9556accSGreg Clayton   uint32_t frame_idx = UINT32_MAX;
378b9556accSGreg Clayton 
379c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
380c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
381c481c7eeSJim Ingham 
382b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
3837fdf9ef1SGreg Clayton   if (frame)
384d9e416c0SGreg Clayton     frame_idx = frame->GetFrameIndex();
3854838131bSGreg Clayton 
3865160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
3874838131bSGreg Clayton   if (log)
388b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::GetFrameID () => %u", static_cast<void *>(frame),
389b9c1b51eSKate Stone                 frame_idx);
3904838131bSGreg Clayton   return frame_idx;
39130fdc8d8SChris Lattner }
39230fdc8d8SChris Lattner 
393b9c1b51eSKate Stone lldb::addr_t SBFrame::GetCFA() const {
394c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
395c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
396c481c7eeSJim Ingham 
397424a5dbcSGreg Clayton   StackFrame *frame = exe_ctx.GetFramePtr();
398424a5dbcSGreg Clayton   if (frame)
399424a5dbcSGreg Clayton     return frame->GetStackID().GetCallFrameAddress();
400424a5dbcSGreg Clayton   return LLDB_INVALID_ADDRESS;
401424a5dbcSGreg Clayton }
402424a5dbcSGreg Clayton 
403b9c1b51eSKate Stone addr_t SBFrame::GetPC() const {
4045160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
40569b582faSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
406bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
407bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4084fc6cb9cSJim Ingham 
409dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
410d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4117730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
412b9c1b51eSKate Stone   if (target && process) {
4137fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
414b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4157730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
416b9c1b51eSKate Stone       if (frame) {
417b9c1b51eSKate Stone         addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress(
41804803b3eSTatyana Krasnukha             target, AddressClass::eCode);
419b9c1b51eSKate Stone       } else {
420c9858e4dSGreg Clayton         if (log)
421b9c1b51eSKate Stone           log->Printf("SBFrame::GetPC () => error: could not reconstruct frame "
422b9c1b51eSKate Stone                       "object for this SBFrame.");
4237730b9a4SJim Ingham       }
424b9c1b51eSKate Stone     } else {
4257730b9a4SJim Ingham       if (log)
4267730b9a4SJim Ingham         log->Printf("SBFrame::GetPC () => error: process is running");
427c9858e4dSGreg Clayton     }
4287fdf9ef1SGreg Clayton   }
429ceb6b139SCaroline Tice 
430ceb6b139SCaroline Tice   if (log)
431324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetPC () => 0x%" PRIx64,
432324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), addr);
433ceb6b139SCaroline Tice 
434ceb6b139SCaroline Tice   return addr;
43530fdc8d8SChris Lattner }
43630fdc8d8SChris Lattner 
437b9c1b51eSKate Stone bool SBFrame::SetPC(addr_t new_pc) {
4385160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
439ceb6b139SCaroline Tice   bool ret_val = false;
440bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
441bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4424fc6cb9cSJim Ingham 
443dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
444d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4457730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
446b9c1b51eSKate Stone   if (target && process) {
4477fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
448b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4497730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
450b9c1b51eSKate Stone       if (frame) {
451d9e416c0SGreg Clayton         ret_val = frame->GetRegisterContext()->SetPC(new_pc);
452b9c1b51eSKate Stone       } else {
453c9858e4dSGreg Clayton         if (log)
454b9c1b51eSKate Stone           log->Printf("SBFrame::SetPC () => error: could not reconstruct frame "
455b9c1b51eSKate Stone                       "object for this SBFrame.");
4567730b9a4SJim Ingham       }
457b9c1b51eSKate Stone     } else {
4587730b9a4SJim Ingham       if (log)
4597730b9a4SJim Ingham         log->Printf("SBFrame::SetPC () => error: process is running");
460c9858e4dSGreg Clayton     }
4617fdf9ef1SGreg Clayton   }
462ceb6b139SCaroline Tice 
463ceb6b139SCaroline Tice   if (log)
464d01b2953SDaniel Malea     log->Printf("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i",
465324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), new_pc, ret_val);
466ceb6b139SCaroline Tice 
467ceb6b139SCaroline Tice   return ret_val;
46830fdc8d8SChris Lattner }
46930fdc8d8SChris Lattner 
470b9c1b51eSKate Stone addr_t SBFrame::GetSP() const {
4715160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
4724838131bSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
473bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
474bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4754fc6cb9cSJim Ingham 
476dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
477d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4787730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
479b9c1b51eSKate Stone   if (target && process) {
4807fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
481b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4827730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
483b9c1b51eSKate Stone       if (frame) {
484d9e416c0SGreg Clayton         addr = frame->GetRegisterContext()->GetSP();
485b9c1b51eSKate Stone       } else {
486c9858e4dSGreg Clayton         if (log)
487b9c1b51eSKate Stone           log->Printf("SBFrame::GetSP () => error: could not reconstruct frame "
488b9c1b51eSKate Stone                       "object for this SBFrame.");
4897730b9a4SJim Ingham       }
490b9c1b51eSKate Stone     } else {
4917730b9a4SJim Ingham       if (log)
4927730b9a4SJim Ingham         log->Printf("SBFrame::GetSP () => error: process is running");
4937fdf9ef1SGreg Clayton     }
494c9858e4dSGreg Clayton   }
4954838131bSGreg Clayton   if (log)
496324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetSP () => 0x%" PRIx64,
497324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), addr);
4984838131bSGreg Clayton 
4994838131bSGreg Clayton   return addr;
50030fdc8d8SChris Lattner }
50130fdc8d8SChris Lattner 
502b9c1b51eSKate Stone addr_t SBFrame::GetFP() const {
5035160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
50469b582faSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
505bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
506bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5074fc6cb9cSJim Ingham 
508dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
509d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5107730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
511b9c1b51eSKate Stone   if (target && process) {
5127fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
513b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5147730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
515b9c1b51eSKate Stone       if (frame) {
516d9e416c0SGreg Clayton         addr = frame->GetRegisterContext()->GetFP();
517b9c1b51eSKate Stone       } else {
518c9858e4dSGreg Clayton         if (log)
519b9c1b51eSKate Stone           log->Printf("SBFrame::GetFP () => error: could not reconstruct frame "
520b9c1b51eSKate Stone                       "object for this SBFrame.");
5217730b9a4SJim Ingham       }
522b9c1b51eSKate Stone     } else {
5237730b9a4SJim Ingham       if (log)
5247730b9a4SJim Ingham         log->Printf("SBFrame::GetFP () => error: process is running");
525c9858e4dSGreg Clayton     }
5267fdf9ef1SGreg Clayton   }
527ceb6b139SCaroline Tice 
528ceb6b139SCaroline Tice   if (log)
529324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetFP () => 0x%" PRIx64,
530324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), addr);
531ceb6b139SCaroline Tice   return addr;
53230fdc8d8SChris Lattner }
53330fdc8d8SChris Lattner 
534b9c1b51eSKate Stone SBAddress SBFrame::GetPCAddress() const {
5355160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
53630fdc8d8SChris Lattner   SBAddress sb_addr;
537bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
538bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5394fc6cb9cSJim Ingham 
540b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
541d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5427730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
543b9c1b51eSKate Stone   if (target && process) {
5447fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
545b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5467730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
547b9c1b51eSKate Stone       if (frame) {
548d9e416c0SGreg Clayton         sb_addr.SetAddress(&frame->GetFrameCodeAddress());
549b9c1b51eSKate Stone       } else {
550c9858e4dSGreg Clayton         if (log)
551b9c1b51eSKate Stone           log->Printf("SBFrame::GetPCAddress () => error: could not "
552b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
5537730b9a4SJim Ingham       }
554b9c1b51eSKate Stone     } else {
5557730b9a4SJim Ingham       if (log)
5567730b9a4SJim Ingham         log->Printf("SBFrame::GetPCAddress () => error: process is running");
5577fdf9ef1SGreg Clayton     }
558c9858e4dSGreg Clayton   }
5594838131bSGreg Clayton   if (log)
560324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetPCAddress () => SBAddress(%p)",
561b9c1b51eSKate Stone                 static_cast<void *>(frame), static_cast<void *>(sb_addr.get()));
56230fdc8d8SChris Lattner   return sb_addr;
56330fdc8d8SChris Lattner }
56430fdc8d8SChris Lattner 
565b9c1b51eSKate Stone void SBFrame::Clear() { m_opaque_sp->Clear(); }
56630fdc8d8SChris Lattner 
567b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) {
5687edbdfc9SGreg Clayton   SBValue sb_value;
569c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
570c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
571c481c7eeSJim Ingham 
572b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
573d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
574b9c1b51eSKate Stone   if (frame && target) {
575b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
576b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
5777edbdfc9SGreg Clayton     sb_value = GetValueForVariablePath(var_path, use_dynamic);
5787edbdfc9SGreg Clayton   }
5797edbdfc9SGreg Clayton   return sb_value;
5807edbdfc9SGreg Clayton }
5817edbdfc9SGreg Clayton 
582b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path,
583b9c1b51eSKate Stone                                                DynamicValueType use_dynamic) {
5847edbdfc9SGreg Clayton   SBValue sb_value;
5855160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
586b9c1b51eSKate Stone   if (var_path == nullptr || var_path[0] == '\0') {
5877730b9a4SJim Ingham     if (log)
588b9c1b51eSKate Stone       log->Printf(
589b9c1b51eSKate Stone           "SBFrame::GetValueForVariablePath called with empty variable path.");
5907730b9a4SJim Ingham     return sb_value;
5917730b9a4SJim Ingham   }
5927730b9a4SJim Ingham 
593bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
594bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5954fc6cb9cSJim Ingham 
596dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
597d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5987730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
599b9c1b51eSKate Stone   if (target && process) {
6007fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
601b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
6027730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
603b9c1b51eSKate Stone       if (frame) {
6047edbdfc9SGreg Clayton         VariableSP var_sp;
60597206d57SZachary Turner         Status error;
606b9c1b51eSKate Stone         ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath(
607b9c1b51eSKate Stone             var_path, eNoDynamicValues,
608b9c1b51eSKate Stone             StackFrame::eExpressionPathOptionCheckPtrVsMember |
609b9c1b51eSKate Stone                 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
610b9c1b51eSKate Stone             var_sp, error));
611e3e91517SEnrico Granata         sb_value.SetSP(value_sp, use_dynamic);
612b9c1b51eSKate Stone       } else {
613c9858e4dSGreg Clayton         if (log)
614b9c1b51eSKate Stone           log->Printf("SBFrame::GetValueForVariablePath () => error: could not "
615b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
6167730b9a4SJim Ingham       }
617b9c1b51eSKate Stone     } else {
6187730b9a4SJim Ingham       if (log)
619b9c1b51eSKate Stone         log->Printf(
620b9c1b51eSKate Stone             "SBFrame::GetValueForVariablePath () => error: process is running");
621c9858e4dSGreg Clayton     }
6227fdf9ef1SGreg Clayton   }
6237edbdfc9SGreg Clayton   return sb_value;
6247edbdfc9SGreg Clayton }
6257edbdfc9SGreg Clayton 
626b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name) {
627316d498bSGreg Clayton   SBValue value;
628c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
629c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
630c481c7eeSJim Ingham 
631b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
632d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
633b9c1b51eSKate Stone   if (frame && target) {
634b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
635b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
636316d498bSGreg Clayton     value = FindVariable(name, use_dynamic);
637316d498bSGreg Clayton   }
638316d498bSGreg Clayton   return value;
63978a685aaSJim Ingham }
64078a685aaSJim Ingham 
641b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name,
642b9c1b51eSKate Stone                               lldb::DynamicValueType use_dynamic) {
6435160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
64469b582faSGreg Clayton   VariableSP var_sp;
64558b59f95SJim Ingham   SBValue sb_value;
6467730b9a4SJim Ingham 
647b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
6487730b9a4SJim Ingham     if (log)
6497730b9a4SJim Ingham       log->Printf("SBFrame::FindVariable called with empty name");
6507730b9a4SJim Ingham     return sb_value;
6517730b9a4SJim Ingham   }
6527730b9a4SJim Ingham 
65381e871edSGreg Clayton   ValueObjectSP value_sp;
654bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
655bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
6564fc6cb9cSJim Ingham 
657dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
658d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
6597730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
660b9c1b51eSKate Stone   if (target && process) {
6617fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
662b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
6637730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
664b9c1b51eSKate Stone       if (frame) {
665e23d0b63SShafik Yaghmour         value_sp = frame->FindVariable(ConstString(name));
66630fdc8d8SChris Lattner 
667e23d0b63SShafik Yaghmour         if (value_sp)
668e3e91517SEnrico Granata           sb_value.SetSP(value_sp, use_dynamic);
669b9c1b51eSKate Stone       } else {
670c9858e4dSGreg Clayton         if (log)
671b9c1b51eSKate Stone           log->Printf("SBFrame::FindVariable () => error: could not "
672b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
6737730b9a4SJim Ingham       }
674b9c1b51eSKate Stone     } else {
6757730b9a4SJim Ingham       if (log)
6767730b9a4SJim Ingham         log->Printf("SBFrame::FindVariable () => error: process is running");
677c9858e4dSGreg Clayton     }
678316d498bSGreg Clayton   }
679316d498bSGreg Clayton 
6804838131bSGreg Clayton   if (log)
68169b582faSGreg Clayton     log->Printf("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
682324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), name,
683324a1036SSaleem Abdulrasool                 static_cast<void *>(value_sp.get()));
6844838131bSGreg Clayton 
685dde9cff3SCaroline Tice   return sb_value;
686dde9cff3SCaroline Tice }
687dde9cff3SCaroline Tice 
688b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) {
689316d498bSGreg Clayton   SBValue value;
690c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
691c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
692c481c7eeSJim Ingham 
693b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
694d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
695b9c1b51eSKate Stone   if (frame && target) {
696b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
697b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
698316d498bSGreg Clayton     value = FindValue(name, value_type, use_dynamic);
699316d498bSGreg Clayton   }
700316d498bSGreg Clayton   return value;
70178a685aaSJim Ingham }
70278a685aaSJim Ingham 
703b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type,
704b9c1b51eSKate Stone                            lldb::DynamicValueType use_dynamic) {
7055160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
70669b582faSGreg Clayton   SBValue sb_value;
7077730b9a4SJim Ingham 
708b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
7097730b9a4SJim Ingham     if (log)
7107730b9a4SJim Ingham       log->Printf("SBFrame::FindValue called with empty name.");
7117730b9a4SJim Ingham     return sb_value;
7127730b9a4SJim Ingham   }
7137730b9a4SJim Ingham 
71481e871edSGreg Clayton   ValueObjectSP value_sp;
715bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
716bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
7174fc6cb9cSJim Ingham 
718dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
719d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
7207730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
721b9c1b51eSKate Stone   if (target && process) {
7227fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
723b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
7247730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
725b9c1b51eSKate Stone       if (frame) {
7268a2a0dfbSEnrico Granata         VariableList variable_list;
7278a2a0dfbSEnrico Granata 
728b9c1b51eSKate Stone         switch (value_type) {
72969b582faSGreg Clayton         case eValueTypeVariableGlobal:      // global variable
73069b582faSGreg Clayton         case eValueTypeVariableStatic:      // static variable
73169b582faSGreg Clayton         case eValueTypeVariableArgument:    // function argument variables
73269b582faSGreg Clayton         case eValueTypeVariableLocal:       // function local variables
73363a27afaSGreg Clayton         case eValueTypeVariableThreadLocal: // thread local variables
73469b582faSGreg Clayton         {
735d9e416c0SGreg Clayton           SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock));
73672eff18aSGreg Clayton 
73772eff18aSGreg Clayton           const bool can_create = true;
73872eff18aSGreg Clayton           const bool get_parent_variables = true;
73972eff18aSGreg Clayton           const bool stop_if_block_is_inlined_function = true;
74072eff18aSGreg Clayton 
7410efb51a0SChaoren Lin           if (sc.block)
742b9c1b51eSKate Stone             sc.block->AppendVariables(
743b9c1b51eSKate Stone                 can_create, get_parent_variables,
744b9c1b51eSKate Stone                 stop_if_block_is_inlined_function,
745b9c1b51eSKate Stone                 [frame](Variable *v) { return v->IsInScope(frame); },
746b9c1b51eSKate Stone                 &variable_list);
747b9c1b51eSKate Stone           if (value_type == eValueTypeVariableGlobal) {
7488a2a0dfbSEnrico Granata             const bool get_file_globals = true;
7498a2a0dfbSEnrico Granata             VariableList *frame_vars = frame->GetVariableList(get_file_globals);
7508a2a0dfbSEnrico Granata             if (frame_vars)
7518a2a0dfbSEnrico Granata               frame_vars->AppendVariablesIfUnique(variable_list);
7528a2a0dfbSEnrico Granata           }
75369b582faSGreg Clayton           ConstString const_name(name);
754b9c1b51eSKate Stone           VariableSP variable_sp(
755b9c1b51eSKate Stone               variable_list.FindVariable(const_name, value_type));
756b9c1b51eSKate Stone           if (variable_sp) {
757b9c1b51eSKate Stone             value_sp = frame->GetValueObjectForFrameVariable(variable_sp,
758b9c1b51eSKate Stone                                                              eNoDynamicValues);
759e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
76030fdc8d8SChris Lattner           }
761b9c1b51eSKate Stone         } break;
76269b582faSGreg Clayton 
76369b582faSGreg Clayton         case eValueTypeRegister: // stack frame register value
76469b582faSGreg Clayton         {
765d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
766b9c1b51eSKate Stone           if (reg_ctx) {
76769b582faSGreg Clayton             const uint32_t num_regs = reg_ctx->GetRegisterCount();
768b9c1b51eSKate Stone             for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) {
769b9c1b51eSKate Stone               const RegisterInfo *reg_info =
770b9c1b51eSKate Stone                   reg_ctx->GetRegisterInfoAtIndex(reg_idx);
77169b582faSGreg Clayton               if (reg_info &&
77269b582faSGreg Clayton                   ((reg_info->name && strcasecmp(reg_info->name, name) == 0) ||
773b9c1b51eSKate Stone                    (reg_info->alt_name &&
774b9c1b51eSKate Stone                     strcasecmp(reg_info->alt_name, name) == 0))) {
775d9e416c0SGreg Clayton                 value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx);
77681e871edSGreg Clayton                 sb_value.SetSP(value_sp);
77781e871edSGreg Clayton                 break;
77869b582faSGreg Clayton               }
77969b582faSGreg Clayton             }
78069b582faSGreg Clayton           }
781b9c1b51eSKate Stone         } break;
78269b582faSGreg Clayton 
783b9c1b51eSKate Stone         case eValueTypeRegisterSet: // A collection of stack frame register
784b9c1b51eSKate Stone                                     // values
78569b582faSGreg Clayton         {
786d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
787b9c1b51eSKate Stone           if (reg_ctx) {
78869b582faSGreg Clayton             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
789b9c1b51eSKate Stone             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
79069b582faSGreg Clayton               const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx);
79169b582faSGreg Clayton               if (reg_set &&
79269b582faSGreg Clayton                   ((reg_set->name && strcasecmp(reg_set->name, name) == 0) ||
793b9c1b51eSKate Stone                    (reg_set->short_name &&
794b9c1b51eSKate Stone                     strcasecmp(reg_set->short_name, name) == 0))) {
795b9c1b51eSKate Stone                 value_sp =
796b9c1b51eSKate Stone                     ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx);
79781e871edSGreg Clayton                 sb_value.SetSP(value_sp);
79881e871edSGreg Clayton                 break;
79969b582faSGreg Clayton               }
80069b582faSGreg Clayton             }
80169b582faSGreg Clayton           }
802b9c1b51eSKate Stone         } break;
80369b582faSGreg Clayton 
80469b582faSGreg Clayton         case eValueTypeConstResult: // constant result variables
80569b582faSGreg Clayton         {
80669b582faSGreg Clayton           ConstString const_name(name);
807b9c1b51eSKate Stone           ExpressionVariableSP expr_var_sp(
808b9c1b51eSKate Stone               target->GetPersistentVariable(const_name));
809b9c1b51eSKate Stone           if (expr_var_sp) {
81081e871edSGreg Clayton             value_sp = expr_var_sp->GetValueObject();
811e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
81281e871edSGreg Clayton           }
813b9c1b51eSKate Stone         } break;
81469b582faSGreg Clayton 
81569b582faSGreg Clayton         default:
81669b582faSGreg Clayton           break;
81769b582faSGreg Clayton         }
818b9c1b51eSKate Stone       } else {
819c9858e4dSGreg Clayton         if (log)
820b9c1b51eSKate Stone           log->Printf("SBFrame::FindValue () => error: could not reconstruct "
821b9c1b51eSKate Stone                       "frame object for this SBFrame.");
8227730b9a4SJim Ingham       }
823b9c1b51eSKate Stone     } else {
8247730b9a4SJim Ingham       if (log)
8257730b9a4SJim Ingham         log->Printf("SBFrame::FindValue () => error: process is running");
826c9858e4dSGreg Clayton     }
8277fdf9ef1SGreg Clayton   }
828dde9cff3SCaroline Tice 
8294838131bSGreg Clayton   if (log)
830b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) "
831b9c1b51eSKate Stone                 "=> SBValue(%p)",
832324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), name, value_type,
833324a1036SSaleem Abdulrasool                 static_cast<void *>(value_sp.get()));
8344838131bSGreg Clayton 
835dde9cff3SCaroline Tice   return sb_value;
836dde9cff3SCaroline Tice }
837dde9cff3SCaroline Tice 
838b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const {
839b57e4a1bSJason Molenda   lldb::StackFrameSP this_sp = GetFrameSP();
840b57e4a1bSJason Molenda   lldb::StackFrameSP that_sp = that.GetFrameSP();
84135e2ab60SJohnny Chen   return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
84235e2ab60SJohnny Chen }
84335e2ab60SJohnny Chen 
844b9c1b51eSKate Stone bool SBFrame::operator==(const SBFrame &rhs) const { return IsEqual(rhs); }
84530fdc8d8SChris Lattner 
846b9c1b51eSKate Stone bool SBFrame::operator!=(const SBFrame &rhs) const { return !IsEqual(rhs); }
84730fdc8d8SChris Lattner 
848b9c1b51eSKate Stone SBThread SBFrame::GetThread() const {
8495160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
850ceb6b139SCaroline Tice 
851c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
852c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
853c481c7eeSJim Ingham 
854d9e416c0SGreg Clayton   ThreadSP thread_sp(exe_ctx.GetThreadSP());
855d9e416c0SGreg Clayton   SBThread sb_thread(thread_sp);
856ceb6b139SCaroline Tice 
857b9c1b51eSKate Stone   if (log) {
858750cd175SCaroline Tice     SBStream sstr;
859750cd175SCaroline Tice     sb_thread.GetDescription(sstr);
860d9e416c0SGreg Clayton     log->Printf("SBFrame(%p)::GetThread () => SBThread(%p): %s",
861324a1036SSaleem Abdulrasool                 static_cast<void *>(exe_ctx.GetFramePtr()),
862324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()), sstr.GetData());
863750cd175SCaroline Tice   }
864ceb6b139SCaroline Tice 
86530fdc8d8SChris Lattner   return sb_thread;
86630fdc8d8SChris Lattner }
86730fdc8d8SChris Lattner 
868b9c1b51eSKate Stone const char *SBFrame::Disassemble() const {
8695160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
870dbb0abbfSEugene Zelenko   const char *disassembly = nullptr;
871bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
872bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
8734fc6cb9cSJim Ingham 
874dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
875d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
8767730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
877b9c1b51eSKate Stone   if (target && process) {
8787fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
879b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
8807730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
881b9c1b51eSKate Stone       if (frame) {
882d9e416c0SGreg Clayton         disassembly = frame->Disassemble();
883b9c1b51eSKate Stone       } else {
884c9858e4dSGreg Clayton         if (log)
885b9c1b51eSKate Stone           log->Printf("SBFrame::Disassemble () => error: could not reconstruct "
886b9c1b51eSKate Stone                       "frame object for this SBFrame.");
8877730b9a4SJim Ingham       }
888b9c1b51eSKate Stone     } else {
8897730b9a4SJim Ingham       if (log)
8907730b9a4SJim Ingham         log->Printf("SBFrame::Disassemble () => error: process is running");
8917fdf9ef1SGreg Clayton     }
892c9858e4dSGreg Clayton   }
8934838131bSGreg Clayton 
8944838131bSGreg Clayton   if (log)
895b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::Disassemble () => %s", static_cast<void *>(frame),
896b9c1b51eSKate Stone                 disassembly);
8974838131bSGreg Clayton 
8984838131bSGreg Clayton   return disassembly;
89930fdc8d8SChris Lattner }
90030fdc8d8SChris Lattner 
901b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics,
902b9c1b51eSKate Stone                                   bool in_scope_only) {
903316d498bSGreg Clayton   SBValueList value_list;
904c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
905c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
906c481c7eeSJim Ingham 
907b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
908d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
909b9c1b51eSKate Stone   if (frame && target) {
910b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
911b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
912b9c1b51eSKate Stone     const bool include_runtime_support_values =
913b9c1b51eSKate Stone         target ? target->GetDisplayRuntimeSupportValues() : false;
91451f96eebSZachary Turner 
91551f96eebSZachary Turner     SBVariablesOptions options;
91651f96eebSZachary Turner     options.SetIncludeArguments(arguments);
91751f96eebSZachary Turner     options.SetIncludeLocals(locals);
91851f96eebSZachary Turner     options.SetIncludeStatics(statics);
91951f96eebSZachary Turner     options.SetInScopeOnly(in_scope_only);
92051f96eebSZachary Turner     options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
92151f96eebSZachary Turner     options.SetUseDynamic(use_dynamic);
92251f96eebSZachary Turner 
92351f96eebSZachary Turner     value_list = GetVariables(options);
924316d498bSGreg Clayton   }
925316d498bSGreg Clayton   return value_list;
92678a685aaSJim Ingham }
92778a685aaSJim Ingham 
928b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals,
929b9c1b51eSKate Stone                                         bool statics, bool in_scope_only,
930b9c1b51eSKate Stone                                         lldb::DynamicValueType use_dynamic) {
931c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
932c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
933c481c7eeSJim Ingham 
934560558ebSEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
935b9c1b51eSKate Stone   const bool include_runtime_support_values =
936b9c1b51eSKate Stone       target ? target->GetDisplayRuntimeSupportValues() : false;
93751f96eebSZachary Turner   SBVariablesOptions options;
93851f96eebSZachary Turner   options.SetIncludeArguments(arguments);
93951f96eebSZachary Turner   options.SetIncludeLocals(locals);
94051f96eebSZachary Turner   options.SetIncludeStatics(statics);
94151f96eebSZachary Turner   options.SetInScopeOnly(in_scope_only);
94251f96eebSZachary Turner   options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
94351f96eebSZachary Turner   options.SetUseDynamic(use_dynamic);
94451f96eebSZachary Turner   return GetVariables(options);
945560558ebSEnrico Granata }
946560558ebSEnrico Granata 
947b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) {
9485160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
949ceb6b139SCaroline Tice 
950b9556accSGreg Clayton   SBValueList value_list;
951bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
952bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
9534fc6cb9cSJim Ingham 
954dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
955d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
956b9556accSGreg Clayton 
95751f96eebSZachary Turner   const bool statics = options.GetIncludeStatics();
95851f96eebSZachary Turner   const bool arguments = options.GetIncludeArguments();
9594c7f5d5cSKuba Mracek   const bool recognized_arguments =
9604c7f5d5cSKuba Mracek         options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP()));
96151f96eebSZachary Turner   const bool locals = options.GetIncludeLocals();
96251f96eebSZachary Turner   const bool in_scope_only = options.GetInScopeOnly();
963b9c1b51eSKate Stone   const bool include_runtime_support_values =
964b9c1b51eSKate Stone       options.GetIncludeRuntimeSupportValues();
96551f96eebSZachary Turner   const lldb::DynamicValueType use_dynamic = options.GetUseDynamic();
96651f96eebSZachary Turner 
967ceb6b139SCaroline Tice   if (log)
96841ae8e74SKuba Mracek     log->Printf(
96941ae8e74SKuba Mracek         "SBFrame::GetVariables (arguments=%i, recognized_arguments=%i, "
97041ae8e74SKuba Mracek         "locals=%i, statics=%i, in_scope_only=%i runtime=%i dynamic=%i)",
97141ae8e74SKuba Mracek         arguments, recognized_arguments, locals, statics, in_scope_only,
97251f96eebSZachary Turner         include_runtime_support_values, use_dynamic);
973ceb6b139SCaroline Tice 
974349213f9SGreg Clayton   std::set<VariableSP> variable_set;
9757730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
976b9c1b51eSKate Stone   if (target && process) {
9777fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
978b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
9797730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
980b9c1b51eSKate Stone       if (frame) {
98130fdc8d8SChris Lattner         size_t i;
982dbb0abbfSEugene Zelenko         VariableList *variable_list = nullptr;
983d9e416c0SGreg Clayton         variable_list = frame->GetVariableList(true);
984b9c1b51eSKate Stone         if (variable_list) {
98530fdc8d8SChris Lattner           const size_t num_variables = variable_list->GetSize();
986b9c1b51eSKate Stone           if (num_variables) {
987b9c1b51eSKate Stone             for (i = 0; i < num_variables; ++i) {
98830fdc8d8SChris Lattner               VariableSP variable_sp(variable_list->GetVariableAtIndex(i));
989b9c1b51eSKate Stone               if (variable_sp) {
99030fdc8d8SChris Lattner                 bool add_variable = false;
991b9c1b51eSKate Stone                 switch (variable_sp->GetScope()) {
99230fdc8d8SChris Lattner                 case eValueTypeVariableGlobal:
99330fdc8d8SChris Lattner                 case eValueTypeVariableStatic:
99463a27afaSGreg Clayton                 case eValueTypeVariableThreadLocal:
99530fdc8d8SChris Lattner                   add_variable = statics;
99630fdc8d8SChris Lattner                   break;
99730fdc8d8SChris Lattner 
99830fdc8d8SChris Lattner                 case eValueTypeVariableArgument:
99930fdc8d8SChris Lattner                   add_variable = arguments;
100030fdc8d8SChris Lattner                   break;
100130fdc8d8SChris Lattner 
100230fdc8d8SChris Lattner                 case eValueTypeVariableLocal:
100330fdc8d8SChris Lattner                   add_variable = locals;
100430fdc8d8SChris Lattner                   break;
1005c982c768SGreg Clayton 
1006c982c768SGreg Clayton                 default:
1007c982c768SGreg Clayton                   break;
100830fdc8d8SChris Lattner                 }
1009b9c1b51eSKate Stone                 if (add_variable) {
1010349213f9SGreg Clayton                   // Only add variables once so we don't end up with duplicates
1011349213f9SGreg Clayton                   if (variable_set.find(variable_sp) == variable_set.end())
1012349213f9SGreg Clayton                     variable_set.insert(variable_sp);
1013349213f9SGreg Clayton                   else
1014349213f9SGreg Clayton                     continue;
1015349213f9SGreg Clayton 
1016d9e416c0SGreg Clayton                   if (in_scope_only && !variable_sp->IsInScope(frame))
101730fdc8d8SChris Lattner                     continue;
101830fdc8d8SChris Lattner 
1019b9c1b51eSKate Stone                   ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable(
1020b9c1b51eSKate Stone                       variable_sp, eNoDynamicValues));
1021560558ebSEnrico Granata 
1022b9c1b51eSKate Stone                   if (!include_runtime_support_values && valobj_sp != nullptr &&
1023dbb0abbfSEugene Zelenko                       valobj_sp->IsRuntimeSupportValue())
1024560558ebSEnrico Granata                     continue;
1025560558ebSEnrico Granata 
1026e3e91517SEnrico Granata                   SBValue value_sb;
1027e3e91517SEnrico Granata                   value_sb.SetSP(valobj_sp, use_dynamic);
1028e3e91517SEnrico Granata                   value_list.Append(value_sb);
102930fdc8d8SChris Lattner                 }
103030fdc8d8SChris Lattner               }
103130fdc8d8SChris Lattner             }
103230fdc8d8SChris Lattner           }
103330fdc8d8SChris Lattner         }
103441ae8e74SKuba Mracek         if (recognized_arguments) {
103541ae8e74SKuba Mracek           auto recognized_frame = frame->GetRecognizedFrame();
103641ae8e74SKuba Mracek           if (recognized_frame) {
103741ae8e74SKuba Mracek             ValueObjectListSP recognized_arg_list =
103841ae8e74SKuba Mracek                 recognized_frame->GetRecognizedArguments();
103941ae8e74SKuba Mracek             if (recognized_arg_list) {
104041ae8e74SKuba Mracek               for (auto &rec_value_sp : recognized_arg_list->GetObjects()) {
104141ae8e74SKuba Mracek                 SBValue value_sb;
104241ae8e74SKuba Mracek                 value_sb.SetSP(rec_value_sp, use_dynamic);
104341ae8e74SKuba Mracek                 value_list.Append(value_sb);
104441ae8e74SKuba Mracek               }
104541ae8e74SKuba Mracek             }
104641ae8e74SKuba Mracek           }
104741ae8e74SKuba Mracek         }
1048b9c1b51eSKate Stone       } else {
1049c9858e4dSGreg Clayton         if (log)
1050b9c1b51eSKate Stone           log->Printf("SBFrame::GetVariables () => error: could not "
1051b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
10527730b9a4SJim Ingham       }
1053b9c1b51eSKate Stone     } else {
10547730b9a4SJim Ingham       if (log)
10557730b9a4SJim Ingham         log->Printf("SBFrame::GetVariables () => error: process is running");
1056c9858e4dSGreg Clayton     }
10577fdf9ef1SGreg Clayton   }
1058ceb6b139SCaroline Tice 
1059ceb6b139SCaroline Tice   if (log)
1060324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetVariables (...) => SBValueList(%p)",
1061324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
1062324a1036SSaleem Abdulrasool                 static_cast<void *>(value_list.opaque_ptr()));
1063ceb6b139SCaroline Tice 
106430fdc8d8SChris Lattner   return value_list;
106530fdc8d8SChris Lattner }
106630fdc8d8SChris Lattner 
1067b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() {
10685160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1069ceb6b139SCaroline Tice 
107030fdc8d8SChris Lattner   SBValueList value_list;
1071bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1072bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
10734fc6cb9cSJim Ingham 
1074dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1075d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
10767730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1077b9c1b51eSKate Stone   if (target && process) {
10787fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1079b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
10807730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1081b9c1b51eSKate Stone       if (frame) {
1082d9e416c0SGreg Clayton         RegisterContextSP reg_ctx(frame->GetRegisterContext());
1083b9c1b51eSKate Stone         if (reg_ctx) {
108430fdc8d8SChris Lattner           const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
1085b9c1b51eSKate Stone           for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
1086b9c1b51eSKate Stone             value_list.Append(
1087b9c1b51eSKate Stone                 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx));
108830fdc8d8SChris Lattner           }
108930fdc8d8SChris Lattner         }
1090b9c1b51eSKate Stone       } else {
1091c9858e4dSGreg Clayton         if (log)
1092b9c1b51eSKate Stone           log->Printf("SBFrame::GetRegisters () => error: could not "
1093b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
10947730b9a4SJim Ingham       }
1095b9c1b51eSKate Stone     } else {
10967730b9a4SJim Ingham       if (log)
10977730b9a4SJim Ingham         log->Printf("SBFrame::GetRegisters () => error: process is running");
1098c9858e4dSGreg Clayton     }
10997fdf9ef1SGreg Clayton   }
1100ceb6b139SCaroline Tice 
1101ceb6b139SCaroline Tice   if (log)
1102324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetRegisters () => SBValueList(%p)",
1103324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
1104324a1036SSaleem Abdulrasool                 static_cast<void *>(value_list.opaque_ptr()));
1105ceb6b139SCaroline Tice 
110630fdc8d8SChris Lattner   return value_list;
110730fdc8d8SChris Lattner }
110830fdc8d8SChris Lattner 
1109b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) {
1110ad9a53c5SJason Molenda   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1111ad9a53c5SJason Molenda 
1112ad9a53c5SJason Molenda   SBValue result;
1113ad9a53c5SJason Molenda   ValueObjectSP value_sp;
1114bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1115bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1116ad9a53c5SJason Molenda 
1117dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1118ad9a53c5SJason Molenda   Target *target = exe_ctx.GetTargetPtr();
1119ad9a53c5SJason Molenda   Process *process = exe_ctx.GetProcessPtr();
1120b9c1b51eSKate Stone   if (target && process) {
1121ad9a53c5SJason Molenda     Process::StopLocker stop_locker;
1122b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1123ad9a53c5SJason Molenda       frame = exe_ctx.GetFramePtr();
1124b9c1b51eSKate Stone       if (frame) {
1125ad9a53c5SJason Molenda         RegisterContextSP reg_ctx(frame->GetRegisterContext());
1126b9c1b51eSKate Stone         if (reg_ctx) {
1127ad9a53c5SJason Molenda           const uint32_t num_regs = reg_ctx->GetRegisterCount();
1128b9c1b51eSKate Stone           for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) {
1129b9c1b51eSKate Stone             const RegisterInfo *reg_info =
1130b9c1b51eSKate Stone                 reg_ctx->GetRegisterInfoAtIndex(reg_idx);
1131ad9a53c5SJason Molenda             if (reg_info &&
1132ad9a53c5SJason Molenda                 ((reg_info->name && strcasecmp(reg_info->name, name) == 0) ||
1133b9c1b51eSKate Stone                  (reg_info->alt_name &&
1134b9c1b51eSKate Stone                   strcasecmp(reg_info->alt_name, name) == 0))) {
1135ad9a53c5SJason Molenda               value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx);
1136ad9a53c5SJason Molenda               result.SetSP(value_sp);
1137ad9a53c5SJason Molenda               break;
1138ad9a53c5SJason Molenda             }
1139ad9a53c5SJason Molenda           }
1140ad9a53c5SJason Molenda         }
1141b9c1b51eSKate Stone       } else {
1142ad9a53c5SJason Molenda         if (log)
1143b9c1b51eSKate Stone           log->Printf("SBFrame::FindRegister () => error: could not "
1144b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
1145ad9a53c5SJason Molenda       }
1146b9c1b51eSKate Stone     } else {
1147ad9a53c5SJason Molenda       if (log)
11485d353842SJason Molenda         log->Printf("SBFrame::FindRegister () => error: process is running");
1149ad9a53c5SJason Molenda     }
1150ad9a53c5SJason Molenda   }
1151ad9a53c5SJason Molenda 
1152ad9a53c5SJason Molenda   if (log)
1153324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::FindRegister () => SBValue(%p)",
1154324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
1155324a1036SSaleem Abdulrasool                 static_cast<void *>(value_sp.get()));
1156ad9a53c5SJason Molenda 
1157ad9a53c5SJason Molenda   return result;
1158ad9a53c5SJason Molenda }
1159ad9a53c5SJason Molenda 
1160b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) {
11615160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1162da7bc7d0SGreg Clayton   Stream &strm = description.ref();
1163da7bc7d0SGreg Clayton 
1164bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1165bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
11664fc6cb9cSJim Ingham 
1167b57e4a1bSJason Molenda   StackFrame *frame;
1168d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
11697730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1170b9c1b51eSKate Stone   if (target && process) {
11717fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1172b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
11737730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1174b9c1b51eSKate Stone       if (frame) {
1175d9e416c0SGreg Clayton         frame->DumpUsingSettingsFormat(&strm);
1176b9c1b51eSKate Stone       } else {
1177c9858e4dSGreg Clayton         if (log)
1178b9c1b51eSKate Stone           log->Printf("SBFrame::GetDescription () => error: could not "
1179b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
11807730b9a4SJim Ingham       }
1181b9c1b51eSKate Stone     } else {
11827730b9a4SJim Ingham       if (log)
11837730b9a4SJim Ingham         log->Printf("SBFrame::GetDescription () => error: process is running");
1184c9858e4dSGreg Clayton     }
1185c9858e4dSGreg Clayton 
1186b9c1b51eSKate Stone   } else
1187da7bc7d0SGreg Clayton     strm.PutCString("No value");
1188dde9cff3SCaroline Tice 
1189dde9cff3SCaroline Tice   return true;
1190dde9cff3SCaroline Tice }
11911d3afba3SGreg Clayton 
1192b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) {
1193316d498bSGreg Clayton   SBValue result;
1194c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1195c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1196c481c7eeSJim Ingham 
1197b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
1198d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1199b9c1b51eSKate Stone   if (frame && target) {
120035e1bda6SJim Ingham     SBExpressionOptions options;
1201b9c1b51eSKate Stone     lldb::DynamicValueType fetch_dynamic_value =
1202b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
1203cced1566SGreg Clayton     options.SetFetchDynamicValue(fetch_dynamic_value);
120435e1bda6SJim Ingham     options.SetUnwindOnError(true);
120524785bd0SEugene Leviant     options.SetIgnoreBreakpoints(true);
1206998c8a1cSRyan Brown     if (target->GetLanguage() != eLanguageTypeUnknown)
1207998c8a1cSRyan Brown       options.SetLanguage(target->GetLanguage());
1208998c8a1cSRyan Brown     else
1209998c8a1cSRyan Brown       options.SetLanguage(frame->GetLanguage());
121035e1bda6SJim Ingham     return EvaluateExpression(expr, options);
1211316d498bSGreg Clayton   }
1212316d498bSGreg Clayton   return result;
121378a685aaSJim Ingham }
121478a685aaSJim Ingham 
121578a685aaSJim Ingham SBValue
1216b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr,
1217b9c1b51eSKate Stone                             lldb::DynamicValueType fetch_dynamic_value) {
121835e1bda6SJim Ingham   SBExpressionOptions options;
1219cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
122035e1bda6SJim Ingham   options.SetUnwindOnError(true);
122124785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1222c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1223c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1224c481c7eeSJim Ingham 
1225998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1226998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1227998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1228998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1229998c8a1cSRyan Brown   else if (frame)
1230998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
123135e1bda6SJim Ingham   return EvaluateExpression(expr, options);
12327ba6e991SJim Ingham }
12337ba6e991SJim Ingham 
1234b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr,
1235b9c1b51eSKate Stone                                     lldb::DynamicValueType fetch_dynamic_value,
1236b9c1b51eSKate Stone                                     bool unwind_on_error) {
123735e1bda6SJim Ingham   SBExpressionOptions options;
1238c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1239c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1240c481c7eeSJim Ingham 
1241cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
124235e1bda6SJim Ingham   options.SetUnwindOnError(unwind_on_error);
124324785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1244998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1245998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1246998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1247998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1248998c8a1cSRyan Brown   else if (frame)
1249998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
125035e1bda6SJim Ingham   return EvaluateExpression(expr, options);
125135e1bda6SJim Ingham }
125235e1bda6SJim Ingham 
1253b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr,
1254b9c1b51eSKate Stone                                           const SBExpressionOptions &options) {
12555160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
12564838131bSGreg Clayton 
1257358efd65SSaleem Abdulrasool #ifndef LLDB_DISABLE_PYTHON
12585160ce5cSGreg Clayton   Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1259358efd65SSaleem Abdulrasool #endif
1260a162ebafSSean Callanan 
12618646d3c1SJim Ingham   ExpressionResults exe_results = eExpressionSetupError;
126269b582faSGreg Clayton   SBValue expr_result;
12637730b9a4SJim Ingham 
1264b9c1b51eSKate Stone   if (expr == nullptr || expr[0] == '\0') {
12657730b9a4SJim Ingham     if (log)
1266b9c1b51eSKate Stone       log->Printf(
1267b9c1b51eSKate Stone           "SBFrame::EvaluateExpression called with an empty expression");
12687730b9a4SJim Ingham     return expr_result;
12697730b9a4SJim Ingham   }
12707730b9a4SJim Ingham 
127181e871edSGreg Clayton   ValueObjectSP expr_value_sp;
12724838131bSGreg Clayton 
1273bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1274bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
12754fc6cb9cSJim Ingham 
1276b9556accSGreg Clayton   if (log)
12777730b9a4SJim Ingham     log->Printf("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr);
1278b9556accSGreg Clayton 
1279dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
12807730b9a4SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
12817730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
12827730b9a4SJim Ingham 
1283b9c1b51eSKate Stone   if (target && process) {
12847fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1285b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
12867730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1287b9c1b51eSKate Stone       if (frame) {
12888f7db52dSJim Ingham         std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace;
1289b9c1b51eSKate Stone         if (target->GetDisplayExpressionsInCrashlogs()) {
12901ba7c4d0SGreg Clayton           StreamString frame_description;
1291d9e416c0SGreg Clayton           frame->DumpUsingSettingsFormat(&frame_description);
12928f7db52dSJim Ingham           stack_trace = llvm::make_unique<llvm::PrettyStackTraceFormat>(
1293b9c1b51eSKate Stone               "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value "
1294b9c1b51eSKate Stone               "= %u) %s",
1295b9c1b51eSKate Stone               expr, options.GetFetchDynamicValue(),
1296c156427dSZachary Turner               frame_description.GetData());
1297fb6621efSGreg Clayton         }
1298fb6621efSGreg Clayton 
1299b9c1b51eSKate Stone         exe_results = target->EvaluateExpression(expr, frame, expr_value_sp,
130035e1bda6SJim Ingham                                                  options.ref());
1301e3e91517SEnrico Granata         expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
1302b9c1b51eSKate Stone       } else {
1303c9858e4dSGreg Clayton         if (log)
1304b9c1b51eSKate Stone           log->Printf("SBFrame::EvaluateExpression () => error: could not "
1305b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
13067730b9a4SJim Ingham       }
1307b9c1b51eSKate Stone     } else {
13087730b9a4SJim Ingham       if (log)
1309b9c1b51eSKate Stone         log->Printf(
1310b9c1b51eSKate Stone             "SBFrame::EvaluateExpression () => error: process is running");
1311c9858e4dSGreg Clayton     }
13127fdf9ef1SGreg Clayton   }
13134838131bSGreg Clayton 
1314cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1315a162ebafSSean Callanan   if (expr_log)
1316b9c1b51eSKate Stone     expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is "
1317b9c1b51eSKate Stone                      "%s, summary %s **",
1318324a1036SSaleem Abdulrasool                      expr_result.GetValue(), expr_result.GetSummary());
1319a162ebafSSean Callanan 
13204838131bSGreg Clayton   if (log)
1321b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) "
1322b9c1b51eSKate Stone                 "(execution result=%d)",
1323324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), expr,
1324324a1036SSaleem Abdulrasool                 static_cast<void *>(expr_value_sp.get()), exe_results);
1325cf7e2dc0SJason Molenda #endif
13264838131bSGreg Clayton 
1327cfd1acedSGreg Clayton   return expr_result;
13281d3afba3SGreg Clayton }
1329316d498bSGreg Clayton 
1330b9c1b51eSKate Stone bool SBFrame::IsInlined() {
133105f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->IsInlined();
133205f75e9fSOleksiy Vyalov }
133305f75e9fSOleksiy Vyalov 
1334b9c1b51eSKate Stone bool SBFrame::IsInlined() const {
13355160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1336c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1337c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1338c481c7eeSJim Ingham 
1339dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1340d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
13417730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1342b9c1b51eSKate Stone   if (target && process) {
13437fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1344b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
13457730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1346b9c1b51eSKate Stone       if (frame) {
13477fdf9ef1SGreg Clayton 
1348d9e416c0SGreg Clayton         Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1349316d498bSGreg Clayton         if (block)
1350dbb0abbfSEugene Zelenko           return block->GetContainingInlinedBlock() != nullptr;
1351b9c1b51eSKate Stone       } else {
1352c9858e4dSGreg Clayton         if (log)
1353b9c1b51eSKate Stone           log->Printf("SBFrame::IsInlined () => error: could not reconstruct "
1354b9c1b51eSKate Stone                       "frame object for this SBFrame.");
13557730b9a4SJim Ingham       }
1356b9c1b51eSKate Stone     } else {
13577730b9a4SJim Ingham       if (log)
13587730b9a4SJim Ingham         log->Printf("SBFrame::IsInlined () => error: process is running");
1359c9858e4dSGreg Clayton     }
13607fdf9ef1SGreg Clayton   }
1361316d498bSGreg Clayton   return false;
1362316d498bSGreg Clayton }
1363316d498bSGreg Clayton 
13644b36f791SVedant Kumar bool SBFrame::IsArtificial() {
13654b36f791SVedant Kumar   return static_cast<const SBFrame *>(this)->IsArtificial();
13664b36f791SVedant Kumar }
13674b36f791SVedant Kumar 
13684b36f791SVedant Kumar bool SBFrame::IsArtificial() const {
13694b36f791SVedant Kumar   std::unique_lock<std::recursive_mutex> lock;
13704b36f791SVedant Kumar   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
13714b36f791SVedant Kumar 
13724b36f791SVedant Kumar   StackFrame *frame = exe_ctx.GetFramePtr();
13734b36f791SVedant Kumar   if (frame)
13744b36f791SVedant Kumar     return frame->IsArtificial();
13754b36f791SVedant Kumar 
13764b36f791SVedant Kumar   return false;
13774b36f791SVedant Kumar }
13784b36f791SVedant Kumar 
1379b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() {
138005f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->GetFunctionName();
138105f75e9fSOleksiy Vyalov }
138205f75e9fSOleksiy Vyalov 
1383bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const {
1384bdbdd229SJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1385bdbdd229SJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1386bdbdd229SJim Ingham 
1387bdbdd229SJim Ingham   StackFrame *frame = nullptr;
1388bdbdd229SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
1389bdbdd229SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1390bdbdd229SJim Ingham   if (target && process) {
1391bdbdd229SJim Ingham     Process::StopLocker stop_locker;
1392bdbdd229SJim Ingham     if (stop_locker.TryLock(&process->GetRunLock())) {
1393bdbdd229SJim Ingham       frame = exe_ctx.GetFramePtr();
1394bdbdd229SJim Ingham       if (frame) {
1395bdbdd229SJim Ingham         return frame->GuessLanguage();
1396bdbdd229SJim Ingham       }
1397bdbdd229SJim Ingham     }
1398bdbdd229SJim Ingham   }
1399bdbdd229SJim Ingham   return eLanguageTypeUnknown;
1400bdbdd229SJim Ingham }
1401bdbdd229SJim Ingham 
1402b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const {
14035160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1404dbb0abbfSEugene Zelenko   const char *name = nullptr;
1405c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1406c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1407c481c7eeSJim Ingham 
1408dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1409d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
14107730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1411b9c1b51eSKate Stone   if (target && process) {
14127fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1413b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
14147730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1415b9c1b51eSKate Stone       if (frame) {
1416b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1417b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1418b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1419b9c1b51eSKate Stone         if (sc.block) {
1420316d498bSGreg Clayton           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1421b9c1b51eSKate Stone           if (inlined_block) {
1422b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1423b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
1424b9c1b51eSKate Stone             name =
1425b9c1b51eSKate Stone                 inlined_info->GetName(sc.function->GetLanguage()).AsCString();
1426316d498bSGreg Clayton           }
1427316d498bSGreg Clayton         }
1428316d498bSGreg Clayton 
1429b9c1b51eSKate Stone         if (name == nullptr) {
1430316d498bSGreg Clayton           if (sc.function)
1431316d498bSGreg Clayton             name = sc.function->GetName().GetCString();
1432316d498bSGreg Clayton         }
1433316d498bSGreg Clayton 
1434b9c1b51eSKate Stone         if (name == nullptr) {
1435316d498bSGreg Clayton           if (sc.symbol)
1436316d498bSGreg Clayton             name = sc.symbol->GetName().GetCString();
1437316d498bSGreg Clayton         }
1438b9c1b51eSKate Stone       } else {
1439c9858e4dSGreg Clayton         if (log)
1440b9c1b51eSKate Stone           log->Printf("SBFrame::GetFunctionName () => error: could not "
1441b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
14427730b9a4SJim Ingham       }
1443b9c1b51eSKate Stone     } else {
14447730b9a4SJim Ingham       if (log)
14457730b9a4SJim Ingham         log->Printf("SBFrame::GetFunctionName() => error: process is running");
1446c9858e4dSGreg Clayton     }
14477fdf9ef1SGreg Clayton   }
1448316d498bSGreg Clayton   return name;
1449316d498bSGreg Clayton }
1450c1f705c2SEnrico Granata 
1451b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() {
1452c1f705c2SEnrico Granata   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1453dbb0abbfSEugene Zelenko   const char *name = nullptr;
1454c481c7eeSJim Ingham 
1455c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1456c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1457c481c7eeSJim Ingham 
1458dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1459c1f705c2SEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
1460c1f705c2SEnrico Granata   Process *process = exe_ctx.GetProcessPtr();
1461b9c1b51eSKate Stone   if (target && process) {
1462c1f705c2SEnrico Granata     Process::StopLocker stop_locker;
1463b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1464c1f705c2SEnrico Granata       frame = exe_ctx.GetFramePtr();
1465b9c1b51eSKate Stone       if (frame) {
1466b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1467b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1468b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1469b9c1b51eSKate Stone         if (sc.block) {
1470c1f705c2SEnrico Granata           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1471b9c1b51eSKate Stone           if (inlined_block) {
1472b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1473b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
1474b9c1b51eSKate Stone             name = inlined_info->GetDisplayName(sc.function->GetLanguage())
1475b9c1b51eSKate Stone                        .AsCString();
1476c1f705c2SEnrico Granata           }
1477c1f705c2SEnrico Granata         }
1478c1f705c2SEnrico Granata 
1479b9c1b51eSKate Stone         if (name == nullptr) {
1480c1f705c2SEnrico Granata           if (sc.function)
1481c1f705c2SEnrico Granata             name = sc.function->GetDisplayName().GetCString();
1482c1f705c2SEnrico Granata         }
1483c1f705c2SEnrico Granata 
1484b9c1b51eSKate Stone         if (name == nullptr) {
1485c1f705c2SEnrico Granata           if (sc.symbol)
1486c1f705c2SEnrico Granata             name = sc.symbol->GetDisplayName().GetCString();
1487c1f705c2SEnrico Granata         }
1488b9c1b51eSKate Stone       } else {
1489c1f705c2SEnrico Granata         if (log)
1490b9c1b51eSKate Stone           log->Printf("SBFrame::GetDisplayFunctionName () => error: could not "
1491b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
1492c1f705c2SEnrico Granata       }
1493b9c1b51eSKate Stone     } else {
1494c1f705c2SEnrico Granata       if (log)
1495b9c1b51eSKate Stone         log->Printf(
1496b9c1b51eSKate Stone             "SBFrame::GetDisplayFunctionName() => error: process is running");
1497c1f705c2SEnrico Granata     }
1498c1f705c2SEnrico Granata   }
1499c1f705c2SEnrico Granata   return name;
1500c1f705c2SEnrico Granata }
1501