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(
42204803b3eSTatyana Krasnukha             target, AddressClass::eCode);
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;
60997206d57SZachary Turner         Status 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) {
669*e23d0b63SShafik Yaghmour         value_sp = frame->FindVariable(ConstString(name));
67030fdc8d8SChris Lattner 
671*e23d0b63SShafik Yaghmour         if (value_sp)
672e3e91517SEnrico Granata           sb_value.SetSP(value_sp, use_dynamic);
673b9c1b51eSKate Stone       } else {
674c9858e4dSGreg Clayton         if (log)
675b9c1b51eSKate Stone           log->Printf("SBFrame::FindVariable () => error: could not "
676b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
6777730b9a4SJim Ingham       }
678b9c1b51eSKate Stone     } else {
6797730b9a4SJim Ingham       if (log)
6807730b9a4SJim Ingham         log->Printf("SBFrame::FindVariable () => error: process is running");
681c9858e4dSGreg Clayton     }
682316d498bSGreg Clayton   }
683316d498bSGreg Clayton 
6844838131bSGreg Clayton   if (log)
68569b582faSGreg Clayton     log->Printf("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
686324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), name,
687324a1036SSaleem Abdulrasool                 static_cast<void *>(value_sp.get()));
6884838131bSGreg Clayton 
689dde9cff3SCaroline Tice   return sb_value;
690dde9cff3SCaroline Tice }
691dde9cff3SCaroline Tice 
692b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) {
693316d498bSGreg Clayton   SBValue value;
694c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
695c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
696c481c7eeSJim Ingham 
697b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
698d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
699b9c1b51eSKate Stone   if (frame && target) {
700b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
701b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
702316d498bSGreg Clayton     value = FindValue(name, value_type, use_dynamic);
703316d498bSGreg Clayton   }
704316d498bSGreg Clayton   return value;
70578a685aaSJim Ingham }
70678a685aaSJim Ingham 
707b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type,
708b9c1b51eSKate Stone                            lldb::DynamicValueType use_dynamic) {
7095160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
71069b582faSGreg Clayton   SBValue sb_value;
7117730b9a4SJim Ingham 
712b9c1b51eSKate Stone   if (name == nullptr || name[0] == '\0') {
7137730b9a4SJim Ingham     if (log)
7147730b9a4SJim Ingham       log->Printf("SBFrame::FindValue called with empty name.");
7157730b9a4SJim Ingham     return sb_value;
7167730b9a4SJim Ingham   }
7177730b9a4SJim Ingham 
71881e871edSGreg Clayton   ValueObjectSP value_sp;
719bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
720bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
7214fc6cb9cSJim Ingham 
722dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
723d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
7247730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
725b9c1b51eSKate Stone   if (target && process) {
7267fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
727b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
7287730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
729b9c1b51eSKate Stone       if (frame) {
7308a2a0dfbSEnrico Granata         VariableList variable_list;
7318a2a0dfbSEnrico Granata 
732b9c1b51eSKate Stone         switch (value_type) {
73369b582faSGreg Clayton         case eValueTypeVariableGlobal:      // global variable
73469b582faSGreg Clayton         case eValueTypeVariableStatic:      // static variable
73569b582faSGreg Clayton         case eValueTypeVariableArgument:    // function argument variables
73669b582faSGreg Clayton         case eValueTypeVariableLocal:       // function local variables
73763a27afaSGreg Clayton         case eValueTypeVariableThreadLocal: // thread local variables
73869b582faSGreg Clayton         {
739d9e416c0SGreg Clayton           SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock));
74072eff18aSGreg Clayton 
74172eff18aSGreg Clayton           const bool can_create = true;
74272eff18aSGreg Clayton           const bool get_parent_variables = true;
74372eff18aSGreg Clayton           const bool stop_if_block_is_inlined_function = true;
74472eff18aSGreg Clayton 
7450efb51a0SChaoren Lin           if (sc.block)
746b9c1b51eSKate Stone             sc.block->AppendVariables(
747b9c1b51eSKate Stone                 can_create, get_parent_variables,
748b9c1b51eSKate Stone                 stop_if_block_is_inlined_function,
749b9c1b51eSKate Stone                 [frame](Variable *v) { return v->IsInScope(frame); },
750b9c1b51eSKate Stone                 &variable_list);
751b9c1b51eSKate Stone           if (value_type == eValueTypeVariableGlobal) {
7528a2a0dfbSEnrico Granata             const bool get_file_globals = true;
7538a2a0dfbSEnrico Granata             VariableList *frame_vars = frame->GetVariableList(get_file_globals);
7548a2a0dfbSEnrico Granata             if (frame_vars)
7558a2a0dfbSEnrico Granata               frame_vars->AppendVariablesIfUnique(variable_list);
7568a2a0dfbSEnrico Granata           }
75769b582faSGreg Clayton           ConstString const_name(name);
758b9c1b51eSKate Stone           VariableSP variable_sp(
759b9c1b51eSKate Stone               variable_list.FindVariable(const_name, value_type));
760b9c1b51eSKate Stone           if (variable_sp) {
761b9c1b51eSKate Stone             value_sp = frame->GetValueObjectForFrameVariable(variable_sp,
762b9c1b51eSKate Stone                                                              eNoDynamicValues);
763e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
76430fdc8d8SChris Lattner           }
765b9c1b51eSKate Stone         } break;
76669b582faSGreg Clayton 
76769b582faSGreg Clayton         case eValueTypeRegister: // stack frame register value
76869b582faSGreg Clayton         {
769d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
770b9c1b51eSKate Stone           if (reg_ctx) {
77169b582faSGreg Clayton             const uint32_t num_regs = reg_ctx->GetRegisterCount();
772b9c1b51eSKate Stone             for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) {
773b9c1b51eSKate Stone               const RegisterInfo *reg_info =
774b9c1b51eSKate Stone                   reg_ctx->GetRegisterInfoAtIndex(reg_idx);
77569b582faSGreg Clayton               if (reg_info &&
77669b582faSGreg Clayton                   ((reg_info->name && strcasecmp(reg_info->name, name) == 0) ||
777b9c1b51eSKate Stone                    (reg_info->alt_name &&
778b9c1b51eSKate Stone                     strcasecmp(reg_info->alt_name, name) == 0))) {
779d9e416c0SGreg Clayton                 value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx);
78081e871edSGreg Clayton                 sb_value.SetSP(value_sp);
78181e871edSGreg Clayton                 break;
78269b582faSGreg Clayton               }
78369b582faSGreg Clayton             }
78469b582faSGreg Clayton           }
785b9c1b51eSKate Stone         } break;
78669b582faSGreg Clayton 
787b9c1b51eSKate Stone         case eValueTypeRegisterSet: // A collection of stack frame register
788b9c1b51eSKate Stone                                     // values
78969b582faSGreg Clayton         {
790d9e416c0SGreg Clayton           RegisterContextSP reg_ctx(frame->GetRegisterContext());
791b9c1b51eSKate Stone           if (reg_ctx) {
79269b582faSGreg Clayton             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
793b9c1b51eSKate Stone             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
79469b582faSGreg Clayton               const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx);
79569b582faSGreg Clayton               if (reg_set &&
79669b582faSGreg Clayton                   ((reg_set->name && strcasecmp(reg_set->name, name) == 0) ||
797b9c1b51eSKate Stone                    (reg_set->short_name &&
798b9c1b51eSKate Stone                     strcasecmp(reg_set->short_name, name) == 0))) {
799b9c1b51eSKate Stone                 value_sp =
800b9c1b51eSKate Stone                     ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx);
80181e871edSGreg Clayton                 sb_value.SetSP(value_sp);
80281e871edSGreg Clayton                 break;
80369b582faSGreg Clayton               }
80469b582faSGreg Clayton             }
80569b582faSGreg Clayton           }
806b9c1b51eSKate Stone         } break;
80769b582faSGreg Clayton 
80869b582faSGreg Clayton         case eValueTypeConstResult: // constant result variables
80969b582faSGreg Clayton         {
81069b582faSGreg Clayton           ConstString const_name(name);
811b9c1b51eSKate Stone           ExpressionVariableSP expr_var_sp(
812b9c1b51eSKate Stone               target->GetPersistentVariable(const_name));
813b9c1b51eSKate Stone           if (expr_var_sp) {
81481e871edSGreg Clayton             value_sp = expr_var_sp->GetValueObject();
815e3e91517SEnrico Granata             sb_value.SetSP(value_sp, use_dynamic);
81681e871edSGreg Clayton           }
817b9c1b51eSKate Stone         } break;
81869b582faSGreg Clayton 
81969b582faSGreg Clayton         default:
82069b582faSGreg Clayton           break;
82169b582faSGreg Clayton         }
822b9c1b51eSKate Stone       } else {
823c9858e4dSGreg Clayton         if (log)
824b9c1b51eSKate Stone           log->Printf("SBFrame::FindValue () => error: could not reconstruct "
825b9c1b51eSKate Stone                       "frame object for this SBFrame.");
8267730b9a4SJim Ingham       }
827b9c1b51eSKate Stone     } else {
8287730b9a4SJim Ingham       if (log)
8297730b9a4SJim Ingham         log->Printf("SBFrame::FindValue () => error: process is running");
830c9858e4dSGreg Clayton     }
8317fdf9ef1SGreg Clayton   }
832dde9cff3SCaroline Tice 
8334838131bSGreg Clayton   if (log)
834b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) "
835b9c1b51eSKate Stone                 "=> SBValue(%p)",
836324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), name, value_type,
837324a1036SSaleem Abdulrasool                 static_cast<void *>(value_sp.get()));
8384838131bSGreg Clayton 
839dde9cff3SCaroline Tice   return sb_value;
840dde9cff3SCaroline Tice }
841dde9cff3SCaroline Tice 
842b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const {
843b57e4a1bSJason Molenda   lldb::StackFrameSP this_sp = GetFrameSP();
844b57e4a1bSJason Molenda   lldb::StackFrameSP that_sp = that.GetFrameSP();
84535e2ab60SJohnny Chen   return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
84635e2ab60SJohnny Chen }
84735e2ab60SJohnny Chen 
848b9c1b51eSKate Stone bool SBFrame::operator==(const SBFrame &rhs) const { return IsEqual(rhs); }
84930fdc8d8SChris Lattner 
850b9c1b51eSKate Stone bool SBFrame::operator!=(const SBFrame &rhs) const { return !IsEqual(rhs); }
85130fdc8d8SChris Lattner 
852b9c1b51eSKate Stone SBThread SBFrame::GetThread() const {
8535160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
854ceb6b139SCaroline Tice 
855c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
856c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
857c481c7eeSJim Ingham 
858d9e416c0SGreg Clayton   ThreadSP thread_sp(exe_ctx.GetThreadSP());
859d9e416c0SGreg Clayton   SBThread sb_thread(thread_sp);
860ceb6b139SCaroline Tice 
861b9c1b51eSKate Stone   if (log) {
862750cd175SCaroline Tice     SBStream sstr;
863750cd175SCaroline Tice     sb_thread.GetDescription(sstr);
864d9e416c0SGreg Clayton     log->Printf("SBFrame(%p)::GetThread () => SBThread(%p): %s",
865324a1036SSaleem Abdulrasool                 static_cast<void *>(exe_ctx.GetFramePtr()),
866324a1036SSaleem Abdulrasool                 static_cast<void *>(thread_sp.get()), sstr.GetData());
867750cd175SCaroline Tice   }
868ceb6b139SCaroline Tice 
86930fdc8d8SChris Lattner   return sb_thread;
87030fdc8d8SChris Lattner }
87130fdc8d8SChris Lattner 
872b9c1b51eSKate Stone const char *SBFrame::Disassemble() const {
8735160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
874dbb0abbfSEugene Zelenko   const char *disassembly = nullptr;
875bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
876bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
8774fc6cb9cSJim Ingham 
878dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
879d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
8807730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
881b9c1b51eSKate Stone   if (target && process) {
8827fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
883b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
8847730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
885b9c1b51eSKate Stone       if (frame) {
886d9e416c0SGreg Clayton         disassembly = frame->Disassemble();
887b9c1b51eSKate Stone       } else {
888c9858e4dSGreg Clayton         if (log)
889b9c1b51eSKate Stone           log->Printf("SBFrame::Disassemble () => error: could not reconstruct "
890b9c1b51eSKate Stone                       "frame object for this SBFrame.");
8917730b9a4SJim Ingham       }
892b9c1b51eSKate Stone     } else {
8937730b9a4SJim Ingham       if (log)
8947730b9a4SJim Ingham         log->Printf("SBFrame::Disassemble () => error: process is running");
8957fdf9ef1SGreg Clayton     }
896c9858e4dSGreg Clayton   }
8974838131bSGreg Clayton 
8984838131bSGreg Clayton   if (log)
899b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::Disassemble () => %s", static_cast<void *>(frame),
900b9c1b51eSKate Stone                 disassembly);
9014838131bSGreg Clayton 
9024838131bSGreg Clayton   return disassembly;
90330fdc8d8SChris Lattner }
90430fdc8d8SChris Lattner 
905b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics,
906b9c1b51eSKate Stone                                   bool in_scope_only) {
907316d498bSGreg Clayton   SBValueList value_list;
908c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
909c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
910c481c7eeSJim Ingham 
911b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
912d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
913b9c1b51eSKate Stone   if (frame && target) {
914b9c1b51eSKate Stone     lldb::DynamicValueType use_dynamic =
915b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
916b9c1b51eSKate Stone     const bool include_runtime_support_values =
917b9c1b51eSKate Stone         target ? target->GetDisplayRuntimeSupportValues() : false;
91851f96eebSZachary Turner 
91951f96eebSZachary Turner     SBVariablesOptions options;
92051f96eebSZachary Turner     options.SetIncludeArguments(arguments);
92151f96eebSZachary Turner     options.SetIncludeLocals(locals);
92251f96eebSZachary Turner     options.SetIncludeStatics(statics);
92351f96eebSZachary Turner     options.SetInScopeOnly(in_scope_only);
92451f96eebSZachary Turner     options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
92551f96eebSZachary Turner     options.SetUseDynamic(use_dynamic);
92651f96eebSZachary Turner 
92751f96eebSZachary Turner     value_list = GetVariables(options);
928316d498bSGreg Clayton   }
929316d498bSGreg Clayton   return value_list;
93078a685aaSJim Ingham }
93178a685aaSJim Ingham 
932b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals,
933b9c1b51eSKate Stone                                         bool statics, bool in_scope_only,
934b9c1b51eSKate Stone                                         lldb::DynamicValueType use_dynamic) {
935c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
936c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
937c481c7eeSJim Ingham 
938560558ebSEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
939b9c1b51eSKate Stone   const bool include_runtime_support_values =
940b9c1b51eSKate Stone       target ? target->GetDisplayRuntimeSupportValues() : false;
94151f96eebSZachary Turner   SBVariablesOptions options;
94251f96eebSZachary Turner   options.SetIncludeArguments(arguments);
94351f96eebSZachary Turner   options.SetIncludeLocals(locals);
94451f96eebSZachary Turner   options.SetIncludeStatics(statics);
94551f96eebSZachary Turner   options.SetInScopeOnly(in_scope_only);
94651f96eebSZachary Turner   options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
94751f96eebSZachary Turner   options.SetUseDynamic(use_dynamic);
94851f96eebSZachary Turner   return GetVariables(options);
949560558ebSEnrico Granata }
950560558ebSEnrico Granata 
951b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) {
9525160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
953ceb6b139SCaroline Tice 
954b9556accSGreg Clayton   SBValueList value_list;
955bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
956bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
9574fc6cb9cSJim Ingham 
958dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
959d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
960b9556accSGreg Clayton 
96151f96eebSZachary Turner   const bool statics = options.GetIncludeStatics();
96251f96eebSZachary Turner   const bool arguments = options.GetIncludeArguments();
96351f96eebSZachary Turner   const bool locals = options.GetIncludeLocals();
96451f96eebSZachary Turner   const bool in_scope_only = options.GetInScopeOnly();
965b9c1b51eSKate Stone   const bool include_runtime_support_values =
966b9c1b51eSKate Stone       options.GetIncludeRuntimeSupportValues();
96751f96eebSZachary Turner   const lldb::DynamicValueType use_dynamic = options.GetUseDynamic();
96851f96eebSZachary Turner 
969ceb6b139SCaroline Tice   if (log)
970b9c1b51eSKate Stone     log->Printf("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, "
971b9c1b51eSKate Stone                 "in_scope_only=%i runtime=%i dynamic=%i)",
972b9c1b51eSKate Stone                 arguments, locals, statics, in_scope_only,
97351f96eebSZachary Turner                 include_runtime_support_values, use_dynamic);
974ceb6b139SCaroline Tice 
975349213f9SGreg Clayton   std::set<VariableSP> variable_set;
9767730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
977b9c1b51eSKate Stone   if (target && process) {
9787fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
979b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
9807730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
981b9c1b51eSKate Stone       if (frame) {
98230fdc8d8SChris Lattner         size_t i;
983dbb0abbfSEugene Zelenko         VariableList *variable_list = nullptr;
984d9e416c0SGreg Clayton         variable_list = frame->GetVariableList(true);
985b9c1b51eSKate Stone         if (variable_list) {
98630fdc8d8SChris Lattner           const size_t num_variables = variable_list->GetSize();
987b9c1b51eSKate Stone           if (num_variables) {
988b9c1b51eSKate Stone             for (i = 0; i < num_variables; ++i) {
98930fdc8d8SChris Lattner               VariableSP variable_sp(variable_list->GetVariableAtIndex(i));
990b9c1b51eSKate Stone               if (variable_sp) {
99130fdc8d8SChris Lattner                 bool add_variable = false;
992b9c1b51eSKate Stone                 switch (variable_sp->GetScope()) {
99330fdc8d8SChris Lattner                 case eValueTypeVariableGlobal:
99430fdc8d8SChris Lattner                 case eValueTypeVariableStatic:
99563a27afaSGreg Clayton                 case eValueTypeVariableThreadLocal:
99630fdc8d8SChris Lattner                   add_variable = statics;
99730fdc8d8SChris Lattner                   break;
99830fdc8d8SChris Lattner 
99930fdc8d8SChris Lattner                 case eValueTypeVariableArgument:
100030fdc8d8SChris Lattner                   add_variable = arguments;
100130fdc8d8SChris Lattner                   break;
100230fdc8d8SChris Lattner 
100330fdc8d8SChris Lattner                 case eValueTypeVariableLocal:
100430fdc8d8SChris Lattner                   add_variable = locals;
100530fdc8d8SChris Lattner                   break;
1006c982c768SGreg Clayton 
1007c982c768SGreg Clayton                 default:
1008c982c768SGreg Clayton                   break;
100930fdc8d8SChris Lattner                 }
1010b9c1b51eSKate Stone                 if (add_variable) {
1011349213f9SGreg Clayton                   // Only add variables once so we don't end up with duplicates
1012349213f9SGreg Clayton                   if (variable_set.find(variable_sp) == variable_set.end())
1013349213f9SGreg Clayton                     variable_set.insert(variable_sp);
1014349213f9SGreg Clayton                   else
1015349213f9SGreg Clayton                     continue;
1016349213f9SGreg Clayton 
1017d9e416c0SGreg Clayton                   if (in_scope_only && !variable_sp->IsInScope(frame))
101830fdc8d8SChris Lattner                     continue;
101930fdc8d8SChris Lattner 
1020b9c1b51eSKate Stone                   ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable(
1021b9c1b51eSKate Stone                       variable_sp, eNoDynamicValues));
1022560558ebSEnrico Granata 
1023b9c1b51eSKate Stone                   if (!include_runtime_support_values && valobj_sp != nullptr &&
1024dbb0abbfSEugene Zelenko                       valobj_sp->IsRuntimeSupportValue())
1025560558ebSEnrico Granata                     continue;
1026560558ebSEnrico Granata 
1027e3e91517SEnrico Granata                   SBValue value_sb;
1028e3e91517SEnrico Granata                   value_sb.SetSP(valobj_sp, use_dynamic);
1029e3e91517SEnrico Granata                   value_list.Append(value_sb);
103030fdc8d8SChris Lattner                 }
103130fdc8d8SChris Lattner               }
103230fdc8d8SChris Lattner             }
103330fdc8d8SChris Lattner           }
103430fdc8d8SChris Lattner         }
1035b9c1b51eSKate Stone       } else {
1036c9858e4dSGreg Clayton         if (log)
1037b9c1b51eSKate Stone           log->Printf("SBFrame::GetVariables () => error: could not "
1038b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
10397730b9a4SJim Ingham       }
1040b9c1b51eSKate Stone     } else {
10417730b9a4SJim Ingham       if (log)
10427730b9a4SJim Ingham         log->Printf("SBFrame::GetVariables () => error: process is running");
1043c9858e4dSGreg Clayton     }
10447fdf9ef1SGreg Clayton   }
1045ceb6b139SCaroline Tice 
1046ceb6b139SCaroline Tice   if (log)
1047324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetVariables (...) => SBValueList(%p)",
1048324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
1049324a1036SSaleem Abdulrasool                 static_cast<void *>(value_list.opaque_ptr()));
1050ceb6b139SCaroline Tice 
105130fdc8d8SChris Lattner   return value_list;
105230fdc8d8SChris Lattner }
105330fdc8d8SChris Lattner 
1054b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() {
10555160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1056ceb6b139SCaroline Tice 
105730fdc8d8SChris Lattner   SBValueList value_list;
1058bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1059bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
10604fc6cb9cSJim Ingham 
1061dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1062d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
10637730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1064b9c1b51eSKate Stone   if (target && process) {
10657fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1066b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
10677730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1068b9c1b51eSKate Stone       if (frame) {
1069d9e416c0SGreg Clayton         RegisterContextSP reg_ctx(frame->GetRegisterContext());
1070b9c1b51eSKate Stone         if (reg_ctx) {
107130fdc8d8SChris Lattner           const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
1072b9c1b51eSKate Stone           for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
1073b9c1b51eSKate Stone             value_list.Append(
1074b9c1b51eSKate Stone                 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx));
107530fdc8d8SChris Lattner           }
107630fdc8d8SChris Lattner         }
1077b9c1b51eSKate Stone       } else {
1078c9858e4dSGreg Clayton         if (log)
1079b9c1b51eSKate Stone           log->Printf("SBFrame::GetRegisters () => error: could not "
1080b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
10817730b9a4SJim Ingham       }
1082b9c1b51eSKate Stone     } else {
10837730b9a4SJim Ingham       if (log)
10847730b9a4SJim Ingham         log->Printf("SBFrame::GetRegisters () => error: process is running");
1085c9858e4dSGreg Clayton     }
10867fdf9ef1SGreg Clayton   }
1087ceb6b139SCaroline Tice 
1088ceb6b139SCaroline Tice   if (log)
1089324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::GetRegisters () => SBValueList(%p)",
1090324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
1091324a1036SSaleem Abdulrasool                 static_cast<void *>(value_list.opaque_ptr()));
1092ceb6b139SCaroline Tice 
109330fdc8d8SChris Lattner   return value_list;
109430fdc8d8SChris Lattner }
109530fdc8d8SChris Lattner 
1096b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) {
1097ad9a53c5SJason Molenda   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1098ad9a53c5SJason Molenda 
1099ad9a53c5SJason Molenda   SBValue result;
1100ad9a53c5SJason Molenda   ValueObjectSP value_sp;
1101bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1102bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1103ad9a53c5SJason Molenda 
1104dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1105ad9a53c5SJason Molenda   Target *target = exe_ctx.GetTargetPtr();
1106ad9a53c5SJason Molenda   Process *process = exe_ctx.GetProcessPtr();
1107b9c1b51eSKate Stone   if (target && process) {
1108ad9a53c5SJason Molenda     Process::StopLocker stop_locker;
1109b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1110ad9a53c5SJason Molenda       frame = exe_ctx.GetFramePtr();
1111b9c1b51eSKate Stone       if (frame) {
1112ad9a53c5SJason Molenda         RegisterContextSP reg_ctx(frame->GetRegisterContext());
1113b9c1b51eSKate Stone         if (reg_ctx) {
1114ad9a53c5SJason Molenda           const uint32_t num_regs = reg_ctx->GetRegisterCount();
1115b9c1b51eSKate Stone           for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) {
1116b9c1b51eSKate Stone             const RegisterInfo *reg_info =
1117b9c1b51eSKate Stone                 reg_ctx->GetRegisterInfoAtIndex(reg_idx);
1118ad9a53c5SJason Molenda             if (reg_info &&
1119ad9a53c5SJason Molenda                 ((reg_info->name && strcasecmp(reg_info->name, name) == 0) ||
1120b9c1b51eSKate Stone                  (reg_info->alt_name &&
1121b9c1b51eSKate Stone                   strcasecmp(reg_info->alt_name, name) == 0))) {
1122ad9a53c5SJason Molenda               value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx);
1123ad9a53c5SJason Molenda               result.SetSP(value_sp);
1124ad9a53c5SJason Molenda               break;
1125ad9a53c5SJason Molenda             }
1126ad9a53c5SJason Molenda           }
1127ad9a53c5SJason Molenda         }
1128b9c1b51eSKate Stone       } else {
1129ad9a53c5SJason Molenda         if (log)
1130b9c1b51eSKate Stone           log->Printf("SBFrame::FindRegister () => error: could not "
1131b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
1132ad9a53c5SJason Molenda       }
1133b9c1b51eSKate Stone     } else {
1134ad9a53c5SJason Molenda       if (log)
11355d353842SJason Molenda         log->Printf("SBFrame::FindRegister () => error: process is running");
1136ad9a53c5SJason Molenda     }
1137ad9a53c5SJason Molenda   }
1138ad9a53c5SJason Molenda 
1139ad9a53c5SJason Molenda   if (log)
1140324a1036SSaleem Abdulrasool     log->Printf("SBFrame(%p)::FindRegister () => SBValue(%p)",
1141324a1036SSaleem Abdulrasool                 static_cast<void *>(frame),
1142324a1036SSaleem Abdulrasool                 static_cast<void *>(value_sp.get()));
1143ad9a53c5SJason Molenda 
1144ad9a53c5SJason Molenda   return result;
1145ad9a53c5SJason Molenda }
1146ad9a53c5SJason Molenda 
1147b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) {
11485160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1149da7bc7d0SGreg Clayton   Stream &strm = description.ref();
1150da7bc7d0SGreg Clayton 
1151bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1152bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
11534fc6cb9cSJim Ingham 
1154b57e4a1bSJason Molenda   StackFrame *frame;
1155d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
11567730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1157b9c1b51eSKate Stone   if (target && process) {
11587fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1159b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
11607730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1161b9c1b51eSKate Stone       if (frame) {
1162d9e416c0SGreg Clayton         frame->DumpUsingSettingsFormat(&strm);
1163b9c1b51eSKate Stone       } else {
1164c9858e4dSGreg Clayton         if (log)
1165b9c1b51eSKate Stone           log->Printf("SBFrame::GetDescription () => error: could not "
1166b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
11677730b9a4SJim Ingham       }
1168b9c1b51eSKate Stone     } else {
11697730b9a4SJim Ingham       if (log)
11707730b9a4SJim Ingham         log->Printf("SBFrame::GetDescription () => error: process is running");
1171c9858e4dSGreg Clayton     }
1172c9858e4dSGreg Clayton 
1173b9c1b51eSKate Stone   } else
1174da7bc7d0SGreg Clayton     strm.PutCString("No value");
1175dde9cff3SCaroline Tice 
1176dde9cff3SCaroline Tice   return true;
1177dde9cff3SCaroline Tice }
11781d3afba3SGreg Clayton 
1179b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) {
1180316d498bSGreg Clayton   SBValue result;
1181c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1182c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1183c481c7eeSJim Ingham 
1184b57e4a1bSJason Molenda   StackFrame *frame = exe_ctx.GetFramePtr();
1185d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
1186b9c1b51eSKate Stone   if (frame && target) {
118735e1bda6SJim Ingham     SBExpressionOptions options;
1188b9c1b51eSKate Stone     lldb::DynamicValueType fetch_dynamic_value =
1189b9c1b51eSKate Stone         frame->CalculateTarget()->GetPreferDynamicValue();
1190cced1566SGreg Clayton     options.SetFetchDynamicValue(fetch_dynamic_value);
119135e1bda6SJim Ingham     options.SetUnwindOnError(true);
119224785bd0SEugene Leviant     options.SetIgnoreBreakpoints(true);
1193998c8a1cSRyan Brown     if (target->GetLanguage() != eLanguageTypeUnknown)
1194998c8a1cSRyan Brown       options.SetLanguage(target->GetLanguage());
1195998c8a1cSRyan Brown     else
1196998c8a1cSRyan Brown       options.SetLanguage(frame->GetLanguage());
119735e1bda6SJim Ingham     return EvaluateExpression(expr, options);
1198316d498bSGreg Clayton   }
1199316d498bSGreg Clayton   return result;
120078a685aaSJim Ingham }
120178a685aaSJim Ingham 
120278a685aaSJim Ingham SBValue
1203b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr,
1204b9c1b51eSKate Stone                             lldb::DynamicValueType fetch_dynamic_value) {
120535e1bda6SJim Ingham   SBExpressionOptions options;
1206cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
120735e1bda6SJim Ingham   options.SetUnwindOnError(true);
120824785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1209c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1210c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1211c481c7eeSJim Ingham 
1212998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1213998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1214998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1215998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1216998c8a1cSRyan Brown   else if (frame)
1217998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
121835e1bda6SJim Ingham   return EvaluateExpression(expr, options);
12197ba6e991SJim Ingham }
12207ba6e991SJim Ingham 
1221b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr,
1222b9c1b51eSKate Stone                                     lldb::DynamicValueType fetch_dynamic_value,
1223b9c1b51eSKate Stone                                     bool unwind_on_error) {
122435e1bda6SJim Ingham   SBExpressionOptions options;
1225c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1226c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1227c481c7eeSJim Ingham 
1228cced1566SGreg Clayton   options.SetFetchDynamicValue(fetch_dynamic_value);
122935e1bda6SJim Ingham   options.SetUnwindOnError(unwind_on_error);
123024785bd0SEugene Leviant   options.SetIgnoreBreakpoints(true);
1231998c8a1cSRyan Brown   StackFrame *frame = exe_ctx.GetFramePtr();
1232998c8a1cSRyan Brown   Target *target = exe_ctx.GetTargetPtr();
1233998c8a1cSRyan Brown   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1234998c8a1cSRyan Brown     options.SetLanguage(target->GetLanguage());
1235998c8a1cSRyan Brown   else if (frame)
1236998c8a1cSRyan Brown     options.SetLanguage(frame->GetLanguage());
123735e1bda6SJim Ingham   return EvaluateExpression(expr, options);
123835e1bda6SJim Ingham }
123935e1bda6SJim Ingham 
1240b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr,
1241b9c1b51eSKate Stone                                           const SBExpressionOptions &options) {
12425160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
12434838131bSGreg Clayton 
1244358efd65SSaleem Abdulrasool #ifndef LLDB_DISABLE_PYTHON
12455160ce5cSGreg Clayton   Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1246358efd65SSaleem Abdulrasool #endif
1247a162ebafSSean Callanan 
12488646d3c1SJim Ingham   ExpressionResults exe_results = eExpressionSetupError;
124969b582faSGreg Clayton   SBValue expr_result;
12507730b9a4SJim Ingham 
1251b9c1b51eSKate Stone   if (expr == nullptr || expr[0] == '\0') {
12527730b9a4SJim Ingham     if (log)
1253b9c1b51eSKate Stone       log->Printf(
1254b9c1b51eSKate Stone           "SBFrame::EvaluateExpression called with an empty expression");
12557730b9a4SJim Ingham     return expr_result;
12567730b9a4SJim Ingham   }
12577730b9a4SJim Ingham 
125881e871edSGreg Clayton   ValueObjectSP expr_value_sp;
12594838131bSGreg Clayton 
1260bb19a13cSSaleem Abdulrasool   std::unique_lock<std::recursive_mutex> lock;
1261bb19a13cSSaleem Abdulrasool   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
12624fc6cb9cSJim Ingham 
1263b9556accSGreg Clayton   if (log)
12647730b9a4SJim Ingham     log->Printf("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr);
1265b9556accSGreg Clayton 
1266dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
12677730b9a4SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
12687730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
12697730b9a4SJim Ingham 
1270b9c1b51eSKate Stone   if (target && process) {
12717fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1272b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
12737730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1274b9c1b51eSKate Stone       if (frame) {
12758f7db52dSJim Ingham         std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace;
1276b9c1b51eSKate Stone         if (target->GetDisplayExpressionsInCrashlogs()) {
12771ba7c4d0SGreg Clayton           StreamString frame_description;
1278d9e416c0SGreg Clayton           frame->DumpUsingSettingsFormat(&frame_description);
12798f7db52dSJim Ingham           stack_trace = llvm::make_unique<llvm::PrettyStackTraceFormat>(
1280b9c1b51eSKate Stone               "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value "
1281b9c1b51eSKate Stone               "= %u) %s",
1282b9c1b51eSKate Stone               expr, options.GetFetchDynamicValue(),
1283c156427dSZachary Turner               frame_description.GetData());
1284fb6621efSGreg Clayton         }
1285fb6621efSGreg Clayton 
1286b9c1b51eSKate Stone         exe_results = target->EvaluateExpression(expr, frame, expr_value_sp,
128735e1bda6SJim Ingham                                                  options.ref());
1288e3e91517SEnrico Granata         expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
1289b9c1b51eSKate Stone       } else {
1290c9858e4dSGreg Clayton         if (log)
1291b9c1b51eSKate Stone           log->Printf("SBFrame::EvaluateExpression () => error: could not "
1292b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
12937730b9a4SJim Ingham       }
1294b9c1b51eSKate Stone     } else {
12957730b9a4SJim Ingham       if (log)
1296b9c1b51eSKate Stone         log->Printf(
1297b9c1b51eSKate Stone             "SBFrame::EvaluateExpression () => error: process is running");
1298c9858e4dSGreg Clayton     }
12997fdf9ef1SGreg Clayton   }
13004838131bSGreg Clayton 
1301cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1302a162ebafSSean Callanan   if (expr_log)
1303b9c1b51eSKate Stone     expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is "
1304b9c1b51eSKate Stone                      "%s, summary %s **",
1305324a1036SSaleem Abdulrasool                      expr_result.GetValue(), expr_result.GetSummary());
1306a162ebafSSean Callanan 
13074838131bSGreg Clayton   if (log)
1308b9c1b51eSKate Stone     log->Printf("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) "
1309b9c1b51eSKate Stone                 "(execution result=%d)",
1310324a1036SSaleem Abdulrasool                 static_cast<void *>(frame), expr,
1311324a1036SSaleem Abdulrasool                 static_cast<void *>(expr_value_sp.get()), exe_results);
1312cf7e2dc0SJason Molenda #endif
13134838131bSGreg Clayton 
1314cfd1acedSGreg Clayton   return expr_result;
13151d3afba3SGreg Clayton }
1316316d498bSGreg Clayton 
1317b9c1b51eSKate Stone bool SBFrame::IsInlined() {
131805f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->IsInlined();
131905f75e9fSOleksiy Vyalov }
132005f75e9fSOleksiy Vyalov 
1321b9c1b51eSKate Stone bool SBFrame::IsInlined() const {
13225160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1323c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1324c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1325c481c7eeSJim Ingham 
1326dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1327d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
13287730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1329b9c1b51eSKate Stone   if (target && process) {
13307fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1331b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
13327730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1333b9c1b51eSKate Stone       if (frame) {
13347fdf9ef1SGreg Clayton 
1335d9e416c0SGreg Clayton         Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1336316d498bSGreg Clayton         if (block)
1337dbb0abbfSEugene Zelenko           return block->GetContainingInlinedBlock() != nullptr;
1338b9c1b51eSKate Stone       } else {
1339c9858e4dSGreg Clayton         if (log)
1340b9c1b51eSKate Stone           log->Printf("SBFrame::IsInlined () => error: could not reconstruct "
1341b9c1b51eSKate Stone                       "frame object for this SBFrame.");
13427730b9a4SJim Ingham       }
1343b9c1b51eSKate Stone     } else {
13447730b9a4SJim Ingham       if (log)
13457730b9a4SJim Ingham         log->Printf("SBFrame::IsInlined () => error: process is running");
1346c9858e4dSGreg Clayton     }
13477fdf9ef1SGreg Clayton   }
1348316d498bSGreg Clayton   return false;
1349316d498bSGreg Clayton }
1350316d498bSGreg Clayton 
1351b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() {
135205f75e9fSOleksiy Vyalov   return static_cast<const SBFrame *>(this)->GetFunctionName();
135305f75e9fSOleksiy Vyalov }
135405f75e9fSOleksiy Vyalov 
1355bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const {
1356bdbdd229SJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1357bdbdd229SJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1358bdbdd229SJim Ingham 
1359bdbdd229SJim Ingham   StackFrame *frame = nullptr;
1360bdbdd229SJim Ingham   Target *target = exe_ctx.GetTargetPtr();
1361bdbdd229SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1362bdbdd229SJim Ingham   if (target && process) {
1363bdbdd229SJim Ingham     Process::StopLocker stop_locker;
1364bdbdd229SJim Ingham     if (stop_locker.TryLock(&process->GetRunLock())) {
1365bdbdd229SJim Ingham       frame = exe_ctx.GetFramePtr();
1366bdbdd229SJim Ingham       if (frame) {
1367bdbdd229SJim Ingham         return frame->GuessLanguage();
1368bdbdd229SJim Ingham       }
1369bdbdd229SJim Ingham     }
1370bdbdd229SJim Ingham   }
1371bdbdd229SJim Ingham   return eLanguageTypeUnknown;
1372bdbdd229SJim Ingham }
1373bdbdd229SJim Ingham 
1374b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const {
13755160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1376dbb0abbfSEugene Zelenko   const char *name = nullptr;
1377c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1378c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1379c481c7eeSJim Ingham 
1380dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1381d9e416c0SGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
13827730b9a4SJim Ingham   Process *process = exe_ctx.GetProcessPtr();
1383b9c1b51eSKate Stone   if (target && process) {
13847fdf9ef1SGreg Clayton     Process::StopLocker stop_locker;
1385b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
13867730b9a4SJim Ingham       frame = exe_ctx.GetFramePtr();
1387b9c1b51eSKate Stone       if (frame) {
1388b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1389b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1390b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1391b9c1b51eSKate Stone         if (sc.block) {
1392316d498bSGreg Clayton           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1393b9c1b51eSKate Stone           if (inlined_block) {
1394b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1395b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
1396b9c1b51eSKate Stone             name =
1397b9c1b51eSKate Stone                 inlined_info->GetName(sc.function->GetLanguage()).AsCString();
1398316d498bSGreg Clayton           }
1399316d498bSGreg Clayton         }
1400316d498bSGreg Clayton 
1401b9c1b51eSKate Stone         if (name == nullptr) {
1402316d498bSGreg Clayton           if (sc.function)
1403316d498bSGreg Clayton             name = sc.function->GetName().GetCString();
1404316d498bSGreg Clayton         }
1405316d498bSGreg Clayton 
1406b9c1b51eSKate Stone         if (name == nullptr) {
1407316d498bSGreg Clayton           if (sc.symbol)
1408316d498bSGreg Clayton             name = sc.symbol->GetName().GetCString();
1409316d498bSGreg Clayton         }
1410b9c1b51eSKate Stone       } else {
1411c9858e4dSGreg Clayton         if (log)
1412b9c1b51eSKate Stone           log->Printf("SBFrame::GetFunctionName () => error: could not "
1413b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
14147730b9a4SJim Ingham       }
1415b9c1b51eSKate Stone     } else {
14167730b9a4SJim Ingham       if (log)
14177730b9a4SJim Ingham         log->Printf("SBFrame::GetFunctionName() => error: process is running");
1418c9858e4dSGreg Clayton     }
14197fdf9ef1SGreg Clayton   }
1420316d498bSGreg Clayton   return name;
1421316d498bSGreg Clayton }
1422c1f705c2SEnrico Granata 
1423b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() {
1424c1f705c2SEnrico Granata   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1425dbb0abbfSEugene Zelenko   const char *name = nullptr;
1426c481c7eeSJim Ingham 
1427c481c7eeSJim Ingham   std::unique_lock<std::recursive_mutex> lock;
1428c481c7eeSJim Ingham   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1429c481c7eeSJim Ingham 
1430dbb0abbfSEugene Zelenko   StackFrame *frame = nullptr;
1431c1f705c2SEnrico Granata   Target *target = exe_ctx.GetTargetPtr();
1432c1f705c2SEnrico Granata   Process *process = exe_ctx.GetProcessPtr();
1433b9c1b51eSKate Stone   if (target && process) {
1434c1f705c2SEnrico Granata     Process::StopLocker stop_locker;
1435b9c1b51eSKate Stone     if (stop_locker.TryLock(&process->GetRunLock())) {
1436c1f705c2SEnrico Granata       frame = exe_ctx.GetFramePtr();
1437b9c1b51eSKate Stone       if (frame) {
1438b9c1b51eSKate Stone         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1439b9c1b51eSKate Stone                                                  eSymbolContextBlock |
1440b9c1b51eSKate Stone                                                  eSymbolContextSymbol));
1441b9c1b51eSKate Stone         if (sc.block) {
1442c1f705c2SEnrico Granata           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1443b9c1b51eSKate Stone           if (inlined_block) {
1444b9c1b51eSKate Stone             const InlineFunctionInfo *inlined_info =
1445b9c1b51eSKate Stone                 inlined_block->GetInlinedFunctionInfo();
1446b9c1b51eSKate Stone             name = inlined_info->GetDisplayName(sc.function->GetLanguage())
1447b9c1b51eSKate Stone                        .AsCString();
1448c1f705c2SEnrico Granata           }
1449c1f705c2SEnrico Granata         }
1450c1f705c2SEnrico Granata 
1451b9c1b51eSKate Stone         if (name == nullptr) {
1452c1f705c2SEnrico Granata           if (sc.function)
1453c1f705c2SEnrico Granata             name = sc.function->GetDisplayName().GetCString();
1454c1f705c2SEnrico Granata         }
1455c1f705c2SEnrico Granata 
1456b9c1b51eSKate Stone         if (name == nullptr) {
1457c1f705c2SEnrico Granata           if (sc.symbol)
1458c1f705c2SEnrico Granata             name = sc.symbol->GetDisplayName().GetCString();
1459c1f705c2SEnrico Granata         }
1460b9c1b51eSKate Stone       } else {
1461c1f705c2SEnrico Granata         if (log)
1462b9c1b51eSKate Stone           log->Printf("SBFrame::GetDisplayFunctionName () => error: could not "
1463b9c1b51eSKate Stone                       "reconstruct frame object for this SBFrame.");
1464c1f705c2SEnrico Granata       }
1465b9c1b51eSKate Stone     } else {
1466c1f705c2SEnrico Granata       if (log)
1467b9c1b51eSKate Stone         log->Printf(
1468b9c1b51eSKate Stone             "SBFrame::GetDisplayFunctionName() => error: process is running");
1469c1f705c2SEnrico Granata     }
1470c1f705c2SEnrico Granata   }
1471c1f705c2SEnrico Granata   return name;
1472c1f705c2SEnrico Granata }
1473