130fdc8d8SChris Lattner //===-- SBFrame.cpp ---------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
10dbb0abbfSEugene Zelenko // C Includes
11dbb0abbfSEugene Zelenko // C++ Includes
1230fdc8d8SChris Lattner #include <algorithm>
13349213f9SGreg Clayton #include <set>
14dbb0abbfSEugene Zelenko #include <string>
15dbb0abbfSEugene Zelenko 
16dbb0abbfSEugene Zelenko // Other libraries and framework includes
17dbb0abbfSEugene Zelenko // Project includes
18dbb0abbfSEugene Zelenko #include "lldb/API/SBFrame.h"
1930fdc8d8SChris Lattner 
2030fdc8d8SChris Lattner #include "lldb/lldb-types.h"
2130fdc8d8SChris Lattner 
22b9c1b51eSKate Stone #include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h"
2330fdc8d8SChris Lattner #include "lldb/Core/Address.h"
2430fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2530fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h"
2630fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h"
27151c032cSJim Ingham #include "lldb/Expression/UserExpression.h"
281ba7c4d0SGreg Clayton #include "lldb/Host/Host.h"
2930fdc8d8SChris Lattner #include "lldb/Symbol/Block.h"
301f746071SGreg Clayton #include "lldb/Symbol/Function.h"
311f746071SGreg Clayton #include "lldb/Symbol/Symbol.h"
3230fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h"
3330fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h"
34b9c1b51eSKate Stone #include "lldb/Symbol/VariableList.h"
3530fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h"
3630fdc8d8SChris Lattner #include "lldb/Target/Process.h"
3730fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
38b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h"
39b9556accSGreg Clayton #include "lldb/Target/StackID.h"
40b9c1b51eSKate Stone #include "lldb/Target/Target.h"
4130fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
42bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h"
436f9e6901SZachary Turner #include "lldb/Utility/Log.h"
44bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
4530fdc8d8SChris Lattner 
464c5de699SEli Friedman #include "lldb/API/SBAddress.h"
47b9c1b51eSKate Stone #include "lldb/API/SBDebugger.h"
4835e1bda6SJim Ingham #include "lldb/API/SBExpressionOptions.h"
49dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
504c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h"
514c5de699SEli Friedman #include "lldb/API/SBThread.h"
52b9c1b51eSKate Stone #include "lldb/API/SBValue.h"
5351f96eebSZachary Turner #include "lldb/API/SBVariablesOptions.h"
5430fdc8d8SChris Lattner 
55237c3ed9SSean Callanan #include "llvm/Support/PrettyStackTrace.h"
56237c3ed9SSean Callanan 
5730fdc8d8SChris Lattner using namespace lldb;
5830fdc8d8SChris Lattner using namespace lldb_private;
5930fdc8d8SChris Lattner 
60b9c1b51eSKate Stone SBFrame::SBFrame() : m_opaque_sp(new ExecutionContextRef()) {}
6130fdc8d8SChris Lattner 
62b9c1b51eSKate Stone SBFrame::SBFrame(const StackFrameSP &lldb_object_sp)
63b9c1b51eSKate Stone     : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) {
645160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
65ceb6b139SCaroline Tice 
66b9c1b51eSKate Stone   if (log) {
67ceb6b139SCaroline Tice     SBStream sstr;
68ceb6b139SCaroline Tice     GetDescription(sstr);
694838131bSGreg Clayton     log->Printf("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s",
70324a1036SSaleem Abdulrasool                 static_cast<void *>(lldb_object_sp.get()),
71324a1036SSaleem Abdulrasool                 static_cast<void *>(lldb_object_sp.get()), sstr.GetData());
72ceb6b139SCaroline Tice   }
7330fdc8d8SChris Lattner }
7430fdc8d8SChris Lattner 
75b9c1b51eSKate Stone SBFrame::SBFrame(const SBFrame &rhs)
76b9c1b51eSKate Stone     : m_opaque_sp(new ExecutionContextRef(*rhs.m_opaque_sp)) {}
77efabb123SGreg Clayton 
78dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default;
79dbb0abbfSEugene Zelenko 
80b9c1b51eSKate Stone const SBFrame &SBFrame::operator=(const SBFrame &rhs) {
81efabb123SGreg Clayton   if (this != &rhs)
827fdf9ef1SGreg Clayton     *m_opaque_sp = *rhs.m_opaque_sp;
83efabb123SGreg Clayton   return *this;
84efabb123SGreg Clayton }
85efabb123SGreg Clayton 
86b9c1b51eSKate Stone StackFrameSP SBFrame::GetFrameSP() const {
87dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetFrameSP() : StackFrameSP());
88b9556accSGreg Clayton }
8930fdc8d8SChris Lattner 
90b9c1b51eSKate Stone void SBFrame::SetFrameSP(const StackFrameSP &lldb_object_sp) {
917fdf9ef1SGreg Clayton   return m_opaque_sp->SetFrameSP(lldb_object_sp);
92b9556accSGreg Clayton }
9330fdc8d8SChris Lattner 
94b9c1b51eSKate Stone bool SBFrame::IsValid() const {
95bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
96bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
977fa7dc36SJim Ingham 
987fa7dc36SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
997fa7dc36SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
100b9c1b51eSKate Stone   if (target && process) {
1017fa7dc36SJim Ingham     Process::StopLocker stop_locker;
1027fa7dc36SJim Ingham     if (stop_locker.TryLock(&process->GetRunLock()))
103dbb0abbfSEugene Zelenko       return GetFrameSP().get() != nullptr;
10430fdc8d8SChris Lattner   }
10530fdc8d8SChris Lattner 
1067fa7dc36SJim Ingham   // Without a target & process we can't have a valid stack frame.
1077fa7dc36SJim Ingham   return false;
1087fa7dc36SJim Ingham }
1097fa7dc36SJim Ingham 
110b9c1b51eSKate Stone SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const {
1115160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
11230fdc8d8SChris Lattner   SBSymbolContext sb_sym_ctx;
113bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
114bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1154fc6cb9cSJim Ingham 
116dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
117d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1187730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
119b9c1b51eSKate Stone   if (target && process) {
1207fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
121b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1227730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
123b9c1b51eSKate Stone       if (frame) {
124d9e416c0SGreg Clayton         sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext(resolve_scope));
125b9c1b51eSKate Stone       } else {
126c9858e4dSGreg Clayton         if (log)
127b9c1b51eSKate Stone           log->Printf("SBFrame::GetVariables () => error: could not "
128b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
1297730b9a4SJim Ingham       }
130b9c1b51eSKate Stone     } else {
1317730b9a4SJim Ingham       if (log)
132b9c1b51eSKate Stone         log->Printf(
133b9c1b51eSKate Stone             "SBFrame::GetSymbolContext () => error: process is running");
134c9858e4dSGreg Clayton     }
1357fdf9ef1SGreg Clayton   }
136ceb6b139SCaroline Tice 
137ceb6b139SCaroline Tice   if (log)
138b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => "
139b9c1b51eSKate Stone                 "SBSymbolContext(%p)",
140324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), resolve_scope,
141324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_sym_ctx.get()));
142ceb6b139SCaroline Tice 
14330fdc8d8SChris Lattner   return sb_sym_ctx;
14430fdc8d8SChris Lattner }
14530fdc8d8SChris Lattner 
146b9c1b51eSKate Stone SBModule SBFrame::GetModule() const {
1475160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
14872eff18aSGreg Clayton   SBModule sb_module;
149acdbe816SGreg Clayton   ModuleSP module_sp;
150bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
151bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1524fc6cb9cSJim Ingham 
153dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
154d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1557730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
156b9c1b51eSKate Stone   if (target && process) {
1577fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
158b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1597730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
160b9c1b51eSKate Stone       if (frame) {
161d9e416c0SGreg Clayton         module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp;
162acdbe816SGreg Clayton         sb_module.SetSP(module_sp);
163b9c1b51eSKate Stone       } else {
164c9858e4dSGreg Clayton         if (log)
165b9c1b51eSKate Stone           log->Printf("SBFrame::GetModule () => error: could not reconstruct "
166b9c1b51eSKate Stone                       "frame object for this SBFrame.");
1677730b9a4SJim Ingham       }
168b9c1b51eSKate Stone     } else {
1697730b9a4SJim Ingham       if (log)
1707730b9a4SJim Ingham         log->Printf("SBFrame::GetModule () => error: process is running");
171c9858e4dSGreg Clayton     }
1727fdf9ef1SGreg Clayton   }
17372eff18aSGreg Clayton 
1744838131bSGreg Clayton   if (log)
1754838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetModule () => SBModule(%p)",
176324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
177324a1036SSaleem Abdulrasool                 static_cast<void *>(module_sp.get()));
1784838131bSGreg Clayton 
17930fdc8d8SChris Lattner   return sb_module;
18030fdc8d8SChris Lattner }
18130fdc8d8SChris Lattner 
182b9c1b51eSKate Stone SBCompileUnit SBFrame::GetCompileUnit() const {
1835160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
18472eff18aSGreg Clayton   SBCompileUnit sb_comp_unit;
185bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
186bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1874fc6cb9cSJim Ingham 
188dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
189d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1907730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
191b9c1b51eSKate Stone   if (target && process) {
1927fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
193b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1947730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
195b9c1b51eSKate Stone       if (frame) {
196b9c1b51eSKate Stone         sb_comp_unit.reset(
197b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit);
198b9c1b51eSKate Stone       } else {
199ceb6b139SCaroline Tice         if (log)
200b9c1b51eSKate Stone           log->Printf("SBFrame::GetCompileUnit () => error: could not "
201b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
2027730b9a4SJim Ingham       }
203b9c1b51eSKate Stone     } else {
2047730b9a4SJim Ingham       if (log)
2057730b9a4SJim Ingham         log->Printf("SBFrame::GetCompileUnit () => error: process is running");
206c9858e4dSGreg Clayton     }
207c9858e4dSGreg Clayton   }
208c9858e4dSGreg Clayton   if (log)
209c9858e4dSGreg Clayton     log->Printf("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)",
210324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
211324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_comp_unit.get()));
212ceb6b139SCaroline Tice 
21330fdc8d8SChris Lattner   return sb_comp_unit;
21430fdc8d8SChris Lattner }
21530fdc8d8SChris Lattner 
216b9c1b51eSKate Stone SBFunction SBFrame::GetFunction() const {
2175160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
21872eff18aSGreg Clayton   SBFunction sb_function;
219bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
220bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2214fc6cb9cSJim Ingham 
222dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
223d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2247730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
225b9c1b51eSKate Stone   if (target && process) {
2267fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
227b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2287730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
229b9c1b51eSKate Stone       if (frame) {
230b9c1b51eSKate Stone         sb_function.reset(
231b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextFunction).function);
232b9c1b51eSKate Stone       } else {
233c9858e4dSGreg Clayton         if (log)
234b9c1b51eSKate Stone           log->Printf("SBFrame::GetFunction () => error: could not reconstruct "
235b9c1b51eSKate Stone                       "frame object for this SBFrame.");
2367730b9a4SJim Ingham       }
237b9c1b51eSKate Stone     } else {
2387730b9a4SJim Ingham       if (log)
2397730b9a4SJim Ingham         log->Printf("SBFrame::GetFunction () => error: process is running");
2407fdf9ef1SGreg Clayton     }
241c9858e4dSGreg Clayton   }
2424838131bSGreg Clayton   if (log)
2434838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetFunction () => SBFunction(%p)",
244324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
245324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_function.get()));
2464838131bSGreg Clayton 
24730fdc8d8SChris Lattner   return sb_function;
24830fdc8d8SChris Lattner }
24930fdc8d8SChris Lattner 
250b9c1b51eSKate Stone SBSymbol SBFrame::GetSymbol() const {
2515160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
25272eff18aSGreg Clayton   SBSymbol sb_symbol;
253bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
254bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2554fc6cb9cSJim Ingham 
256dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
257d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2587730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
259b9c1b51eSKate Stone   if (target && process) {
2607fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
261b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2627730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
263b9c1b51eSKate Stone       if (frame) {
264d9e416c0SGreg Clayton         sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol);
265b9c1b51eSKate Stone       } else {
266c9858e4dSGreg Clayton         if (log)
267b9c1b51eSKate Stone           log->Printf("SBFrame::GetSymbol () => error: could not reconstruct "
268b9c1b51eSKate Stone                       "frame object for this SBFrame.");
2697730b9a4SJim Ingham       }
270b9c1b51eSKate Stone     } else {
2717730b9a4SJim Ingham       if (log)
2727730b9a4SJim Ingham         log->Printf("SBFrame::GetSymbol () => error: process is running");
2737fdf9ef1SGreg Clayton     }
274c9858e4dSGreg Clayton   }
2754838131bSGreg Clayton   if (log)
2764838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetSymbol () => SBSymbol(%p)",
277324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
278324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_symbol.get()));
2793b06557eSGreg Clayton   return sb_symbol;
2803b06557eSGreg Clayton }
2813b06557eSGreg Clayton 
282b9c1b51eSKate Stone SBBlock SBFrame::GetBlock() const {
2835160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
28472eff18aSGreg Clayton   SBBlock sb_block;
285bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
286bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2874fc6cb9cSJim Ingham 
288dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
289d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
2907730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
291b9c1b51eSKate Stone   if (target && process) {
2927fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
293b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
2947730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
295b9c1b51eSKate Stone       if (frame) {
296d9e416c0SGreg Clayton         sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block);
297b9c1b51eSKate Stone       } else {
298c9858e4dSGreg Clayton         if (log)
299b9c1b51eSKate Stone           log->Printf("SBFrame::GetBlock () => error: could not reconstruct "
300b9c1b51eSKate Stone                       "frame object for this SBFrame.");
3017730b9a4SJim Ingham       }
302b9c1b51eSKate Stone     } else {
3037730b9a4SJim Ingham       if (log)
304324a1036SSaleem Abdulrasool         log->Printf("SBFrame(%p)::GetBlock () => error: process is running",
305324a1036SSaleem Abdulrasool                     static_cast<void *>(frame));
3067fdf9ef1SGreg Clayton     }
307c9858e4dSGreg Clayton   }
3084838131bSGreg Clayton   if (log)
3094838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetBlock () => SBBlock(%p)",
310324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
311324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_block.GetPtr()));
31230fdc8d8SChris Lattner   return sb_block;
31330fdc8d8SChris Lattner }
31430fdc8d8SChris Lattner 
315b9c1b51eSKate Stone SBBlock SBFrame::GetFrameBlock() const {
31672eff18aSGreg Clayton   SBBlock sb_block;
317bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
318bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3194fc6cb9cSJim Ingham 
320dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
321d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3225160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
3237730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
324b9c1b51eSKate Stone   if (target && process) {
3257fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
326b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3277730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
328b9c1b51eSKate Stone       if (frame) {
329d9e416c0SGreg Clayton         sb_block.SetPtr(frame->GetFrameBlock());
330b9c1b51eSKate Stone       } else {
331c9858e4dSGreg Clayton         if (log)
332b9c1b51eSKate Stone           log->Printf("SBFrame::GetFrameBlock () => error: could not "
333b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
3347730b9a4SJim Ingham       }
335b9c1b51eSKate Stone     } else {
3367730b9a4SJim Ingham       if (log)
3377730b9a4SJim Ingham         log->Printf("SBFrame::GetFrameBlock () => error: process is running");
3387fdf9ef1SGreg Clayton     }
339c9858e4dSGreg Clayton   }
3404838131bSGreg Clayton   if (log)
3414838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)",
342324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
343324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_block.GetPtr()));
34495897c6aSGreg Clayton   return sb_block;
34595897c6aSGreg Clayton }
34695897c6aSGreg Clayton 
347b9c1b51eSKate Stone SBLineEntry SBFrame::GetLineEntry() const {
3485160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
34972eff18aSGreg Clayton   SBLineEntry sb_line_entry;
350bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
351bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3524fc6cb9cSJim Ingham 
353dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
354d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
3557730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
356b9c1b51eSKate Stone   if (target && process) {
3577fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
358b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
3597730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
360b9c1b51eSKate Stone       if (frame) {
361b9c1b51eSKate Stone         sb_line_entry.SetLineEntry(
362b9c1b51eSKate Stone             frame->GetSymbolContext(eSymbolContextLineEntry).line_entry);
363b9c1b51eSKate Stone       } else {
364c9858e4dSGreg Clayton         if (log)
365b9c1b51eSKate Stone           log->Printf("SBFrame::GetLineEntry () => error: could not "
366b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
3677730b9a4SJim Ingham       }
368b9c1b51eSKate Stone     } else {
3697730b9a4SJim Ingham       if (log)
3707730b9a4SJim Ingham         log->Printf("SBFrame::GetLineEntry () => error: process is running");
3717fdf9ef1SGreg Clayton     }
372c9858e4dSGreg Clayton   }
3734838131bSGreg Clayton   if (log)
3744838131bSGreg Clayton     log->Printf("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)",
375324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
376324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_line_entry.get()));
37730fdc8d8SChris Lattner   return sb_line_entry;
37830fdc8d8SChris Lattner }
37930fdc8d8SChris Lattner 
380b9c1b51eSKate Stone uint32_t SBFrame::GetFrameID() const {
381b9556accSGreg Clayton   uint32_t frame_idx = UINT32_MAX;
382b9556accSGreg Clayton 
383c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
384c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
385c481c7eeSJim Ingham 
386b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
3877fdf9ef1SGreg Clayton   if (frame)
388d9e416c0SGreg Clayton     frame_idx = frame->GetFrameIndex();
3894838131bSGreg Clayton 
3905160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
3914838131bSGreg Clayton   if (log)
392b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::GetFrameID () => %u", static_cast<void *>(frame),
393b9c1b51eSKate Stone                 frame_idx);
3944838131bSGreg Clayton   return frame_idx;
39530fdc8d8SChris Lattner }
39630fdc8d8SChris Lattner 
397b9c1b51eSKate Stone lldb::addr_t SBFrame::GetCFA() const {
398c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
399c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
400c481c7eeSJim Ingham 
401424a5dbcSGreg Clayton   StackFrame *frame = exe_ctx.GetFramePtr();
402424a5dbcSGreg Clayton   if (frame)
403424a5dbcSGreg Clayton     return frame->GetStackID().GetCallFrameAddress();
404424a5dbcSGreg Clayton   return LLDB_INVALID_ADDRESS;
405424a5dbcSGreg Clayton }
406424a5dbcSGreg Clayton 
407b9c1b51eSKate Stone addr_t SBFrame::GetPC() const {
4085160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
40969b582faSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
410bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
411bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4124fc6cb9cSJim Ingham 
413dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
414d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4157730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
416b9c1b51eSKate Stone   if (target && process) {
4177fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
418b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4197730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
420b9c1b51eSKate Stone       if (frame) {
421b9c1b51eSKate Stone         addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress(
422b9c1b51eSKate Stone             target, eAddressClassCode);
423b9c1b51eSKate Stone       } else {
424c9858e4dSGreg Clayton         if (log)
425b9c1b51eSKate Stone           log->Printf("SBFrame::GetPC () => error: could not reconstruct frame "
426b9c1b51eSKate Stone                       "object for this SBFrame.");
4277730b9a4SJim Ingham       }
428b9c1b51eSKate Stone     } else {
4297730b9a4SJim Ingham       if (log)
4307730b9a4SJim Ingham         log->Printf("SBFrame::GetPC () => error: process is running");
431c9858e4dSGreg Clayton     }
4327fdf9ef1SGreg Clayton   }
433ceb6b139SCaroline Tice 
434ceb6b139SCaroline Tice   if (log)
435324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetPC () => 0x%" PRIx64,
436324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), addr);
437ceb6b139SCaroline Tice 
438ceb6b139SCaroline Tice   return addr;
43930fdc8d8SChris Lattner }
44030fdc8d8SChris Lattner 
441b9c1b51eSKate Stone bool SBFrame::SetPC(addr_t new_pc) {
4425160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
443ceb6b139SCaroline Tice   bool ret_val = false;
444bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
445bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4464fc6cb9cSJim Ingham 
447dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
448d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4497730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
450b9c1b51eSKate Stone   if (target && process) {
4517fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
452b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4537730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
454b9c1b51eSKate Stone       if (frame) {
455d9e416c0SGreg Clayton         ret_val = frame->GetRegisterContext()->SetPC(new_pc);
456b9c1b51eSKate Stone       } else {
457c9858e4dSGreg Clayton         if (log)
458b9c1b51eSKate Stone           log->Printf("SBFrame::SetPC () => error: could not reconstruct frame "
459b9c1b51eSKate Stone                       "object for this SBFrame.");
4607730b9a4SJim Ingham       }
461b9c1b51eSKate Stone     } else {
4627730b9a4SJim Ingham       if (log)
4637730b9a4SJim Ingham         log->Printf("SBFrame::SetPC () => error: process is running");
464c9858e4dSGreg Clayton     }
4657fdf9ef1SGreg Clayton   }
466ceb6b139SCaroline Tice 
467ceb6b139SCaroline Tice   if (log)
468d01b2953SDaniel Malea     log->Printf("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i",
469324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), new_pc, ret_val);
470ceb6b139SCaroline Tice 
471ceb6b139SCaroline Tice   return ret_val;
47230fdc8d8SChris Lattner }
47330fdc8d8SChris Lattner 
474b9c1b51eSKate Stone addr_t SBFrame::GetSP() const {
4755160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
4764838131bSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
477bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
478bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4794fc6cb9cSJim Ingham 
480dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
481d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
4827730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
483b9c1b51eSKate Stone   if (target && process) {
4847fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
485b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
4867730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
487b9c1b51eSKate Stone       if (frame) {
488d9e416c0SGreg Clayton         addr = frame->GetRegisterContext()->GetSP();
489b9c1b51eSKate Stone       } else {
490c9858e4dSGreg Clayton         if (log)
491b9c1b51eSKate Stone           log->Printf("SBFrame::GetSP () => error: could not reconstruct frame "
492b9c1b51eSKate Stone                       "object for this SBFrame.");
4937730b9a4SJim Ingham       }
494b9c1b51eSKate Stone     } else {
4957730b9a4SJim Ingham       if (log)
4967730b9a4SJim Ingham         log->Printf("SBFrame::GetSP () => error: process is running");
4977fdf9ef1SGreg Clayton     }
498c9858e4dSGreg Clayton   }
4994838131bSGreg Clayton   if (log)
500324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetSP () => 0x%" PRIx64,
501324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), addr);
5024838131bSGreg Clayton 
5034838131bSGreg Clayton   return addr;
50430fdc8d8SChris Lattner }
50530fdc8d8SChris Lattner 
506b9c1b51eSKate Stone addr_t SBFrame::GetFP() const {
5075160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
50869b582faSGreg Clayton   addr_t addr = LLDB_INVALID_ADDRESS;
509bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
510bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5114fc6cb9cSJim Ingham 
512dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
513d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5147730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
515b9c1b51eSKate Stone   if (target && process) {
5167fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
517b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5187730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
519b9c1b51eSKate Stone       if (frame) {
520d9e416c0SGreg Clayton         addr = frame->GetRegisterContext()->GetFP();
521b9c1b51eSKate Stone       } else {
522c9858e4dSGreg Clayton         if (log)
523b9c1b51eSKate Stone           log->Printf("SBFrame::GetFP () => error: could not reconstruct frame "
524b9c1b51eSKate Stone                       "object for this SBFrame.");
5257730b9a4SJim Ingham       }
526b9c1b51eSKate Stone     } else {
5277730b9a4SJim Ingham       if (log)
5287730b9a4SJim Ingham         log->Printf("SBFrame::GetFP () => error: process is running");
529c9858e4dSGreg Clayton     }
5307fdf9ef1SGreg Clayton   }
531ceb6b139SCaroline Tice 
532ceb6b139SCaroline Tice   if (log)
533324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetFP () => 0x%" PRIx64,
534324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), addr);
535ceb6b139SCaroline Tice   return addr;
53630fdc8d8SChris Lattner }
53730fdc8d8SChris Lattner 
538b9c1b51eSKate Stone SBAddress SBFrame::GetPCAddress() const {
5395160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
54030fdc8d8SChris Lattner   SBAddress sb_addr;
541bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
542bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5434fc6cb9cSJim Ingham 
544b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
545d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
5467730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
547b9c1b51eSKate Stone   if (target && process) {
5487fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
549b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
5507730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
551b9c1b51eSKate Stone       if (frame) {
552d9e416c0SGreg Clayton         sb_addr.SetAddress(&frame->GetFrameCodeAddress());
553b9c1b51eSKate Stone       } else {
554c9858e4dSGreg Clayton         if (log)
555b9c1b51eSKate Stone           log->Printf("SBFrame::GetPCAddress () => error: could not "
556b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
5577730b9a4SJim Ingham       }
558b9c1b51eSKate Stone     } else {
5597730b9a4SJim Ingham       if (log)
5607730b9a4SJim Ingham         log->Printf("SBFrame::GetPCAddress () => error: process is running");
5617fdf9ef1SGreg Clayton     }
562c9858e4dSGreg Clayton   }
5634838131bSGreg Clayton   if (log)
564324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetPCAddress () => SBAddress(%p)",
565b9c1b51eSKate Stone                 static_cast<void *>(frame), static_cast<void *>(sb_addr.get()));
56630fdc8d8SChris Lattner   return sb_addr;
56730fdc8d8SChris Lattner }
56830fdc8d8SChris Lattner 
569b9c1b51eSKate Stone void SBFrame::Clear() { m_opaque_sp->Clear(); }
57030fdc8d8SChris Lattner 
571b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) {
5727edbdfc9SGreg Clayton   SBValue sb_value;
573c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
574c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
575c481c7eeSJim Ingham 
576b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
577d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
578b9c1b51eSKate Stone   if (frame && target) {
579b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
580b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
5817edbdfc9SGreg Clayton     sb_value = GetValueForVariablePath(var_path, use_dynamic);
5827edbdfc9SGreg Clayton   }
5837edbdfc9SGreg Clayton   return sb_value;
5847edbdfc9SGreg Clayton }
5857edbdfc9SGreg Clayton 
586b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path,
587b9c1b51eSKate Stone                                                DynamicValueType use_dynamic) {
5887edbdfc9SGreg Clayton   SBValue sb_value;
5895160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
590b9c1b51eSKate Stone   if (var_path == nullptr || var_path[0] == '\0') {
5917730b9a4SJim Ingham     if (log)
592b9c1b51eSKate Stone       log->Printf(
593b9c1b51eSKate Stone           "SBFrame::GetValueForVariablePath called with empty variable path.");
5947730b9a4SJim Ingham     return sb_value;
5957730b9a4SJim Ingham   }
5967730b9a4SJim Ingham 
597bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
598bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5994fc6cb9cSJim Ingham 
600dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
601d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
6027730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
603b9c1b51eSKate Stone   if (target && process) {
6047fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
605b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
6067730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
607b9c1b51eSKate Stone       if (frame) {
6087edbdfc9SGreg Clayton         VariableSP var_sp;
6097edbdfc9SGreg Clayton         Error error;
610b9c1b51eSKate Stone         ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath(
611b9c1b51eSKate Stone             var_path, eNoDynamicValues,
612b9c1b51eSKate Stone             StackFrame::eExpressionPathOptionCheckPtrVsMember |
613b9c1b51eSKate Stone                 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
614b9c1b51eSKate Stone             var_sp, error));
615e3e91517SEnrico Granata         sb_value.SetSP(value_sp, use_dynamic);
616b9c1b51eSKate Stone       } else {
617c9858e4dSGreg Clayton         if (log)
618b9c1b51eSKate Stone           log->Printf("SBFrame::GetValueForVariablePath () => error: could not "
619b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
6207730b9a4SJim Ingham       }
621b9c1b51eSKate Stone     } else {
6227730b9a4SJim Ingham       if (log)
623b9c1b51eSKate Stone         log->Printf(
624b9c1b51eSKate Stone             "SBFrame::GetValueForVariablePath () => error: process is running");
625c9858e4dSGreg Clayton     }
6267fdf9ef1SGreg Clayton   }
6277edbdfc9SGreg Clayton   return sb_value;
6287edbdfc9SGreg Clayton }
6297edbdfc9SGreg Clayton 
630b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name) {
631316d498bSGreg Clayton   SBValue value;
632c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
633c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
634c481c7eeSJim Ingham 
635b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
636d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
637b9c1b51eSKate Stone   if (frame && target) {
638b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
639b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
640316d498bSGreg Clayton     value = FindVariable(name, use_dynamic);
641316d498bSGreg Clayton   }
642316d498bSGreg Clayton   return value;
64378a685aaSJim Ingham }
64478a685aaSJim Ingham 
645b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name,
646b9c1b51eSKate Stone                               lldb::DynamicValueType use_dynamic) {
6475160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
64869b582faSGreg Clayton   VariableSP var_sp;
64958b59f95SJim Ingham   SBValue sb_value;
6507730b9a4SJim Ingham 
651b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
6527730b9a4SJim Ingham     if (log)
6537730b9a4SJim Ingham       log->Printf("SBFrame::FindVariable called with empty name");
6547730b9a4SJim Ingham     return sb_value;
6557730b9a4SJim Ingham   }
6567730b9a4SJim Ingham 
65781e871edSGreg Clayton   ValueObjectSP value_sp;
658bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
659bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
6604fc6cb9cSJim Ingham 
661dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
662d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
6637730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
664b9c1b51eSKate Stone   if (target && process) {
6657fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
666b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
6677730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
668b9c1b51eSKate Stone       if (frame) {
66969b582faSGreg Clayton         VariableList variable_list;
670d9e416c0SGreg Clayton         SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock));
67130fdc8d8SChris Lattner 
672b9c1b51eSKate Stone         if (sc.block) {
67372eff18aSGreg Clayton           const bool can_create = true;
67472eff18aSGreg Clayton           const bool get_parent_variables = true;
67572eff18aSGreg Clayton           const bool stop_if_block_is_inlined_function = true;
67672eff18aSGreg Clayton 
677b9c1b51eSKate Stone           if (sc.block->AppendVariables(
678b9c1b51eSKate Stone                   can_create, get_parent_variables,
67972eff18aSGreg Clayton                   stop_if_block_is_inlined_function,
68072ac8a84STamas Berghammer                   [frame](Variable *v) { return v->IsInScope(frame); },
681b9c1b51eSKate Stone                   &variable_list)) {
68269b582faSGreg Clayton             var_sp = variable_list.FindVariable(ConstString(name));
68330fdc8d8SChris Lattner           }
68472eff18aSGreg Clayton         }
68530fdc8d8SChris Lattner 
686b9c1b51eSKate Stone         if (var_sp) {
687b9c1b51eSKate Stone           value_sp =
688b9c1b51eSKate Stone               frame->GetValueObjectForFrameVariable(var_sp, eNoDynamicValues);
689e3e91517SEnrico Granata           sb_value.SetSP(value_sp, use_dynamic);
69081e871edSGreg Clayton         }
691b9c1b51eSKate Stone       } else {
692c9858e4dSGreg Clayton         if (log)
693b9c1b51eSKate Stone           log->Printf("SBFrame::FindVariable () => error: could not "
694b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
6957730b9a4SJim Ingham       }
696b9c1b51eSKate Stone     } else {
6977730b9a4SJim Ingham       if (log)
6987730b9a4SJim Ingham         log->Printf("SBFrame::FindVariable () => error: process is running");
699c9858e4dSGreg Clayton     }
700316d498bSGreg Clayton   }
701316d498bSGreg Clayton 
7024838131bSGreg Clayton   if (log)
70369b582faSGreg Clayton     log->Printf("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
704324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), name,
705324a1036SSaleem Abdulrasool                 static_cast<void *>(value_sp.get()));
7064838131bSGreg Clayton 
707dde9cff3SCaroline Tice   return sb_value;
708dde9cff3SCaroline Tice }
709dde9cff3SCaroline Tice 
710b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) {
711316d498bSGreg Clayton   SBValue value;
712c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
713c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
714c481c7eeSJim Ingham 
715b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
716d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
717b9c1b51eSKate Stone   if (frame && target) {
718b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
719b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
720316d498bSGreg Clayton     value = FindValue(name, value_type, use_dynamic);
721316d498bSGreg Clayton   }
722316d498bSGreg Clayton   return value;
72378a685aaSJim Ingham }
72478a685aaSJim Ingham 
725b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type,
726b9c1b51eSKate Stone                            lldb::DynamicValueType use_dynamic) {
7275160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
72869b582faSGreg Clayton   SBValue sb_value;
7297730b9a4SJim Ingham 
730b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
7317730b9a4SJim Ingham     if (log)
7327730b9a4SJim Ingham       log->Printf("SBFrame::FindValue called with empty name.");
7337730b9a4SJim Ingham     return sb_value;
7347730b9a4SJim Ingham   }
7357730b9a4SJim Ingham 
73681e871edSGreg Clayton   ValueObjectSP value_sp;
737bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
738bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
7394fc6cb9cSJim Ingham 
740dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
741d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
7427730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
743b9c1b51eSKate Stone   if (target && process) {
7447fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
745b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
7467730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
747b9c1b51eSKate Stone       if (frame) {
7488a2a0dfbSEnrico Granata         VariableList variable_list;
7498a2a0dfbSEnrico Granata 
750b9c1b51eSKate Stone         switch (value_type) {
75169b582faSGreg Clayton         case eValueTypeVariableGlobal:      // global variable
75269b582faSGreg Clayton         case eValueTypeVariableStatic:      // static variable
75369b582faSGreg Clayton         case eValueTypeVariableArgument:    // function argument variables
75469b582faSGreg Clayton         case eValueTypeVariableLocal:       // function local variables
75563a27afaSGreg Clayton         case eValueTypeVariableThreadLocal: // thread local variables
75669b582faSGreg Clayton         {
757d9e416c0SGreg Clayton           SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock));
75872eff18aSGreg Clayton 
75972eff18aSGreg Clayton           const bool can_create = true;
76072eff18aSGreg Clayton           const bool get_parent_variables = true;
76172eff18aSGreg Clayton           const bool stop_if_block_is_inlined_function = true;
76272eff18aSGreg Clayton 
7630efb51a0SChaoren Lin           if (sc.block)
764b9c1b51eSKate Stone             sc.block->AppendVariables(
765b9c1b51eSKate Stone                 can_create, get_parent_variables,
766b9c1b51eSKate Stone                 stop_if_block_is_inlined_function,
767b9c1b51eSKate Stone                 [frame](Variable *v) { return v->IsInScope(frame); },
768b9c1b51eSKate Stone                 &variable_list);
769b9c1b51eSKate Stone           if (value_type == eValueTypeVariableGlobal) {
7708a2a0dfbSEnrico Granata             const bool get_file_globals = true;
7718a2a0dfbSEnrico Granata             VariableList *frame_vars = frame->GetVariableList(get_file_globals);
7728a2a0dfbSEnrico Granata             if (frame_vars)
7738a2a0dfbSEnrico Granata               frame_vars->AppendVariablesIfUnique(variable_list);
7748a2a0dfbSEnrico Granata           }
77569b582faSGreg Clayton           ConstString const_name(name);
776b9c1b51eSKate Stone           VariableSP variable_sp(
777b9c1b51eSKate Stone               variable_list.FindVariable(const_name, value_type));
778b9c1b51eSKate Stone           if (variable_sp) {
779b9c1b51eSKate Stone             value_sp = frame->GetValueObjectForFrameVariable(variable_sp,
780b9c1b51eSKate Stone                                                              eNoDynamicValues);
781e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
78230fdc8d8SChris Lattner           }
783b9c1b51eSKate Stone         } break;
78469b582faSGreg Clayton 
78569b582faSGreg Clayton         case eValueTypeRegister: // stack frame register value
78669b582faSGreg Clayton         {
787d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
788b9c1b51eSKate Stone           if (reg_ctx) {
78969b582faSGreg Clayton             const uint32_t num_regs = reg_ctx->GetRegisterCount();
790b9c1b51eSKate Stone             for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) {
791b9c1b51eSKate Stone               const RegisterInfo *reg_info =
792b9c1b51eSKate Stone                   reg_ctx->GetRegisterInfoAtIndex(reg_idx);
79369b582faSGreg Clayton               if (reg_info &&
79469b582faSGreg Clayton                   ((reg_info->name && strcasecmp(reg_info->name, name) == 0) ||
795b9c1b51eSKate Stone                    (reg_info->alt_name &&
796b9c1b51eSKate Stone                     strcasecmp(reg_info->alt_name, name) == 0))) {
797d9e416c0SGreg Clayton                 value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx);
79881e871edSGreg Clayton                 sb_value.SetSP(value_sp);
79981e871edSGreg Clayton                 break;
80069b582faSGreg Clayton               }
80169b582faSGreg Clayton             }
80269b582faSGreg Clayton           }
803b9c1b51eSKate Stone         } break;
80469b582faSGreg Clayton 
805b9c1b51eSKate Stone         case eValueTypeRegisterSet: // A collection of stack frame register
806b9c1b51eSKate Stone                                     // values
80769b582faSGreg Clayton         {
808d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
809b9c1b51eSKate Stone           if (reg_ctx) {
81069b582faSGreg Clayton             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
811b9c1b51eSKate Stone             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
81269b582faSGreg Clayton               const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx);
81369b582faSGreg Clayton               if (reg_set &&
81469b582faSGreg Clayton                   ((reg_set->name && strcasecmp(reg_set->name, name) == 0) ||
815b9c1b51eSKate Stone                    (reg_set->short_name &&
816b9c1b51eSKate Stone                     strcasecmp(reg_set->short_name, name) == 0))) {
817b9c1b51eSKate Stone                 value_sp =
818b9c1b51eSKate Stone                     ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx);
81981e871edSGreg Clayton                 sb_value.SetSP(value_sp);
82081e871edSGreg Clayton                 break;
82169b582faSGreg Clayton               }
82269b582faSGreg Clayton             }
82369b582faSGreg Clayton           }
824b9c1b51eSKate Stone         } break;
82569b582faSGreg Clayton 
82669b582faSGreg Clayton         case eValueTypeConstResult: // constant result variables
82769b582faSGreg Clayton         {
82869b582faSGreg Clayton           ConstString const_name(name);
829b9c1b51eSKate Stone           ExpressionVariableSP expr_var_sp(
830b9c1b51eSKate Stone               target->GetPersistentVariable(const_name));
831b9c1b51eSKate Stone           if (expr_var_sp) {
83281e871edSGreg Clayton             value_sp = expr_var_sp->GetValueObject();
833e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
83481e871edSGreg Clayton           }
835b9c1b51eSKate Stone         } break;
83669b582faSGreg Clayton 
83769b582faSGreg Clayton         default:
83869b582faSGreg Clayton           break;
83969b582faSGreg Clayton         }
840b9c1b51eSKate Stone       } else {
841c9858e4dSGreg Clayton         if (log)
842b9c1b51eSKate Stone           log->Printf("SBFrame::FindValue () => error: could not reconstruct "
843b9c1b51eSKate Stone                       "frame object for this SBFrame.");
8447730b9a4SJim Ingham       }
845b9c1b51eSKate Stone     } else {
8467730b9a4SJim Ingham       if (log)
8477730b9a4SJim Ingham         log->Printf("SBFrame::FindValue () => error: process is running");
848c9858e4dSGreg Clayton     }
8497fdf9ef1SGreg Clayton   }
850dde9cff3SCaroline Tice 
8514838131bSGreg Clayton   if (log)
852b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) "
853b9c1b51eSKate Stone                 "=> SBValue(%p)",
854324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), name, value_type,
855324a1036SSaleem Abdulrasool                 static_cast<void *>(value_sp.get()));
8564838131bSGreg Clayton 
857dde9cff3SCaroline Tice   return sb_value;
858dde9cff3SCaroline Tice }
859dde9cff3SCaroline Tice 
860b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const {
861b57e4a1bSJason Molenda   lldb::StackFrameSP this_sp = GetFrameSP();
862b57e4a1bSJason Molenda   lldb::StackFrameSP that_sp = that.GetFrameSP();
86335e2ab60SJohnny Chen   return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
86435e2ab60SJohnny Chen }
86535e2ab60SJohnny Chen 
866b9c1b51eSKate Stone bool SBFrame::operator==(const SBFrame &rhs) const { return IsEqual(rhs); }
86730fdc8d8SChris Lattner 
868b9c1b51eSKate Stone bool SBFrame::operator!=(const SBFrame &rhs) const { return !IsEqual(rhs); }
86930fdc8d8SChris Lattner 
870b9c1b51eSKate Stone SBThread SBFrame::GetThread() const {
8715160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
872ceb6b139SCaroline Tice 
873c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
874c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
875c481c7eeSJim Ingham 
876d9e416c0SGreg Clayton   ThreadSP thread_sp(exe_ctx.GetThreadSP());
877d9e416c0SGreg Clayton   SBThread sb_thread(thread_sp);
878ceb6b139SCaroline Tice 
879b9c1b51eSKate Stone   if (log) {
880750cd175SCaroline Tice     SBStream sstr;
881750cd175SCaroline Tice     sb_thread.GetDescription(sstr);
882d9e416c0SGreg Clayton     log->Printf("SBFrame(%p)::GetThread () => SBThread(%p): %s",
883324a1036SSaleem Abdulrasool                 static_cast<void *>(exe_ctx.GetFramePtr()),
884324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()), sstr.GetData());
885750cd175SCaroline Tice   }
886ceb6b139SCaroline Tice 
88730fdc8d8SChris Lattner   return sb_thread;
88830fdc8d8SChris Lattner }
88930fdc8d8SChris Lattner 
890b9c1b51eSKate Stone const char *SBFrame::Disassemble() const {
8915160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
892dbb0abbfSEugene Zelenko   const char *disassembly = nullptr;
893bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
894bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
8954fc6cb9cSJim Ingham 
896dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
897d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
8987730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
899b9c1b51eSKate Stone   if (target && process) {
9007fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
901b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
9027730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
903b9c1b51eSKate Stone       if (frame) {
904d9e416c0SGreg Clayton         disassembly = frame->Disassemble();
905b9c1b51eSKate Stone       } else {
906c9858e4dSGreg Clayton         if (log)
907b9c1b51eSKate Stone           log->Printf("SBFrame::Disassemble () => error: could not reconstruct "
908b9c1b51eSKate Stone                       "frame object for this SBFrame.");
9097730b9a4SJim Ingham       }
910b9c1b51eSKate Stone     } else {
9117730b9a4SJim Ingham       if (log)
9127730b9a4SJim Ingham         log->Printf("SBFrame::Disassemble () => error: process is running");
9137fdf9ef1SGreg Clayton     }
914c9858e4dSGreg Clayton   }
9154838131bSGreg Clayton 
9164838131bSGreg Clayton   if (log)
917b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::Disassemble () => %s", static_cast<void *>(frame),
918b9c1b51eSKate Stone                 disassembly);
9194838131bSGreg Clayton 
9204838131bSGreg Clayton   return disassembly;
92130fdc8d8SChris Lattner }
92230fdc8d8SChris Lattner 
923b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics,
924b9c1b51eSKate Stone                                   bool in_scope_only) {
925316d498bSGreg Clayton   SBValueList value_list;
926c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
927c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
928c481c7eeSJim Ingham 
929b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
930d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
931b9c1b51eSKate Stone   if (frame && target) {
932b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
933b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
934b9c1b51eSKate Stone     const bool include_runtime_support_values =
935b9c1b51eSKate Stone         target ? target->GetDisplayRuntimeSupportValues() : false;
93651f96eebSZachary Turner 
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 
94551f96eebSZachary Turner     value_list = GetVariables(options);
946316d498bSGreg Clayton   }
947316d498bSGreg Clayton   return value_list;
94878a685aaSJim Ingham }
94978a685aaSJim Ingham 
950b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals,
951b9c1b51eSKate Stone                                         bool statics, bool in_scope_only,
952b9c1b51eSKate Stone                                         lldb::DynamicValueType use_dynamic) {
953c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
954c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
955c481c7eeSJim Ingham 
956560558ebSEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
957b9c1b51eSKate Stone   const bool include_runtime_support_values =
958b9c1b51eSKate Stone       target ? target->GetDisplayRuntimeSupportValues() : false;
95951f96eebSZachary Turner   SBVariablesOptions options;
96051f96eebSZachary Turner   options.SetIncludeArguments(arguments);
96151f96eebSZachary Turner   options.SetIncludeLocals(locals);
96251f96eebSZachary Turner   options.SetIncludeStatics(statics);
96351f96eebSZachary Turner   options.SetInScopeOnly(in_scope_only);
96451f96eebSZachary Turner   options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
96551f96eebSZachary Turner   options.SetUseDynamic(use_dynamic);
96651f96eebSZachary Turner   return GetVariables(options);
967560558ebSEnrico Granata }
968560558ebSEnrico Granata 
969b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) {
9705160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
971ceb6b139SCaroline Tice 
972b9556accSGreg Clayton   SBValueList value_list;
973bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
974bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
9754fc6cb9cSJim Ingham 
976dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
977d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
978b9556accSGreg Clayton 
97951f96eebSZachary Turner   const bool statics = options.GetIncludeStatics();
98051f96eebSZachary Turner   const bool arguments = options.GetIncludeArguments();
98151f96eebSZachary Turner   const bool locals = options.GetIncludeLocals();
98251f96eebSZachary Turner   const bool in_scope_only = options.GetInScopeOnly();
983b9c1b51eSKate Stone   const bool include_runtime_support_values =
984b9c1b51eSKate Stone       options.GetIncludeRuntimeSupportValues();
98551f96eebSZachary Turner   const lldb::DynamicValueType use_dynamic = options.GetUseDynamic();
98651f96eebSZachary Turner 
987ceb6b139SCaroline Tice   if (log)
988b9c1b51eSKate Stone     log->Printf("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, "
989b9c1b51eSKate Stone                 "in_scope_only=%i runtime=%i dynamic=%i)",
990b9c1b51eSKate Stone                 arguments, locals, statics, in_scope_only,
99151f96eebSZachary Turner                 include_runtime_support_values, use_dynamic);
992ceb6b139SCaroline Tice 
993349213f9SGreg Clayton   std::set<VariableSP> variable_set;
9947730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
995b9c1b51eSKate Stone   if (target && process) {
9967fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
997b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
9987730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
999b9c1b51eSKate Stone       if (frame) {
100030fdc8d8SChris Lattner         size_t i;
1001dbb0abbfSEugene Zelenko         VariableList *variable_list = nullptr;
1002d9e416c0SGreg Clayton         variable_list = frame->GetVariableList(true);
1003b9c1b51eSKate Stone         if (variable_list) {
100430fdc8d8SChris Lattner           const size_t num_variables = variable_list->GetSize();
1005b9c1b51eSKate Stone           if (num_variables) {
1006b9c1b51eSKate Stone             for (i = 0; i < num_variables; ++i) {
100730fdc8d8SChris Lattner               VariableSP variable_sp(variable_list->GetVariableAtIndex(i));
1008b9c1b51eSKate Stone               if (variable_sp) {
100930fdc8d8SChris Lattner                 bool add_variable = false;
1010b9c1b51eSKate Stone                 switch (variable_sp->GetScope()) {
101130fdc8d8SChris Lattner                 case eValueTypeVariableGlobal:
101230fdc8d8SChris Lattner                 case eValueTypeVariableStatic:
101363a27afaSGreg Clayton                 case eValueTypeVariableThreadLocal:
101430fdc8d8SChris Lattner                   add_variable = statics;
101530fdc8d8SChris Lattner                   break;
101630fdc8d8SChris Lattner 
101730fdc8d8SChris Lattner                 case eValueTypeVariableArgument:
101830fdc8d8SChris Lattner                   add_variable = arguments;
101930fdc8d8SChris Lattner                   break;
102030fdc8d8SChris Lattner 
102130fdc8d8SChris Lattner                 case eValueTypeVariableLocal:
102230fdc8d8SChris Lattner                   add_variable = locals;
102330fdc8d8SChris Lattner                   break;
1024c982c768SGreg Clayton 
1025c982c768SGreg Clayton                 default:
1026c982c768SGreg Clayton                   break;
102730fdc8d8SChris Lattner                 }
1028b9c1b51eSKate Stone                 if (add_variable) {
1029349213f9SGreg Clayton                   // Only add variables once so we don't end up with duplicates
1030349213f9SGreg Clayton                   if (variable_set.find(variable_sp) == variable_set.end())
1031349213f9SGreg Clayton                     variable_set.insert(variable_sp);
1032349213f9SGreg Clayton                   else
1033349213f9SGreg Clayton                     continue;
1034349213f9SGreg Clayton 
1035d9e416c0SGreg Clayton                   if (in_scope_only && !variable_sp->IsInScope(frame))
103630fdc8d8SChris Lattner                     continue;
103730fdc8d8SChris Lattner 
1038b9c1b51eSKate Stone                   ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable(
1039b9c1b51eSKate Stone                       variable_sp, eNoDynamicValues));
1040560558ebSEnrico Granata 
1041b9c1b51eSKate Stone                   if (!include_runtime_support_values && valobj_sp != nullptr &&
1042dbb0abbfSEugene Zelenko                       valobj_sp->IsRuntimeSupportValue())
1043560558ebSEnrico Granata                     continue;
1044560558ebSEnrico Granata 
1045e3e91517SEnrico Granata                   SBValue value_sb;
1046e3e91517SEnrico Granata                   value_sb.SetSP(valobj_sp, use_dynamic);
1047e3e91517SEnrico Granata                   value_list.Append(value_sb);
104830fdc8d8SChris Lattner                 }
104930fdc8d8SChris Lattner               }
105030fdc8d8SChris Lattner             }
105130fdc8d8SChris Lattner           }
105230fdc8d8SChris Lattner         }
1053b9c1b51eSKate Stone       } else {
1054c9858e4dSGreg Clayton         if (log)
1055b9c1b51eSKate Stone           log->Printf("SBFrame::GetVariables () => error: could not "
1056b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
10577730b9a4SJim Ingham       }
1058b9c1b51eSKate Stone     } else {
10597730b9a4SJim Ingham       if (log)
10607730b9a4SJim Ingham         log->Printf("SBFrame::GetVariables () => error: process is running");
1061c9858e4dSGreg Clayton     }
10627fdf9ef1SGreg Clayton   }
1063ceb6b139SCaroline Tice 
1064ceb6b139SCaroline Tice   if (log)
1065324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetVariables (...) => SBValueList(%p)",
1066324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
1067324a1036SSaleem Abdulrasool                 static_cast<void *>(value_list.opaque_ptr()));
1068ceb6b139SCaroline Tice 
106930fdc8d8SChris Lattner   return value_list;
107030fdc8d8SChris Lattner }
107130fdc8d8SChris Lattner 
1072b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() {
10735160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1074ceb6b139SCaroline Tice 
107530fdc8d8SChris Lattner   SBValueList value_list;
1076bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1077bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
10784fc6cb9cSJim Ingham 
1079dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1080d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
10817730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1082b9c1b51eSKate Stone   if (target && process) {
10837fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1084b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
10857730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1086b9c1b51eSKate Stone       if (frame) {
1087d9e416c0SGreg Clayton         RegisterContextSP reg_ctx(frame->GetRegisterContext());
1088b9c1b51eSKate Stone         if (reg_ctx) {
108930fdc8d8SChris Lattner           const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
1090b9c1b51eSKate Stone           for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
1091b9c1b51eSKate Stone             value_list.Append(
1092b9c1b51eSKate Stone                 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx));
109330fdc8d8SChris Lattner           }
109430fdc8d8SChris Lattner         }
1095b9c1b51eSKate Stone       } else {
1096c9858e4dSGreg Clayton         if (log)
1097b9c1b51eSKate Stone           log->Printf("SBFrame::GetRegisters () => error: could not "
1098b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
10997730b9a4SJim Ingham       }
1100b9c1b51eSKate Stone     } else {
11017730b9a4SJim Ingham       if (log)
11027730b9a4SJim Ingham         log->Printf("SBFrame::GetRegisters () => error: process is running");
1103c9858e4dSGreg Clayton     }
11047fdf9ef1SGreg Clayton   }
1105ceb6b139SCaroline Tice 
1106ceb6b139SCaroline Tice   if (log)
1107324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetRegisters () => SBValueList(%p)",
1108324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
1109324a1036SSaleem Abdulrasool                 static_cast<void *>(value_list.opaque_ptr()));
1110ceb6b139SCaroline Tice 
111130fdc8d8SChris Lattner   return value_list;
111230fdc8d8SChris Lattner }
111330fdc8d8SChris Lattner 
1114b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) {
1115ad9a53c5SJason Molenda   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1116ad9a53c5SJason Molenda 
1117ad9a53c5SJason Molenda   SBValue result;
1118ad9a53c5SJason Molenda   ValueObjectSP value_sp;
1119bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1120bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1121ad9a53c5SJason Molenda 
1122dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1123ad9a53c5SJason Molenda   Target *target = exe_ctx.GetTargetPtr();
1124ad9a53c5SJason Molenda   Process *process = exe_ctx.GetProcessPtr();
1125b9c1b51eSKate Stone   if (target && process) {
1126ad9a53c5SJason Molenda     Process::StopLocker stop_locker;
1127b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1128ad9a53c5SJason Molenda       frame = exe_ctx.GetFramePtr();
1129b9c1b51eSKate Stone       if (frame) {
1130ad9a53c5SJason Molenda         RegisterContextSP reg_ctx(frame->GetRegisterContext());
1131b9c1b51eSKate Stone         if (reg_ctx) {
1132ad9a53c5SJason Molenda           const uint32_t num_regs = reg_ctx->GetRegisterCount();
1133b9c1b51eSKate Stone           for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) {
1134b9c1b51eSKate Stone             const RegisterInfo *reg_info =
1135b9c1b51eSKate Stone                 reg_ctx->GetRegisterInfoAtIndex(reg_idx);
1136ad9a53c5SJason Molenda             if (reg_info &&
1137ad9a53c5SJason Molenda                 ((reg_info->name && strcasecmp(reg_info->name, name) == 0) ||
1138b9c1b51eSKate Stone                  (reg_info->alt_name &&
1139b9c1b51eSKate Stone                   strcasecmp(reg_info->alt_name, name) == 0))) {
1140ad9a53c5SJason Molenda               value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx);
1141ad9a53c5SJason Molenda               result.SetSP(value_sp);
1142ad9a53c5SJason Molenda               break;
1143ad9a53c5SJason Molenda             }
1144ad9a53c5SJason Molenda           }
1145ad9a53c5SJason Molenda         }
1146b9c1b51eSKate Stone       } else {
1147ad9a53c5SJason Molenda         if (log)
1148b9c1b51eSKate Stone           log->Printf("SBFrame::FindRegister () => error: could not "
1149b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
1150ad9a53c5SJason Molenda       }
1151b9c1b51eSKate Stone     } else {
1152ad9a53c5SJason Molenda       if (log)
11535d353842SJason Molenda         log->Printf("SBFrame::FindRegister () => error: process is running");
1154ad9a53c5SJason Molenda     }
1155ad9a53c5SJason Molenda   }
1156ad9a53c5SJason Molenda 
1157ad9a53c5SJason Molenda   if (log)
1158324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::FindRegister () => SBValue(%p)",
1159324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
1160324a1036SSaleem Abdulrasool                 static_cast<void *>(value_sp.get()));
1161ad9a53c5SJason Molenda 
1162ad9a53c5SJason Molenda   return result;
1163ad9a53c5SJason Molenda }
1164ad9a53c5SJason Molenda 
1165b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) {
11665160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1167da7bc7d0SGreg Clayton   Stream &strm = description.ref();
1168da7bc7d0SGreg Clayton 
1169bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1170bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
11714fc6cb9cSJim Ingham 
1172b57e4a1bSJason Molenda   StackFrame *frame;
1173d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
11747730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1175b9c1b51eSKate Stone   if (target && process) {
11767fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1177b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
11787730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1179b9c1b51eSKate Stone       if (frame) {
1180d9e416c0SGreg Clayton         frame->DumpUsingSettingsFormat(&strm);
1181b9c1b51eSKate Stone       } else {
1182c9858e4dSGreg Clayton         if (log)
1183b9c1b51eSKate Stone           log->Printf("SBFrame::GetDescription () => error: could not "
1184b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
11857730b9a4SJim Ingham       }
1186b9c1b51eSKate Stone     } else {
11877730b9a4SJim Ingham       if (log)
11887730b9a4SJim Ingham         log->Printf("SBFrame::GetDescription () => error: process is running");
1189c9858e4dSGreg Clayton     }
1190c9858e4dSGreg Clayton 
1191b9c1b51eSKate Stone   } else
1192da7bc7d0SGreg Clayton     strm.PutCString("No value");
1193dde9cff3SCaroline Tice 
1194dde9cff3SCaroline Tice   return true;
1195dde9cff3SCaroline Tice }
11961d3afba3SGreg Clayton 
1197b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) {
1198316d498bSGreg Clayton   SBValue result;
1199c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1200c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1201c481c7eeSJim Ingham 
1202b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
1203d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1204b9c1b51eSKate Stone   if (frame && target) {
120535e1bda6SJim Ingham     SBExpressionOptions options;
1206b9c1b51eSKate Stone     lldb::DynamicValueType fetch_dynamic_value =
1207b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
1208cced1566SGreg Clayton     options.SetFetchDynamicValue(fetch_dynamic_value);
120935e1bda6SJim Ingham     options.SetUnwindOnError(true);
121024785bd0SEugene Leviant     options.SetIgnoreBreakpoints(true);
1211998c8a1cSRyan Brown     if (target->GetLanguage() != eLanguageTypeUnknown)
1212998c8a1cSRyan Brown       options.SetLanguage(target->GetLanguage());
1213998c8a1cSRyan Brown     else
1214998c8a1cSRyan Brown       options.SetLanguage(frame->GetLanguage());
121535e1bda6SJim Ingham     return EvaluateExpression(expr, options);
1216316d498bSGreg Clayton   }
1217316d498bSGreg Clayton   return result;
121878a685aaSJim Ingham }
121978a685aaSJim Ingham 
122078a685aaSJim Ingham SBValue
1221b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr,
1222b9c1b51eSKate Stone                             lldb::DynamicValueType fetch_dynamic_value) {
122335e1bda6SJim Ingham   SBExpressionOptions options;
1224cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
122535e1bda6SJim Ingham   options.SetUnwindOnError(true);
122624785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1227c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1228c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1229c481c7eeSJim Ingham 
1230998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1231998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1232998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1233998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1234998c8a1cSRyan Brown   else if (frame)
1235998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
123635e1bda6SJim Ingham   return EvaluateExpression(expr, options);
12377ba6e991SJim Ingham }
12387ba6e991SJim Ingham 
1239b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr,
1240b9c1b51eSKate Stone                                     lldb::DynamicValueType fetch_dynamic_value,
1241b9c1b51eSKate Stone                                     bool unwind_on_error) {
124235e1bda6SJim Ingham   SBExpressionOptions options;
1243c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1244c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1245c481c7eeSJim Ingham 
1246cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
124735e1bda6SJim Ingham   options.SetUnwindOnError(unwind_on_error);
124824785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1249998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1250998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1251998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1252998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1253998c8a1cSRyan Brown   else if (frame)
1254998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
125535e1bda6SJim Ingham   return EvaluateExpression(expr, options);
125635e1bda6SJim Ingham }
125735e1bda6SJim Ingham 
1258b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr,
1259b9c1b51eSKate Stone                                           const SBExpressionOptions &options) {
12605160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
12614838131bSGreg Clayton 
1262358efd65SSaleem Abdulrasool #ifndef LLDB_DISABLE_PYTHON
12635160ce5cSGreg Clayton   Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1264358efd65SSaleem Abdulrasool #endif
1265a162ebafSSean Callanan 
12668646d3c1SJim Ingham   ExpressionResults exe_results = eExpressionSetupError;
126769b582faSGreg Clayton   SBValue expr_result;
12687730b9a4SJim Ingham 
1269b9c1b51eSKate Stone   if (expr == nullptr || expr[0] == '\0') {
12707730b9a4SJim Ingham     if (log)
1271b9c1b51eSKate Stone       log->Printf(
1272b9c1b51eSKate Stone           "SBFrame::EvaluateExpression called with an empty expression");
12737730b9a4SJim Ingham     return expr_result;
12747730b9a4SJim Ingham   }
12757730b9a4SJim Ingham 
127681e871edSGreg Clayton   ValueObjectSP expr_value_sp;
12774838131bSGreg Clayton 
1278bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1279bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
12804fc6cb9cSJim Ingham 
1281b9556accSGreg Clayton   if (log)
12827730b9a4SJim Ingham     log->Printf("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr);
1283b9556accSGreg Clayton 
1284dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
12857730b9a4SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
12867730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
12877730b9a4SJim Ingham 
1288b9c1b51eSKate Stone   if (target && process) {
12897fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1290b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
12917730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1292b9c1b51eSKate Stone       if (frame) {
12938f7db52dSJim Ingham         std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace;
1294b9c1b51eSKate Stone         if (target->GetDisplayExpressionsInCrashlogs()) {
12951ba7c4d0SGreg Clayton           StreamString frame_description;
1296d9e416c0SGreg Clayton           frame->DumpUsingSettingsFormat(&frame_description);
12978f7db52dSJim Ingham           stack_trace = llvm::make_unique<llvm::PrettyStackTraceFormat>(
1298b9c1b51eSKate Stone               "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value "
1299b9c1b51eSKate Stone               "= %u) %s",
1300b9c1b51eSKate Stone               expr, options.GetFetchDynamicValue(),
1301c156427dSZachary Turner               frame_description.GetData());
1302fb6621efSGreg Clayton         }
1303fb6621efSGreg Clayton 
1304b9c1b51eSKate Stone         exe_results = target->EvaluateExpression(expr, frame, expr_value_sp,
130535e1bda6SJim Ingham                                                  options.ref());
1306e3e91517SEnrico Granata         expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
1307b9c1b51eSKate Stone       } else {
1308c9858e4dSGreg Clayton         if (log)
1309b9c1b51eSKate Stone           log->Printf("SBFrame::EvaluateExpression () => error: could not "
1310b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
13117730b9a4SJim Ingham       }
1312b9c1b51eSKate Stone     } else {
13137730b9a4SJim Ingham       if (log)
1314b9c1b51eSKate Stone         log->Printf(
1315b9c1b51eSKate Stone             "SBFrame::EvaluateExpression () => error: process is running");
1316c9858e4dSGreg Clayton     }
13177fdf9ef1SGreg Clayton   }
13184838131bSGreg Clayton 
1319cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1320a162ebafSSean Callanan   if (expr_log)
1321b9c1b51eSKate Stone     expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is "
1322b9c1b51eSKate Stone                      "%s, summary %s **",
1323324a1036SSaleem Abdulrasool                      expr_result.GetValue(), expr_result.GetSummary());
1324a162ebafSSean Callanan 
13254838131bSGreg Clayton   if (log)
1326b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) "
1327b9c1b51eSKate Stone                 "(execution result=%d)",
1328324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), expr,
1329324a1036SSaleem Abdulrasool                 static_cast<void *>(expr_value_sp.get()), exe_results);
1330cf7e2dc0SJason Molenda #endif
13314838131bSGreg Clayton 
1332cfd1acedSGreg Clayton   return expr_result;
13331d3afba3SGreg Clayton }
1334316d498bSGreg Clayton 
1335b9c1b51eSKate Stone bool SBFrame::IsInlined() {
133605f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->IsInlined();
133705f75e9fSOleksiy Vyalov }
133805f75e9fSOleksiy Vyalov 
1339b9c1b51eSKate Stone bool SBFrame::IsInlined() const {
13405160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1341c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1342c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1343c481c7eeSJim Ingham 
1344dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1345d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
13467730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1347b9c1b51eSKate Stone   if (target && process) {
13487fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1349b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
13507730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1351b9c1b51eSKate Stone       if (frame) {
13527fdf9ef1SGreg Clayton 
1353d9e416c0SGreg Clayton         Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1354316d498bSGreg Clayton         if (block)
1355dbb0abbfSEugene Zelenko           return block->GetContainingInlinedBlock() != nullptr;
1356b9c1b51eSKate Stone       } else {
1357c9858e4dSGreg Clayton         if (log)
1358b9c1b51eSKate Stone           log->Printf("SBFrame::IsInlined () => error: could not reconstruct "
1359b9c1b51eSKate Stone                       "frame object for this SBFrame.");
13607730b9a4SJim Ingham       }
1361b9c1b51eSKate Stone     } else {
13627730b9a4SJim Ingham       if (log)
13637730b9a4SJim Ingham         log->Printf("SBFrame::IsInlined () => error: process is running");
1364c9858e4dSGreg Clayton     }
13657fdf9ef1SGreg Clayton   }
1366316d498bSGreg Clayton   return false;
1367316d498bSGreg Clayton }
1368316d498bSGreg Clayton 
1369b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() {
137005f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->GetFunctionName();
137105f75e9fSOleksiy Vyalov }
137205f75e9fSOleksiy Vyalov 
1373*bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const {
1374*bdbdd229SJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1375*bdbdd229SJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1376*bdbdd229SJim Ingham 
1377*bdbdd229SJim Ingham   StackFrame *frame = nullptr;
1378*bdbdd229SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
1379*bdbdd229SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1380*bdbdd229SJim Ingham   if (target && process) {
1381*bdbdd229SJim Ingham     Process::StopLocker stop_locker;
1382*bdbdd229SJim Ingham     if (stop_locker.TryLock(&process->GetRunLock())) {
1383*bdbdd229SJim Ingham       frame = exe_ctx.GetFramePtr();
1384*bdbdd229SJim Ingham       if (frame) {
1385*bdbdd229SJim Ingham         return frame->GuessLanguage();
1386*bdbdd229SJim Ingham       }
1387*bdbdd229SJim Ingham     }
1388*bdbdd229SJim Ingham   }
1389*bdbdd229SJim Ingham   return eLanguageTypeUnknown;
1390*bdbdd229SJim Ingham }
1391*bdbdd229SJim Ingham 
1392b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const {
13935160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1394dbb0abbfSEugene Zelenko   const char *name = nullptr;
1395c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1396c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1397c481c7eeSJim Ingham 
1398dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1399d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
14007730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1401b9c1b51eSKate Stone   if (target && process) {
14027fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1403b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
14047730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1405b9c1b51eSKate Stone       if (frame) {
1406b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1407b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1408b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1409b9c1b51eSKate Stone         if (sc.block) {
1410316d498bSGreg Clayton           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1411b9c1b51eSKate Stone           if (inlined_block) {
1412b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1413b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
1414b9c1b51eSKate Stone             name =
1415b9c1b51eSKate Stone                 inlined_info->GetName(sc.function->GetLanguage()).AsCString();
1416316d498bSGreg Clayton           }
1417316d498bSGreg Clayton         }
1418316d498bSGreg Clayton 
1419b9c1b51eSKate Stone         if (name == nullptr) {
1420316d498bSGreg Clayton           if (sc.function)
1421316d498bSGreg Clayton             name = sc.function->GetName().GetCString();
1422316d498bSGreg Clayton         }
1423316d498bSGreg Clayton 
1424b9c1b51eSKate Stone         if (name == nullptr) {
1425316d498bSGreg Clayton           if (sc.symbol)
1426316d498bSGreg Clayton             name = sc.symbol->GetName().GetCString();
1427316d498bSGreg Clayton         }
1428b9c1b51eSKate Stone       } else {
1429c9858e4dSGreg Clayton         if (log)
1430b9c1b51eSKate Stone           log->Printf("SBFrame::GetFunctionName () => error: could not "
1431b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
14327730b9a4SJim Ingham       }
1433b9c1b51eSKate Stone     } else {
14347730b9a4SJim Ingham       if (log)
14357730b9a4SJim Ingham         log->Printf("SBFrame::GetFunctionName() => error: process is running");
1436c9858e4dSGreg Clayton     }
14377fdf9ef1SGreg Clayton   }
1438316d498bSGreg Clayton   return name;
1439316d498bSGreg Clayton }
1440c1f705c2SEnrico Granata 
1441b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() {
1442c1f705c2SEnrico Granata   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1443dbb0abbfSEugene Zelenko   const char *name = nullptr;
1444c481c7eeSJim Ingham 
1445c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1446c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1447c481c7eeSJim Ingham 
1448dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1449c1f705c2SEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
1450c1f705c2SEnrico Granata   Process *process = exe_ctx.GetProcessPtr();
1451b9c1b51eSKate Stone   if (target && process) {
1452c1f705c2SEnrico Granata     Process::StopLocker stop_locker;
1453b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1454c1f705c2SEnrico Granata       frame = exe_ctx.GetFramePtr();
1455b9c1b51eSKate Stone       if (frame) {
1456b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1457b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1458b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1459b9c1b51eSKate Stone         if (sc.block) {
1460c1f705c2SEnrico Granata           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1461b9c1b51eSKate Stone           if (inlined_block) {
1462b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1463b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
1464b9c1b51eSKate Stone             name = inlined_info->GetDisplayName(sc.function->GetLanguage())
1465b9c1b51eSKate Stone                        .AsCString();
1466c1f705c2SEnrico Granata           }
1467c1f705c2SEnrico Granata         }
1468c1f705c2SEnrico Granata 
1469b9c1b51eSKate Stone         if (name == nullptr) {
1470c1f705c2SEnrico Granata           if (sc.function)
1471c1f705c2SEnrico Granata             name = sc.function->GetDisplayName().GetCString();
1472c1f705c2SEnrico Granata         }
1473c1f705c2SEnrico Granata 
1474b9c1b51eSKate Stone         if (name == nullptr) {
1475c1f705c2SEnrico Granata           if (sc.symbol)
1476c1f705c2SEnrico Granata             name = sc.symbol->GetDisplayName().GetCString();
1477c1f705c2SEnrico Granata         }
1478b9c1b51eSKate Stone       } else {
1479c1f705c2SEnrico Granata         if (log)
1480b9c1b51eSKate Stone           log->Printf("SBFrame::GetDisplayFunctionName () => error: could not "
1481b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
1482c1f705c2SEnrico Granata       }
1483b9c1b51eSKate Stone     } else {
1484c1f705c2SEnrico Granata       if (log)
1485b9c1b51eSKate Stone         log->Printf(
1486b9c1b51eSKate Stone             "SBFrame::GetDisplayFunctionName() => error: process is running");
1487c1f705c2SEnrico Granata     }
1488c1f705c2SEnrico Granata   }
1489c1f705c2SEnrico Granata   return name;
1490c1f705c2SEnrico Granata }
1491