180814287SRaphael Isemann //===-- SBFrame.cpp -------------------------------------------------------===//
230fdc8d8SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner
930fdc8d8SChris Lattner #include <algorithm>
10349213f9SGreg Clayton #include <set>
11dbb0abbfSEugene Zelenko #include <string>
12dbb0abbfSEugene Zelenko
13dbb0abbfSEugene Zelenko #include "lldb/API/SBFrame.h"
1430fdc8d8SChris Lattner
1530fdc8d8SChris Lattner #include "lldb/lldb-types.h"
1630fdc8d8SChris Lattner
17bd4bf82aSJonas Devlieghere #include "Utils.h"
1830fdc8d8SChris Lattner #include "lldb/Core/Address.h"
1930fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2030fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h"
2130fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h"
22347ec0faSAlex Langford #include "lldb/Expression/ExpressionVariable.h"
23151c032cSJim Ingham #include "lldb/Expression/UserExpression.h"
241ba7c4d0SGreg Clayton #include "lldb/Host/Host.h"
2530fdc8d8SChris Lattner #include "lldb/Symbol/Block.h"
261f746071SGreg Clayton #include "lldb/Symbol/Function.h"
271f746071SGreg Clayton #include "lldb/Symbol/Symbol.h"
2830fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h"
2930fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h"
30b9c1b51eSKate Stone #include "lldb/Symbol/VariableList.h"
3130fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h"
3230fdc8d8SChris Lattner #include "lldb/Target/Process.h"
3330fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
34b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h"
3541ae8e74SKuba Mracek #include "lldb/Target/StackFrameRecognizer.h"
36b9556accSGreg Clayton #include "lldb/Target/StackID.h"
37b9c1b51eSKate Stone #include "lldb/Target/Target.h"
3830fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
39bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h"
401755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
41c34698a8SPavel Labath #include "lldb/Utility/LLDBLog.h"
42bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
4330fdc8d8SChris Lattner
444c5de699SEli Friedman #include "lldb/API/SBAddress.h"
45b9c1b51eSKate Stone #include "lldb/API/SBDebugger.h"
4635e1bda6SJim Ingham #include "lldb/API/SBExpressionOptions.h"
47dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
484c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h"
494c5de699SEli Friedman #include "lldb/API/SBThread.h"
50b9c1b51eSKate Stone #include "lldb/API/SBValue.h"
5151f96eebSZachary Turner #include "lldb/API/SBVariablesOptions.h"
5230fdc8d8SChris Lattner
53237c3ed9SSean Callanan #include "llvm/Support/PrettyStackTrace.h"
54237c3ed9SSean Callanan
5530fdc8d8SChris Lattner using namespace lldb;
5630fdc8d8SChris Lattner using namespace lldb_private;
5730fdc8d8SChris Lattner
SBFrame()58baf5664fSJonas Devlieghere SBFrame::SBFrame() : m_opaque_sp(new ExecutionContextRef()) {
591755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
60baf5664fSJonas Devlieghere }
6130fdc8d8SChris Lattner
SBFrame(const StackFrameSP & lldb_object_sp)62b9c1b51eSKate Stone SBFrame::SBFrame(const StackFrameSP &lldb_object_sp)
63b9c1b51eSKate Stone : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) {
641755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, lldb_object_sp);
6530fdc8d8SChris Lattner }
6630fdc8d8SChris Lattner
SBFrame(const SBFrame & rhs)67a3436f73SKazu Hirata SBFrame::SBFrame(const SBFrame &rhs) {
681755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
69baf5664fSJonas Devlieghere
70bd4bf82aSJonas Devlieghere m_opaque_sp = clone(rhs.m_opaque_sp);
71bd4bf82aSJonas Devlieghere }
72efabb123SGreg Clayton
73dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default;
74dbb0abbfSEugene Zelenko
operator =(const SBFrame & rhs)75b9c1b51eSKate Stone const SBFrame &SBFrame::operator=(const SBFrame &rhs) {
761755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
77baf5664fSJonas Devlieghere
78efabb123SGreg Clayton if (this != &rhs)
79bd4bf82aSJonas Devlieghere m_opaque_sp = clone(rhs.m_opaque_sp);
80d232abc3SJonas Devlieghere return *this;
81efabb123SGreg Clayton }
82efabb123SGreg Clayton
GetFrameSP() const83b9c1b51eSKate Stone StackFrameSP SBFrame::GetFrameSP() const {
84dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetFrameSP() : StackFrameSP());
85b9556accSGreg Clayton }
8630fdc8d8SChris Lattner
SetFrameSP(const StackFrameSP & lldb_object_sp)87b9c1b51eSKate Stone void SBFrame::SetFrameSP(const StackFrameSP &lldb_object_sp) {
887fdf9ef1SGreg Clayton return m_opaque_sp->SetFrameSP(lldb_object_sp);
89b9556accSGreg Clayton }
9030fdc8d8SChris Lattner
IsValid() const91b9c1b51eSKate Stone bool SBFrame::IsValid() const {
921755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
937f5237bcSPavel Labath return this->operator bool();
947f5237bcSPavel Labath }
operator bool() const957f5237bcSPavel Labath SBFrame::operator bool() const {
961755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
97baf5664fSJonas Devlieghere
98bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
99bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1007fa7dc36SJim Ingham
1017fa7dc36SJim Ingham Target *target = exe_ctx.GetTargetPtr();
1027fa7dc36SJim Ingham Process *process = exe_ctx.GetProcessPtr();
103b9c1b51eSKate Stone if (target && process) {
1047fa7dc36SJim Ingham Process::StopLocker stop_locker;
1057fa7dc36SJim Ingham if (stop_locker.TryLock(&process->GetRunLock()))
106dbb0abbfSEugene Zelenko return GetFrameSP().get() != nullptr;
10730fdc8d8SChris Lattner }
10830fdc8d8SChris Lattner
1097fa7dc36SJim Ingham // Without a target & process we can't have a valid stack frame.
1107fa7dc36SJim Ingham return false;
1117fa7dc36SJim Ingham }
1127fa7dc36SJim Ingham
GetSymbolContext(uint32_t resolve_scope) const113b9c1b51eSKate Stone SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const {
1141755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, resolve_scope);
115baf5664fSJonas Devlieghere
11630fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx;
117bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
118bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
119991e4453SZachary Turner SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope);
120d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
1217730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
122b9c1b51eSKate Stone if (target && process) {
1237fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
124b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
1252efc6892SPavel Labath if (StackFrame *frame = exe_ctx.GetFramePtr())
1262efc6892SPavel Labath sb_sym_ctx = frame->GetSymbolContext(scope);
127c9858e4dSGreg Clayton }
1287fdf9ef1SGreg Clayton }
129ceb6b139SCaroline Tice
130d232abc3SJonas Devlieghere return sb_sym_ctx;
13130fdc8d8SChris Lattner }
13230fdc8d8SChris Lattner
GetModule() const133b9c1b51eSKate Stone SBModule SBFrame::GetModule() const {
1341755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
135baf5664fSJonas Devlieghere
13672eff18aSGreg Clayton SBModule sb_module;
137acdbe816SGreg Clayton ModuleSP module_sp;
138bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
139bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1404fc6cb9cSJim Ingham
141dbb0abbfSEugene Zelenko StackFrame *frame = nullptr;
142d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
1437730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
144b9c1b51eSKate Stone if (target && process) {
1457fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
146b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
1477730b9a4SJim Ingham frame = exe_ctx.GetFramePtr();
148b9c1b51eSKate Stone if (frame) {
149d9e416c0SGreg Clayton module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp;
150acdbe816SGreg Clayton sb_module.SetSP(module_sp);
151c9858e4dSGreg Clayton }
1527fdf9ef1SGreg Clayton }
153581af8b0SJonas Devlieghere }
1544838131bSGreg Clayton
155d232abc3SJonas Devlieghere return sb_module;
15630fdc8d8SChris Lattner }
15730fdc8d8SChris Lattner
GetCompileUnit() const158b9c1b51eSKate Stone SBCompileUnit SBFrame::GetCompileUnit() const {
1591755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
160baf5664fSJonas Devlieghere
16172eff18aSGreg Clayton SBCompileUnit sb_comp_unit;
162bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
163bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1644fc6cb9cSJim Ingham
165dbb0abbfSEugene Zelenko StackFrame *frame = nullptr;
166d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
1677730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
168b9c1b51eSKate Stone if (target && process) {
1697fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
170b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
1717730b9a4SJim Ingham frame = exe_ctx.GetFramePtr();
172b9c1b51eSKate Stone if (frame) {
173b9c1b51eSKate Stone sb_comp_unit.reset(
174b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit);
175c9858e4dSGreg Clayton }
176c9858e4dSGreg Clayton }
177581af8b0SJonas Devlieghere }
178ceb6b139SCaroline Tice
179d232abc3SJonas Devlieghere return sb_comp_unit;
18030fdc8d8SChris Lattner }
18130fdc8d8SChris Lattner
GetFunction() const182b9c1b51eSKate Stone SBFunction SBFrame::GetFunction() const {
1831755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
184baf5664fSJonas Devlieghere
18572eff18aSGreg Clayton SBFunction sb_function;
186bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
187bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1884fc6cb9cSJim Ingham
189dbb0abbfSEugene Zelenko StackFrame *frame = nullptr;
190d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
1917730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
192b9c1b51eSKate Stone if (target && process) {
1937fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
194b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
1957730b9a4SJim Ingham frame = exe_ctx.GetFramePtr();
196b9c1b51eSKate Stone if (frame) {
197b9c1b51eSKate Stone sb_function.reset(
198b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextFunction).function);
1997fdf9ef1SGreg Clayton }
200c9858e4dSGreg Clayton }
201581af8b0SJonas Devlieghere }
2024838131bSGreg Clayton
203d232abc3SJonas Devlieghere return sb_function;
20430fdc8d8SChris Lattner }
20530fdc8d8SChris Lattner
GetSymbol() const206b9c1b51eSKate Stone SBSymbol SBFrame::GetSymbol() const {
2071755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
208baf5664fSJonas Devlieghere
20972eff18aSGreg Clayton SBSymbol sb_symbol;
210bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
211bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2124fc6cb9cSJim Ingham
213dbb0abbfSEugene Zelenko StackFrame *frame = nullptr;
214d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
2157730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
216b9c1b51eSKate Stone if (target && process) {
2177fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
218b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
2197730b9a4SJim Ingham frame = exe_ctx.GetFramePtr();
220b9c1b51eSKate Stone if (frame) {
221d9e416c0SGreg Clayton sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol);
2227fdf9ef1SGreg Clayton }
223c9858e4dSGreg Clayton }
224581af8b0SJonas Devlieghere }
225581af8b0SJonas Devlieghere
226d232abc3SJonas Devlieghere return sb_symbol;
2273b06557eSGreg Clayton }
2283b06557eSGreg Clayton
GetBlock() const229b9c1b51eSKate Stone SBBlock SBFrame::GetBlock() const {
2301755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
231baf5664fSJonas Devlieghere
23272eff18aSGreg Clayton SBBlock sb_block;
233bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
234bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2354fc6cb9cSJim Ingham
236dbb0abbfSEugene Zelenko StackFrame *frame = nullptr;
237d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
2387730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
239b9c1b51eSKate Stone if (target && process) {
2407fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
241b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
2427730b9a4SJim Ingham frame = exe_ctx.GetFramePtr();
243581af8b0SJonas Devlieghere if (frame)
244d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block);
2457fdf9ef1SGreg Clayton }
246c9858e4dSGreg Clayton }
247d232abc3SJonas Devlieghere return sb_block;
24830fdc8d8SChris Lattner }
24930fdc8d8SChris Lattner
GetFrameBlock() const250b9c1b51eSKate Stone SBBlock SBFrame::GetFrameBlock() const {
2511755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
252baf5664fSJonas Devlieghere
25372eff18aSGreg Clayton SBBlock sb_block;
254bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
255bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2564fc6cb9cSJim Ingham
257dbb0abbfSEugene Zelenko StackFrame *frame = nullptr;
258d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
2597730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
260b9c1b51eSKate Stone if (target && process) {
2617fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
262b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
2637730b9a4SJim Ingham frame = exe_ctx.GetFramePtr();
264581af8b0SJonas Devlieghere if (frame)
265d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetFrameBlock());
2667fdf9ef1SGreg Clayton }
267c9858e4dSGreg Clayton }
268d232abc3SJonas Devlieghere return sb_block;
26995897c6aSGreg Clayton }
27095897c6aSGreg Clayton
GetLineEntry() const271b9c1b51eSKate Stone SBLineEntry SBFrame::GetLineEntry() const {
2721755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
273baf5664fSJonas Devlieghere
27472eff18aSGreg Clayton SBLineEntry sb_line_entry;
275bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
276bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
2774fc6cb9cSJim Ingham
278dbb0abbfSEugene Zelenko StackFrame *frame = nullptr;
279d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
2807730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
281b9c1b51eSKate Stone if (target && process) {
2827fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
283b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
2847730b9a4SJim Ingham frame = exe_ctx.GetFramePtr();
285b9c1b51eSKate Stone if (frame) {
286b9c1b51eSKate Stone sb_line_entry.SetLineEntry(
287b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextLineEntry).line_entry);
2887fdf9ef1SGreg Clayton }
289c9858e4dSGreg Clayton }
290581af8b0SJonas Devlieghere }
291d232abc3SJonas Devlieghere return sb_line_entry;
29230fdc8d8SChris Lattner }
29330fdc8d8SChris Lattner
GetFrameID() const294b9c1b51eSKate Stone uint32_t SBFrame::GetFrameID() const {
2951755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
296baf5664fSJonas Devlieghere
297b9556accSGreg Clayton uint32_t frame_idx = UINT32_MAX;
298b9556accSGreg Clayton
299c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock;
300c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
301c481c7eeSJim Ingham
302b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr();
3037fdf9ef1SGreg Clayton if (frame)
304d9e416c0SGreg Clayton frame_idx = frame->GetFrameIndex();
3054838131bSGreg Clayton
3064838131bSGreg Clayton return frame_idx;
30730fdc8d8SChris Lattner }
30830fdc8d8SChris Lattner
GetCFA() const309b9c1b51eSKate Stone lldb::addr_t SBFrame::GetCFA() const {
3101755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
311baf5664fSJonas Devlieghere
312c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock;
313c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
314c481c7eeSJim Ingham
315424a5dbcSGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr();
316424a5dbcSGreg Clayton if (frame)
317424a5dbcSGreg Clayton return frame->GetStackID().GetCallFrameAddress();
318424a5dbcSGreg Clayton return LLDB_INVALID_ADDRESS;
319424a5dbcSGreg Clayton }
320424a5dbcSGreg Clayton
GetPC() const321b9c1b51eSKate Stone addr_t SBFrame::GetPC() const {
3221755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
323baf5664fSJonas Devlieghere
32469b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS;
325bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
326bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3274fc6cb9cSJim Ingham
328dbb0abbfSEugene Zelenko StackFrame *frame = nullptr;
329d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
3307730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
331b9c1b51eSKate Stone if (target && process) {
3327fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
333b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
3347730b9a4SJim Ingham frame = exe_ctx.GetFramePtr();
335b9c1b51eSKate Stone if (frame) {
336b9c1b51eSKate Stone addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress(
33704803b3eSTatyana Krasnukha target, AddressClass::eCode);
338c9858e4dSGreg Clayton }
3397fdf9ef1SGreg Clayton }
340581af8b0SJonas Devlieghere }
341ceb6b139SCaroline Tice
342ceb6b139SCaroline Tice return addr;
34330fdc8d8SChris Lattner }
34430fdc8d8SChris Lattner
SetPC(addr_t new_pc)345b9c1b51eSKate Stone bool SBFrame::SetPC(addr_t new_pc) {
3461755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, new_pc);
347baf5664fSJonas Devlieghere
348ceb6b139SCaroline Tice bool ret_val = false;
349bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
350bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3514fc6cb9cSJim Ingham
352d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
3537730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
354b9c1b51eSKate Stone if (target && process) {
3557fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
356b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
3570d7401cfSMed Ismail Bennani if (StackFrame *frame = exe_ctx.GetFramePtr()) {
3580d7401cfSMed Ismail Bennani if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
3590d7401cfSMed Ismail Bennani ret_val = reg_ctx_sp->SetPC(new_pc);
3600d7401cfSMed Ismail Bennani }
361c9858e4dSGreg Clayton }
3627fdf9ef1SGreg Clayton }
363581af8b0SJonas Devlieghere }
364ceb6b139SCaroline Tice
365ceb6b139SCaroline Tice return ret_val;
36630fdc8d8SChris Lattner }
36730fdc8d8SChris Lattner
GetSP() const368b9c1b51eSKate Stone addr_t SBFrame::GetSP() const {
3691755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
370baf5664fSJonas Devlieghere
3714838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS;
372bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
373bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3744fc6cb9cSJim Ingham
375d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
3767730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
377b9c1b51eSKate Stone if (target && process) {
3787fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
379b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
3800d7401cfSMed Ismail Bennani if (StackFrame *frame = exe_ctx.GetFramePtr()) {
3810d7401cfSMed Ismail Bennani if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
3820d7401cfSMed Ismail Bennani addr = reg_ctx_sp->GetSP();
3830d7401cfSMed Ismail Bennani }
3847fdf9ef1SGreg Clayton }
385c9858e4dSGreg Clayton }
386581af8b0SJonas Devlieghere }
3874838131bSGreg Clayton
3884838131bSGreg Clayton return addr;
38930fdc8d8SChris Lattner }
39030fdc8d8SChris Lattner
GetFP() const391b9c1b51eSKate Stone addr_t SBFrame::GetFP() const {
3921755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
393baf5664fSJonas Devlieghere
39469b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS;
395bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
396bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
3974fc6cb9cSJim Ingham
398d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
3997730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
400b9c1b51eSKate Stone if (target && process) {
4017fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
402b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
4030d7401cfSMed Ismail Bennani if (StackFrame *frame = exe_ctx.GetFramePtr()) {
4040d7401cfSMed Ismail Bennani if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
4050d7401cfSMed Ismail Bennani addr = reg_ctx_sp->GetFP();
4060d7401cfSMed Ismail Bennani }
4070d7401cfSMed Ismail Bennani }
408c9858e4dSGreg Clayton }
4097fdf9ef1SGreg Clayton }
410ceb6b139SCaroline Tice
411ceb6b139SCaroline Tice return addr;
41230fdc8d8SChris Lattner }
41330fdc8d8SChris Lattner
GetPCAddress() const414b9c1b51eSKate Stone SBAddress SBFrame::GetPCAddress() const {
4151755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
416baf5664fSJonas Devlieghere
41730fdc8d8SChris Lattner SBAddress sb_addr;
418bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
419bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4204fc6cb9cSJim Ingham
421b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr();
422d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
4237730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
424b9c1b51eSKate Stone if (target && process) {
4257fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
426b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
4277730b9a4SJim Ingham frame = exe_ctx.GetFramePtr();
428581af8b0SJonas Devlieghere if (frame)
4296cd4a4cdSJonas Devlieghere sb_addr.SetAddress(frame->GetFrameCodeAddress());
4307fdf9ef1SGreg Clayton }
431c9858e4dSGreg Clayton }
432d232abc3SJonas Devlieghere return sb_addr;
43330fdc8d8SChris Lattner }
43430fdc8d8SChris Lattner
Clear()435baf5664fSJonas Devlieghere void SBFrame::Clear() {
4361755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
437baf5664fSJonas Devlieghere
438baf5664fSJonas Devlieghere m_opaque_sp->Clear();
439baf5664fSJonas Devlieghere }
44030fdc8d8SChris Lattner
GetValueForVariablePath(const char * var_path)441b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) {
4421755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, var_path);
443baf5664fSJonas Devlieghere
4447edbdfc9SGreg Clayton SBValue sb_value;
445c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock;
446c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
447c481c7eeSJim Ingham
448b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr();
449d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
450b9c1b51eSKate Stone if (frame && target) {
451b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic =
452b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue();
4537edbdfc9SGreg Clayton sb_value = GetValueForVariablePath(var_path, use_dynamic);
4547edbdfc9SGreg Clayton }
455d232abc3SJonas Devlieghere return sb_value;
4567edbdfc9SGreg Clayton }
4577edbdfc9SGreg Clayton
GetValueForVariablePath(const char * var_path,DynamicValueType use_dynamic)458b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path,
459b9c1b51eSKate Stone DynamicValueType use_dynamic) {
4601755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, var_path, use_dynamic);
461baf5664fSJonas Devlieghere
4627edbdfc9SGreg Clayton SBValue sb_value;
463b9c1b51eSKate Stone if (var_path == nullptr || var_path[0] == '\0') {
464d232abc3SJonas Devlieghere return sb_value;
4657730b9a4SJim Ingham }
4667730b9a4SJim Ingham
467bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
468bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
4694fc6cb9cSJim Ingham
470dbb0abbfSEugene Zelenko StackFrame *frame = nullptr;
471d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
4727730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
473b9c1b51eSKate Stone if (target && process) {
4747fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
475b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
4767730b9a4SJim Ingham frame = exe_ctx.GetFramePtr();
477b9c1b51eSKate Stone if (frame) {
4787edbdfc9SGreg Clayton VariableSP var_sp;
47997206d57SZachary Turner Status error;
480b9c1b51eSKate Stone ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath(
481b9c1b51eSKate Stone var_path, eNoDynamicValues,
482b9c1b51eSKate Stone StackFrame::eExpressionPathOptionCheckPtrVsMember |
483b9c1b51eSKate Stone StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
484b9c1b51eSKate Stone var_sp, error));
485e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic);
4867730b9a4SJim Ingham }
487c9858e4dSGreg Clayton }
4887fdf9ef1SGreg Clayton }
489d232abc3SJonas Devlieghere return sb_value;
4907edbdfc9SGreg Clayton }
4917edbdfc9SGreg Clayton
FindVariable(const char * name)492b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name) {
4931755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name);
494baf5664fSJonas Devlieghere
495316d498bSGreg Clayton SBValue value;
496c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock;
497c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
498c481c7eeSJim Ingham
499b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr();
500d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
501b9c1b51eSKate Stone if (frame && target) {
502b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic =
503b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue();
504316d498bSGreg Clayton value = FindVariable(name, use_dynamic);
505316d498bSGreg Clayton }
506d232abc3SJonas Devlieghere return value;
50778a685aaSJim Ingham }
50878a685aaSJim Ingham
FindVariable(const char * name,lldb::DynamicValueType use_dynamic)509b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name,
510b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) {
5111755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name, use_dynamic);
512baf5664fSJonas Devlieghere
51369b582faSGreg Clayton VariableSP var_sp;
51458b59f95SJim Ingham SBValue sb_value;
5157730b9a4SJim Ingham
516b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') {
517d232abc3SJonas Devlieghere return sb_value;
5187730b9a4SJim Ingham }
5197730b9a4SJim Ingham
52081e871edSGreg Clayton ValueObjectSP value_sp;
521bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
522bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5234fc6cb9cSJim Ingham
524dbb0abbfSEugene Zelenko StackFrame *frame = nullptr;
525d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
5267730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
527b9c1b51eSKate Stone if (target && process) {
5287fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
529b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
5307730b9a4SJim Ingham frame = exe_ctx.GetFramePtr();
531b9c1b51eSKate Stone if (frame) {
532e23d0b63SShafik Yaghmour value_sp = frame->FindVariable(ConstString(name));
53330fdc8d8SChris Lattner
534e23d0b63SShafik Yaghmour if (value_sp)
535e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic);
536c9858e4dSGreg Clayton }
537316d498bSGreg Clayton }
538581af8b0SJonas Devlieghere }
5394838131bSGreg Clayton
540d232abc3SJonas Devlieghere return sb_value;
541dde9cff3SCaroline Tice }
542dde9cff3SCaroline Tice
FindValue(const char * name,ValueType value_type)543b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) {
5441755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name, value_type);
545baf5664fSJonas Devlieghere
546316d498bSGreg Clayton SBValue value;
547c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock;
548c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
549c481c7eeSJim Ingham
550b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr();
551d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
552b9c1b51eSKate Stone if (frame && target) {
553b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic =
554b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue();
555316d498bSGreg Clayton value = FindValue(name, value_type, use_dynamic);
556316d498bSGreg Clayton }
557d232abc3SJonas Devlieghere return value;
55878a685aaSJim Ingham }
55978a685aaSJim Ingham
FindValue(const char * name,ValueType value_type,lldb::DynamicValueType use_dynamic)560b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type,
561b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) {
5621755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name, value_type, use_dynamic);
563baf5664fSJonas Devlieghere
56469b582faSGreg Clayton SBValue sb_value;
5657730b9a4SJim Ingham
566b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') {
567d232abc3SJonas Devlieghere return sb_value;
5687730b9a4SJim Ingham }
5697730b9a4SJim Ingham
57081e871edSGreg Clayton ValueObjectSP value_sp;
571bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
572bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
5734fc6cb9cSJim Ingham
574dbb0abbfSEugene Zelenko StackFrame *frame = nullptr;
575d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
5767730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
577b9c1b51eSKate Stone if (target && process) {
5787fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
579b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
5807730b9a4SJim Ingham frame = exe_ctx.GetFramePtr();
581b9c1b51eSKate Stone if (frame) {
5828a2a0dfbSEnrico Granata VariableList variable_list;
5838a2a0dfbSEnrico Granata
584b9c1b51eSKate Stone switch (value_type) {
58569b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable
58669b582faSGreg Clayton case eValueTypeVariableStatic: // static variable
58769b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables
58869b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables
58963a27afaSGreg Clayton case eValueTypeVariableThreadLocal: // thread local variables
59069b582faSGreg Clayton {
591d9e416c0SGreg Clayton SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock));
59272eff18aSGreg Clayton
59372eff18aSGreg Clayton const bool can_create = true;
59472eff18aSGreg Clayton const bool get_parent_variables = true;
59572eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true;
59672eff18aSGreg Clayton
5970efb51a0SChaoren Lin if (sc.block)
598b9c1b51eSKate Stone sc.block->AppendVariables(
599b9c1b51eSKate Stone can_create, get_parent_variables,
600b9c1b51eSKate Stone stop_if_block_is_inlined_function,
601b9c1b51eSKate Stone [frame](Variable *v) { return v->IsInScope(frame); },
602b9c1b51eSKate Stone &variable_list);
603b9c1b51eSKate Stone if (value_type == eValueTypeVariableGlobal) {
6048a2a0dfbSEnrico Granata const bool get_file_globals = true;
6058a2a0dfbSEnrico Granata VariableList *frame_vars = frame->GetVariableList(get_file_globals);
6068a2a0dfbSEnrico Granata if (frame_vars)
6078a2a0dfbSEnrico Granata frame_vars->AppendVariablesIfUnique(variable_list);
6088a2a0dfbSEnrico Granata }
60969b582faSGreg Clayton ConstString const_name(name);
610b9c1b51eSKate Stone VariableSP variable_sp(
611b9c1b51eSKate Stone variable_list.FindVariable(const_name, value_type));
612b9c1b51eSKate Stone if (variable_sp) {
613b9c1b51eSKate Stone value_sp = frame->GetValueObjectForFrameVariable(variable_sp,
614b9c1b51eSKate Stone eNoDynamicValues);
615e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic);
61630fdc8d8SChris Lattner }
617b9c1b51eSKate Stone } break;
61869b582faSGreg Clayton
61969b582faSGreg Clayton case eValueTypeRegister: // stack frame register value
62069b582faSGreg Clayton {
621d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext());
622b9c1b51eSKate Stone if (reg_ctx) {
6238567f4d4SMichał Górny if (const RegisterInfo *reg_info =
6248567f4d4SMichał Górny reg_ctx->GetRegisterInfoByName(name)) {
6258567f4d4SMichał Górny value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_info);
62681e871edSGreg Clayton sb_value.SetSP(value_sp);
62769b582faSGreg Clayton }
62869b582faSGreg Clayton }
629b9c1b51eSKate Stone } break;
63069b582faSGreg Clayton
631b9c1b51eSKate Stone case eValueTypeRegisterSet: // A collection of stack frame register
632b9c1b51eSKate Stone // values
63369b582faSGreg Clayton {
634d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext());
635b9c1b51eSKate Stone if (reg_ctx) {
63669b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
637b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
63869b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx);
63969b582faSGreg Clayton if (reg_set &&
640*13a3b0bbSPavel Labath (llvm::StringRef(reg_set->name).equals_insensitive(name) ||
641*13a3b0bbSPavel Labath llvm::StringRef(reg_set->short_name)
642*13a3b0bbSPavel Labath .equals_insensitive(name))) {
643b9c1b51eSKate Stone value_sp =
644b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx);
64581e871edSGreg Clayton sb_value.SetSP(value_sp);
64681e871edSGreg Clayton break;
64769b582faSGreg Clayton }
64869b582faSGreg Clayton }
64969b582faSGreg Clayton }
650b9c1b51eSKate Stone } break;
65169b582faSGreg Clayton
65269b582faSGreg Clayton case eValueTypeConstResult: // constant result variables
65369b582faSGreg Clayton {
65469b582faSGreg Clayton ConstString const_name(name);
655b9c1b51eSKate Stone ExpressionVariableSP expr_var_sp(
656b9c1b51eSKate Stone target->GetPersistentVariable(const_name));
657b9c1b51eSKate Stone if (expr_var_sp) {
65881e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject();
659e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic);
66081e871edSGreg Clayton }
661b9c1b51eSKate Stone } break;
66269b582faSGreg Clayton
66369b582faSGreg Clayton default:
66469b582faSGreg Clayton break;
66569b582faSGreg Clayton }
666c9858e4dSGreg Clayton }
6677fdf9ef1SGreg Clayton }
668581af8b0SJonas Devlieghere }
6694838131bSGreg Clayton
670d232abc3SJonas Devlieghere return sb_value;
671dde9cff3SCaroline Tice }
672dde9cff3SCaroline Tice
IsEqual(const SBFrame & that) const673b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const {
6741755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, that);
675baf5664fSJonas Devlieghere
676b57e4a1bSJason Molenda lldb::StackFrameSP this_sp = GetFrameSP();
677b57e4a1bSJason Molenda lldb::StackFrameSP that_sp = that.GetFrameSP();
67835e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
67935e2ab60SJohnny Chen }
68035e2ab60SJohnny Chen
operator ==(const SBFrame & rhs) const681baf5664fSJonas Devlieghere bool SBFrame::operator==(const SBFrame &rhs) const {
6821755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
68330fdc8d8SChris Lattner
684baf5664fSJonas Devlieghere return IsEqual(rhs);
685baf5664fSJonas Devlieghere }
686baf5664fSJonas Devlieghere
operator !=(const SBFrame & rhs) const687baf5664fSJonas Devlieghere bool SBFrame::operator!=(const SBFrame &rhs) const {
6881755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
689baf5664fSJonas Devlieghere
690baf5664fSJonas Devlieghere return !IsEqual(rhs);
691baf5664fSJonas Devlieghere }
69230fdc8d8SChris Lattner
GetThread() const693b9c1b51eSKate Stone SBThread SBFrame::GetThread() const {
6941755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
695baf5664fSJonas Devlieghere
696c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock;
697c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
698c481c7eeSJim Ingham
699d9e416c0SGreg Clayton ThreadSP thread_sp(exe_ctx.GetThreadSP());
700d9e416c0SGreg Clayton SBThread sb_thread(thread_sp);
701ceb6b139SCaroline Tice
702d232abc3SJonas Devlieghere return sb_thread;
70330fdc8d8SChris Lattner }
70430fdc8d8SChris Lattner
Disassemble() const705b9c1b51eSKate Stone const char *SBFrame::Disassemble() const {
7061755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
707baf5664fSJonas Devlieghere
708dbb0abbfSEugene Zelenko const char *disassembly = nullptr;
709bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
710bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
7114fc6cb9cSJim Ingham
712dbb0abbfSEugene Zelenko StackFrame *frame = nullptr;
713d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
7147730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
715b9c1b51eSKate Stone if (target && process) {
7167fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
717b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
7187730b9a4SJim Ingham frame = exe_ctx.GetFramePtr();
719b9c1b51eSKate Stone if (frame) {
720d9e416c0SGreg Clayton disassembly = frame->Disassemble();
7217fdf9ef1SGreg Clayton }
722c9858e4dSGreg Clayton }
723581af8b0SJonas Devlieghere }
7244838131bSGreg Clayton
7254838131bSGreg Clayton return disassembly;
72630fdc8d8SChris Lattner }
72730fdc8d8SChris Lattner
GetVariables(bool arguments,bool locals,bool statics,bool in_scope_only)728b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics,
729b9c1b51eSKate Stone bool in_scope_only) {
7301755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, arguments, locals, statics, in_scope_only);
731baf5664fSJonas Devlieghere
732316d498bSGreg Clayton SBValueList value_list;
733c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock;
734c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
735c481c7eeSJim Ingham
736b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr();
737d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
738b9c1b51eSKate Stone if (frame && target) {
739b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic =
740b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue();
741b9c1b51eSKate Stone const bool include_runtime_support_values =
742b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false;
74351f96eebSZachary Turner
74451f96eebSZachary Turner SBVariablesOptions options;
74551f96eebSZachary Turner options.SetIncludeArguments(arguments);
74651f96eebSZachary Turner options.SetIncludeLocals(locals);
74751f96eebSZachary Turner options.SetIncludeStatics(statics);
74851f96eebSZachary Turner options.SetInScopeOnly(in_scope_only);
74951f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
75051f96eebSZachary Turner options.SetUseDynamic(use_dynamic);
75151f96eebSZachary Turner
75251f96eebSZachary Turner value_list = GetVariables(options);
753316d498bSGreg Clayton }
754d232abc3SJonas Devlieghere return value_list;
75578a685aaSJim Ingham }
75678a685aaSJim Ingham
GetVariables(bool arguments,bool locals,bool statics,bool in_scope_only,lldb::DynamicValueType use_dynamic)757b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals,
758b9c1b51eSKate Stone bool statics, bool in_scope_only,
759b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) {
7601755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, arguments, locals, statics, in_scope_only,
7611755f5b1SJonas Devlieghere use_dynamic);
762baf5664fSJonas Devlieghere
763c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock;
764c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
765c481c7eeSJim Ingham
766560558ebSEnrico Granata Target *target = exe_ctx.GetTargetPtr();
767b9c1b51eSKate Stone const bool include_runtime_support_values =
768b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false;
76951f96eebSZachary Turner SBVariablesOptions options;
77051f96eebSZachary Turner options.SetIncludeArguments(arguments);
77151f96eebSZachary Turner options.SetIncludeLocals(locals);
77251f96eebSZachary Turner options.SetIncludeStatics(statics);
77351f96eebSZachary Turner options.SetInScopeOnly(in_scope_only);
77451f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
77551f96eebSZachary Turner options.SetUseDynamic(use_dynamic);
776d232abc3SJonas Devlieghere return GetVariables(options);
777560558ebSEnrico Granata }
778560558ebSEnrico Granata
GetVariables(const lldb::SBVariablesOptions & options)779b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) {
7801755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, options);
781baf5664fSJonas Devlieghere
782b9556accSGreg Clayton SBValueList value_list;
783bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
784bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
7854fc6cb9cSJim Ingham
786dbb0abbfSEugene Zelenko StackFrame *frame = nullptr;
787d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
788b9556accSGreg Clayton
78951f96eebSZachary Turner const bool statics = options.GetIncludeStatics();
79051f96eebSZachary Turner const bool arguments = options.GetIncludeArguments();
7914c7f5d5cSKuba Mracek const bool recognized_arguments =
7924c7f5d5cSKuba Mracek options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP()));
79351f96eebSZachary Turner const bool locals = options.GetIncludeLocals();
79451f96eebSZachary Turner const bool in_scope_only = options.GetInScopeOnly();
795b9c1b51eSKate Stone const bool include_runtime_support_values =
796b9c1b51eSKate Stone options.GetIncludeRuntimeSupportValues();
79751f96eebSZachary Turner const lldb::DynamicValueType use_dynamic = options.GetUseDynamic();
79851f96eebSZachary Turner
799ceb6b139SCaroline Tice
800349213f9SGreg Clayton std::set<VariableSP> variable_set;
8017730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
802b9c1b51eSKate Stone if (target && process) {
8037fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
804b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
8057730b9a4SJim Ingham frame = exe_ctx.GetFramePtr();
806b9c1b51eSKate Stone if (frame) {
807dbb0abbfSEugene Zelenko VariableList *variable_list = nullptr;
808d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true);
809b9c1b51eSKate Stone if (variable_list) {
81030fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize();
811b9c1b51eSKate Stone if (num_variables) {
812d1782133SRaphael Isemann for (const VariableSP &variable_sp : *variable_list) {
813b9c1b51eSKate Stone if (variable_sp) {
81430fdc8d8SChris Lattner bool add_variable = false;
815b9c1b51eSKate Stone switch (variable_sp->GetScope()) {
81630fdc8d8SChris Lattner case eValueTypeVariableGlobal:
81730fdc8d8SChris Lattner case eValueTypeVariableStatic:
81863a27afaSGreg Clayton case eValueTypeVariableThreadLocal:
81930fdc8d8SChris Lattner add_variable = statics;
82030fdc8d8SChris Lattner break;
82130fdc8d8SChris Lattner
82230fdc8d8SChris Lattner case eValueTypeVariableArgument:
82330fdc8d8SChris Lattner add_variable = arguments;
82430fdc8d8SChris Lattner break;
82530fdc8d8SChris Lattner
82630fdc8d8SChris Lattner case eValueTypeVariableLocal:
82730fdc8d8SChris Lattner add_variable = locals;
82830fdc8d8SChris Lattner break;
829c982c768SGreg Clayton
830c982c768SGreg Clayton default:
831c982c768SGreg Clayton break;
83230fdc8d8SChris Lattner }
833b9c1b51eSKate Stone if (add_variable) {
834349213f9SGreg Clayton // Only add variables once so we don't end up with duplicates
835349213f9SGreg Clayton if (variable_set.find(variable_sp) == variable_set.end())
836349213f9SGreg Clayton variable_set.insert(variable_sp);
837349213f9SGreg Clayton else
838349213f9SGreg Clayton continue;
839349213f9SGreg Clayton
840d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame))
84130fdc8d8SChris Lattner continue;
84230fdc8d8SChris Lattner
843b9c1b51eSKate Stone ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable(
844b9c1b51eSKate Stone variable_sp, eNoDynamicValues));
845560558ebSEnrico Granata
846b9c1b51eSKate Stone if (!include_runtime_support_values && valobj_sp != nullptr &&
847dbb0abbfSEugene Zelenko valobj_sp->IsRuntimeSupportValue())
848560558ebSEnrico Granata continue;
849560558ebSEnrico Granata
850e3e91517SEnrico Granata SBValue value_sb;
851e3e91517SEnrico Granata value_sb.SetSP(valobj_sp, use_dynamic);
852e3e91517SEnrico Granata value_list.Append(value_sb);
85330fdc8d8SChris Lattner }
85430fdc8d8SChris Lattner }
85530fdc8d8SChris Lattner }
85630fdc8d8SChris Lattner }
85730fdc8d8SChris Lattner }
85841ae8e74SKuba Mracek if (recognized_arguments) {
85941ae8e74SKuba Mracek auto recognized_frame = frame->GetRecognizedFrame();
86041ae8e74SKuba Mracek if (recognized_frame) {
86141ae8e74SKuba Mracek ValueObjectListSP recognized_arg_list =
86241ae8e74SKuba Mracek recognized_frame->GetRecognizedArguments();
86341ae8e74SKuba Mracek if (recognized_arg_list) {
86441ae8e74SKuba Mracek for (auto &rec_value_sp : recognized_arg_list->GetObjects()) {
86541ae8e74SKuba Mracek SBValue value_sb;
86641ae8e74SKuba Mracek value_sb.SetSP(rec_value_sp, use_dynamic);
86741ae8e74SKuba Mracek value_list.Append(value_sb);
86841ae8e74SKuba Mracek }
86941ae8e74SKuba Mracek }
87041ae8e74SKuba Mracek }
87141ae8e74SKuba Mracek }
872c9858e4dSGreg Clayton }
8737fdf9ef1SGreg Clayton }
874581af8b0SJonas Devlieghere }
875ceb6b139SCaroline Tice
876d232abc3SJonas Devlieghere return value_list;
87730fdc8d8SChris Lattner }
87830fdc8d8SChris Lattner
GetRegisters()879b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() {
8801755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
881baf5664fSJonas Devlieghere
88230fdc8d8SChris Lattner SBValueList value_list;
883bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
884bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
8854fc6cb9cSJim Ingham
886dbb0abbfSEugene Zelenko StackFrame *frame = nullptr;
887d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
8887730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
889b9c1b51eSKate Stone if (target && process) {
8907fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
891b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
8927730b9a4SJim Ingham frame = exe_ctx.GetFramePtr();
893b9c1b51eSKate Stone if (frame) {
894d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext());
895b9c1b51eSKate Stone if (reg_ctx) {
89630fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
897b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
898b9c1b51eSKate Stone value_list.Append(
899b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx));
90030fdc8d8SChris Lattner }
90130fdc8d8SChris Lattner }
902c9858e4dSGreg Clayton }
9037fdf9ef1SGreg Clayton }
904581af8b0SJonas Devlieghere }
905ceb6b139SCaroline Tice
906d232abc3SJonas Devlieghere return value_list;
90730fdc8d8SChris Lattner }
90830fdc8d8SChris Lattner
FindRegister(const char * name)909b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) {
9101755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name);
911baf5664fSJonas Devlieghere
912ad9a53c5SJason Molenda SBValue result;
913ad9a53c5SJason Molenda ValueObjectSP value_sp;
914bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
915bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
916ad9a53c5SJason Molenda
917dbb0abbfSEugene Zelenko StackFrame *frame = nullptr;
918ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr();
919ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr();
920b9c1b51eSKate Stone if (target && process) {
921ad9a53c5SJason Molenda Process::StopLocker stop_locker;
922b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
923ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr();
924b9c1b51eSKate Stone if (frame) {
925ad9a53c5SJason Molenda RegisterContextSP reg_ctx(frame->GetRegisterContext());
926b9c1b51eSKate Stone if (reg_ctx) {
9278567f4d4SMichał Górny if (const RegisterInfo *reg_info =
9288567f4d4SMichał Górny reg_ctx->GetRegisterInfoByName(name)) {
9298567f4d4SMichał Górny value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_info);
930ad9a53c5SJason Molenda result.SetSP(value_sp);
931ad9a53c5SJason Molenda }
932ad9a53c5SJason Molenda }
933ad9a53c5SJason Molenda }
934ad9a53c5SJason Molenda }
935581af8b0SJonas Devlieghere }
936ad9a53c5SJason Molenda
937d232abc3SJonas Devlieghere return result;
938ad9a53c5SJason Molenda }
939ad9a53c5SJason Molenda
GetDescription(SBStream & description)940b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) {
9411755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, description);
942baf5664fSJonas Devlieghere
943da7bc7d0SGreg Clayton Stream &strm = description.ref();
944da7bc7d0SGreg Clayton
945bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
946bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
9474fc6cb9cSJim Ingham
948b57e4a1bSJason Molenda StackFrame *frame;
949d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
9507730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
951b9c1b51eSKate Stone if (target && process) {
9527fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
953b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
9547730b9a4SJim Ingham frame = exe_ctx.GetFramePtr();
955b9c1b51eSKate Stone if (frame) {
956d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&strm);
9577730b9a4SJim Ingham }
958c9858e4dSGreg Clayton }
959c9858e4dSGreg Clayton
960b9c1b51eSKate Stone } else
961da7bc7d0SGreg Clayton strm.PutCString("No value");
962dde9cff3SCaroline Tice
963dde9cff3SCaroline Tice return true;
964dde9cff3SCaroline Tice }
9651d3afba3SGreg Clayton
EvaluateExpression(const char * expr)966b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) {
9671755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, expr);
968baf5664fSJonas Devlieghere
969316d498bSGreg Clayton SBValue result;
970c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock;
971c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
972c481c7eeSJim Ingham
973b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr();
974d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
975b9c1b51eSKate Stone if (frame && target) {
97635e1bda6SJim Ingham SBExpressionOptions options;
977b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value =
978b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue();
979cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value);
98035e1bda6SJim Ingham options.SetUnwindOnError(true);
98124785bd0SEugene Leviant options.SetIgnoreBreakpoints(true);
982998c8a1cSRyan Brown if (target->GetLanguage() != eLanguageTypeUnknown)
983998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage());
984998c8a1cSRyan Brown else
985998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage());
986d232abc3SJonas Devlieghere return EvaluateExpression(expr, options);
987316d498bSGreg Clayton }
988d232abc3SJonas Devlieghere return result;
98978a685aaSJim Ingham }
99078a685aaSJim Ingham
99178a685aaSJim Ingham SBValue
EvaluateExpression(const char * expr,lldb::DynamicValueType fetch_dynamic_value)992b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr,
993b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value) {
9941755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, expr, fetch_dynamic_value);
995baf5664fSJonas Devlieghere
99635e1bda6SJim Ingham SBExpressionOptions options;
997cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value);
99835e1bda6SJim Ingham options.SetUnwindOnError(true);
99924785bd0SEugene Leviant options.SetIgnoreBreakpoints(true);
1000c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock;
1001c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1002c481c7eeSJim Ingham
1003998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr();
1004998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr();
1005998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown)
1006998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage());
1007998c8a1cSRyan Brown else if (frame)
1008998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage());
1009d232abc3SJonas Devlieghere return EvaluateExpression(expr, options);
10107ba6e991SJim Ingham }
10117ba6e991SJim Ingham
EvaluateExpression(const char * expr,lldb::DynamicValueType fetch_dynamic_value,bool unwind_on_error)1012b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr,
1013b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value,
1014b9c1b51eSKate Stone bool unwind_on_error) {
10151755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, expr, fetch_dynamic_value, unwind_on_error);
1016baf5664fSJonas Devlieghere
101735e1bda6SJim Ingham SBExpressionOptions options;
1018c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock;
1019c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1020c481c7eeSJim Ingham
1021cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value);
102235e1bda6SJim Ingham options.SetUnwindOnError(unwind_on_error);
102324785bd0SEugene Leviant options.SetIgnoreBreakpoints(true);
1024998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr();
1025998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr();
1026998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown)
1027998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage());
1028998c8a1cSRyan Brown else if (frame)
1029998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage());
1030d232abc3SJonas Devlieghere return EvaluateExpression(expr, options);
103135e1bda6SJim Ingham }
103235e1bda6SJim Ingham
EvaluateExpression(const char * expr,const SBExpressionOptions & options)1033b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr,
1034b9c1b51eSKate Stone const SBExpressionOptions &options) {
10351755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, expr, options);
1036baf5664fSJonas Devlieghere
1037a007a6d8SPavel Labath Log *expr_log = GetLog(LLDBLog::Expressions);
1038a162ebafSSean Callanan
103969b582faSGreg Clayton SBValue expr_result;
10407730b9a4SJim Ingham
1041b9c1b51eSKate Stone if (expr == nullptr || expr[0] == '\0') {
1042d232abc3SJonas Devlieghere return expr_result;
10437730b9a4SJim Ingham }
10447730b9a4SJim Ingham
104581e871edSGreg Clayton ValueObjectSP expr_value_sp;
10464838131bSGreg Clayton
1047bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
1048bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
10494fc6cb9cSJim Ingham
1050b9556accSGreg Clayton
1051dbb0abbfSEugene Zelenko StackFrame *frame = nullptr;
10527730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr();
10537730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
10547730b9a4SJim Ingham
1055b9c1b51eSKate Stone if (target && process) {
10567fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
1057b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
10587730b9a4SJim Ingham frame = exe_ctx.GetFramePtr();
1059b9c1b51eSKate Stone if (frame) {
10608f7db52dSJim Ingham std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace;
1061b9c1b51eSKate Stone if (target->GetDisplayExpressionsInCrashlogs()) {
10621ba7c4d0SGreg Clayton StreamString frame_description;
1063d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&frame_description);
1064a8f3ae7cSJonas Devlieghere stack_trace = std::make_unique<llvm::PrettyStackTraceFormat>(
1065b9c1b51eSKate Stone "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value "
1066b9c1b51eSKate Stone "= %u) %s",
1067b9c1b51eSKate Stone expr, options.GetFetchDynamicValue(),
1068c156427dSZachary Turner frame_description.GetData());
1069fb6621efSGreg Clayton }
1070fb6621efSGreg Clayton
1071370e5dbaSPavel Labath target->EvaluateExpression(expr, frame, expr_value_sp, options.ref());
1072e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
10737730b9a4SJim Ingham }
1074c9858e4dSGreg Clayton }
10757fdf9ef1SGreg Clayton }
10764838131bSGreg Clayton
107763e5fb76SJonas Devlieghere LLDB_LOGF(expr_log,
107863e5fb76SJonas Devlieghere "** [SBFrame::EvaluateExpression] Expression result is "
1079b9c1b51eSKate Stone "%s, summary %s **",
1080324a1036SSaleem Abdulrasool expr_result.GetValue(), expr_result.GetSummary());
10814838131bSGreg Clayton
1082d232abc3SJonas Devlieghere return expr_result;
10831d3afba3SGreg Clayton }
1084316d498bSGreg Clayton
IsInlined()1085b9c1b51eSKate Stone bool SBFrame::IsInlined() {
10861755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
1087baf5664fSJonas Devlieghere
108805f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->IsInlined();
108905f75e9fSOleksiy Vyalov }
109005f75e9fSOleksiy Vyalov
IsInlined() const1091b9c1b51eSKate Stone bool SBFrame::IsInlined() const {
10921755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
1093baf5664fSJonas Devlieghere
1094c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock;
1095c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1096c481c7eeSJim Ingham
1097dbb0abbfSEugene Zelenko StackFrame *frame = nullptr;
1098d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
10997730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
1100b9c1b51eSKate Stone if (target && process) {
11017fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
1102b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
11037730b9a4SJim Ingham frame = exe_ctx.GetFramePtr();
1104b9c1b51eSKate Stone if (frame) {
11057fdf9ef1SGreg Clayton
1106d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1107316d498bSGreg Clayton if (block)
1108dbb0abbfSEugene Zelenko return block->GetContainingInlinedBlock() != nullptr;
11097730b9a4SJim Ingham }
1110c9858e4dSGreg Clayton }
11117fdf9ef1SGreg Clayton }
1112316d498bSGreg Clayton return false;
1113316d498bSGreg Clayton }
1114316d498bSGreg Clayton
IsArtificial()11154b36f791SVedant Kumar bool SBFrame::IsArtificial() {
11161755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
1117baf5664fSJonas Devlieghere
11184b36f791SVedant Kumar return static_cast<const SBFrame *>(this)->IsArtificial();
11194b36f791SVedant Kumar }
11204b36f791SVedant Kumar
IsArtificial() const11214b36f791SVedant Kumar bool SBFrame::IsArtificial() const {
11221755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
1123baf5664fSJonas Devlieghere
11244b36f791SVedant Kumar std::unique_lock<std::recursive_mutex> lock;
11254b36f791SVedant Kumar ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
11264b36f791SVedant Kumar
11274b36f791SVedant Kumar StackFrame *frame = exe_ctx.GetFramePtr();
11284b36f791SVedant Kumar if (frame)
11294b36f791SVedant Kumar return frame->IsArtificial();
11304b36f791SVedant Kumar
11314b36f791SVedant Kumar return false;
11324b36f791SVedant Kumar }
11334b36f791SVedant Kumar
GetFunctionName()1134b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() {
11351755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
1136baf5664fSJonas Devlieghere
113705f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->GetFunctionName();
113805f75e9fSOleksiy Vyalov }
113905f75e9fSOleksiy Vyalov
GuessLanguage() const1140bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const {
11411755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
1142baf5664fSJonas Devlieghere
1143bdbdd229SJim Ingham std::unique_lock<std::recursive_mutex> lock;
1144bdbdd229SJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1145bdbdd229SJim Ingham
1146bdbdd229SJim Ingham StackFrame *frame = nullptr;
1147bdbdd229SJim Ingham Target *target = exe_ctx.GetTargetPtr();
1148bdbdd229SJim Ingham Process *process = exe_ctx.GetProcessPtr();
1149bdbdd229SJim Ingham if (target && process) {
1150bdbdd229SJim Ingham Process::StopLocker stop_locker;
1151bdbdd229SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) {
1152bdbdd229SJim Ingham frame = exe_ctx.GetFramePtr();
1153bdbdd229SJim Ingham if (frame) {
1154bdbdd229SJim Ingham return frame->GuessLanguage();
1155bdbdd229SJim Ingham }
1156bdbdd229SJim Ingham }
1157bdbdd229SJim Ingham }
1158bdbdd229SJim Ingham return eLanguageTypeUnknown;
1159bdbdd229SJim Ingham }
1160bdbdd229SJim Ingham
GetFunctionName() const1161b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const {
11621755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
1163baf5664fSJonas Devlieghere
1164dbb0abbfSEugene Zelenko const char *name = nullptr;
1165c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock;
1166c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1167c481c7eeSJim Ingham
1168dbb0abbfSEugene Zelenko StackFrame *frame = nullptr;
1169d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr();
11707730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr();
1171b9c1b51eSKate Stone if (target && process) {
11727fdf9ef1SGreg Clayton Process::StopLocker stop_locker;
1173b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
11747730b9a4SJim Ingham frame = exe_ctx.GetFramePtr();
1175b9c1b51eSKate Stone if (frame) {
1176b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1177b9c1b51eSKate Stone eSymbolContextBlock |
1178b9c1b51eSKate Stone eSymbolContextSymbol));
1179b9c1b51eSKate Stone if (sc.block) {
1180316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock();
1181b9c1b51eSKate Stone if (inlined_block) {
1182b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info =
1183b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo();
118422b04487SAlex Langford name = inlined_info->GetName().AsCString();
1185316d498bSGreg Clayton }
1186316d498bSGreg Clayton }
1187316d498bSGreg Clayton
1188b9c1b51eSKate Stone if (name == nullptr) {
1189316d498bSGreg Clayton if (sc.function)
1190316d498bSGreg Clayton name = sc.function->GetName().GetCString();
1191316d498bSGreg Clayton }
1192316d498bSGreg Clayton
1193b9c1b51eSKate Stone if (name == nullptr) {
1194316d498bSGreg Clayton if (sc.symbol)
1195316d498bSGreg Clayton name = sc.symbol->GetName().GetCString();
1196316d498bSGreg Clayton }
11977730b9a4SJim Ingham }
1198c9858e4dSGreg Clayton }
11997fdf9ef1SGreg Clayton }
1200316d498bSGreg Clayton return name;
1201316d498bSGreg Clayton }
1202c1f705c2SEnrico Granata
GetDisplayFunctionName()1203b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() {
12041755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
1205baf5664fSJonas Devlieghere
1206dbb0abbfSEugene Zelenko const char *name = nullptr;
1207c481c7eeSJim Ingham
1208c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock;
1209c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1210c481c7eeSJim Ingham
1211dbb0abbfSEugene Zelenko StackFrame *frame = nullptr;
1212c1f705c2SEnrico Granata Target *target = exe_ctx.GetTargetPtr();
1213c1f705c2SEnrico Granata Process *process = exe_ctx.GetProcessPtr();
1214b9c1b51eSKate Stone if (target && process) {
1215c1f705c2SEnrico Granata Process::StopLocker stop_locker;
1216b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) {
1217c1f705c2SEnrico Granata frame = exe_ctx.GetFramePtr();
1218b9c1b51eSKate Stone if (frame) {
1219b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1220b9c1b51eSKate Stone eSymbolContextBlock |
1221b9c1b51eSKate Stone eSymbolContextSymbol));
1222b9c1b51eSKate Stone if (sc.block) {
1223c1f705c2SEnrico Granata Block *inlined_block = sc.block->GetContainingInlinedBlock();
1224b9c1b51eSKate Stone if (inlined_block) {
1225b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info =
1226b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo();
122722b04487SAlex Langford name = inlined_info->GetDisplayName().AsCString();
1228c1f705c2SEnrico Granata }
1229c1f705c2SEnrico Granata }
1230c1f705c2SEnrico Granata
1231b9c1b51eSKate Stone if (name == nullptr) {
1232c1f705c2SEnrico Granata if (sc.function)
1233c1f705c2SEnrico Granata name = sc.function->GetDisplayName().GetCString();
1234c1f705c2SEnrico Granata }
1235c1f705c2SEnrico Granata
1236b9c1b51eSKate Stone if (name == nullptr) {
1237c1f705c2SEnrico Granata if (sc.symbol)
1238c1f705c2SEnrico Granata name = sc.symbol->GetDisplayName().GetCString();
1239c1f705c2SEnrico Granata }
1240c1f705c2SEnrico Granata }
1241c1f705c2SEnrico Granata }
1242c1f705c2SEnrico Granata }
1243c1f705c2SEnrico Granata return name;
1244c1f705c2SEnrico Granata }
1245