1 //===-- SBFrame.cpp -------------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
13 #include "lldb/API/SBFrame.h"
15 #include "lldb/lldb-types.h"
17 #include "SBReproducerPrivate.h"
19 #include "lldb/Core/Address.h"
20 #include "lldb/Core/StreamFile.h"
21 #include "lldb/Core/ValueObjectRegister.h"
22 #include "lldb/Core/ValueObjectVariable.h"
23 #include "lldb/Expression/ExpressionVariable.h"
24 #include "lldb/Expression/UserExpression.h"
25 #include "lldb/Host/Host.h"
26 #include "lldb/Symbol/Block.h"
27 #include "lldb/Symbol/Function.h"
28 #include "lldb/Symbol/Symbol.h"
29 #include "lldb/Symbol/SymbolContext.h"
30 #include "lldb/Symbol/Variable.h"
31 #include "lldb/Symbol/VariableList.h"
32 #include "lldb/Target/ExecutionContext.h"
33 #include "lldb/Target/Process.h"
34 #include "lldb/Target/RegisterContext.h"
35 #include "lldb/Target/StackFrame.h"
36 #include "lldb/Target/StackFrameRecognizer.h"
37 #include "lldb/Target/StackID.h"
38 #include "lldb/Target/Target.h"
39 #include "lldb/Target/Thread.h"
40 #include "lldb/Utility/ConstString.h"
41 #include "lldb/Utility/Stream.h"
43 #include "lldb/API/SBAddress.h"
44 #include "lldb/API/SBDebugger.h"
45 #include "lldb/API/SBExpressionOptions.h"
46 #include "lldb/API/SBStream.h"
47 #include "lldb/API/SBSymbolContext.h"
48 #include "lldb/API/SBThread.h"
49 #include "lldb/API/SBValue.h"
50 #include "lldb/API/SBVariablesOptions.h"
52 #include "llvm/Support/PrettyStackTrace.h"
55 using namespace lldb_private;
57 SBFrame::SBFrame() : m_opaque_sp(new ExecutionContextRef()) {
58 LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBFrame);
61 SBFrame::SBFrame(const StackFrameSP &lldb_object_sp)
62 : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) {
63 LLDB_RECORD_CONSTRUCTOR(SBFrame, (const lldb::StackFrameSP &),
67 SBFrame::SBFrame(const SBFrame &rhs) : m_opaque_sp() {
68 LLDB_RECORD_CONSTRUCTOR(SBFrame, (const lldb::SBFrame &), rhs);
70 m_opaque_sp = clone(rhs.m_opaque_sp);
73 SBFrame::~SBFrame() = default;
75 const SBFrame &SBFrame::operator=(const SBFrame &rhs) {
76 LLDB_RECORD_METHOD(const lldb::SBFrame &,
77 SBFrame, operator=,(const lldb::SBFrame &), rhs);
80 m_opaque_sp = clone(rhs.m_opaque_sp);
81 return LLDB_RECORD_RESULT(*this);
84 StackFrameSP SBFrame::GetFrameSP() const {
85 return (m_opaque_sp ? m_opaque_sp->GetFrameSP() : StackFrameSP());
88 void SBFrame::SetFrameSP(const StackFrameSP &lldb_object_sp) {
89 return m_opaque_sp->SetFrameSP(lldb_object_sp);
92 bool SBFrame::IsValid() const {
93 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsValid);
94 return this->operator bool();
96 SBFrame::operator bool() const {
97 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, operator bool);
99 std::unique_lock<std::recursive_mutex> lock;
100 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
102 Target *target = exe_ctx.GetTargetPtr();
103 Process *process = exe_ctx.GetProcessPtr();
104 if (target && process) {
105 Process::StopLocker stop_locker;
106 if (stop_locker.TryLock(&process->GetRunLock()))
107 return GetFrameSP().get() != nullptr;
110 // Without a target & process we can't have a valid stack frame.
114 SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const {
115 LLDB_RECORD_METHOD_CONST(lldb::SBSymbolContext, SBFrame, GetSymbolContext,
116 (uint32_t), resolve_scope);
118 SBSymbolContext sb_sym_ctx;
119 std::unique_lock<std::recursive_mutex> lock;
120 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
121 SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope);
122 StackFrame *frame = nullptr;
123 Target *target = exe_ctx.GetTargetPtr();
124 Process *process = exe_ctx.GetProcessPtr();
125 if (target && process) {
126 Process::StopLocker stop_locker;
127 if (stop_locker.TryLock(&process->GetRunLock())) {
128 frame = exe_ctx.GetFramePtr();
130 sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext(scope));
134 return LLDB_RECORD_RESULT(sb_sym_ctx);
137 SBModule SBFrame::GetModule() const {
138 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBModule, SBFrame, GetModule);
142 std::unique_lock<std::recursive_mutex> lock;
143 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
145 StackFrame *frame = nullptr;
146 Target *target = exe_ctx.GetTargetPtr();
147 Process *process = exe_ctx.GetProcessPtr();
148 if (target && process) {
149 Process::StopLocker stop_locker;
150 if (stop_locker.TryLock(&process->GetRunLock())) {
151 frame = exe_ctx.GetFramePtr();
153 module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp;
154 sb_module.SetSP(module_sp);
159 return LLDB_RECORD_RESULT(sb_module);
162 SBCompileUnit SBFrame::GetCompileUnit() const {
163 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBCompileUnit, SBFrame,
166 SBCompileUnit sb_comp_unit;
167 std::unique_lock<std::recursive_mutex> lock;
168 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
170 StackFrame *frame = nullptr;
171 Target *target = exe_ctx.GetTargetPtr();
172 Process *process = exe_ctx.GetProcessPtr();
173 if (target && process) {
174 Process::StopLocker stop_locker;
175 if (stop_locker.TryLock(&process->GetRunLock())) {
176 frame = exe_ctx.GetFramePtr();
179 frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit);
184 return LLDB_RECORD_RESULT(sb_comp_unit);
187 SBFunction SBFrame::GetFunction() const {
188 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFunction, SBFrame, GetFunction);
190 SBFunction sb_function;
191 std::unique_lock<std::recursive_mutex> lock;
192 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
194 StackFrame *frame = nullptr;
195 Target *target = exe_ctx.GetTargetPtr();
196 Process *process = exe_ctx.GetProcessPtr();
197 if (target && process) {
198 Process::StopLocker stop_locker;
199 if (stop_locker.TryLock(&process->GetRunLock())) {
200 frame = exe_ctx.GetFramePtr();
203 frame->GetSymbolContext(eSymbolContextFunction).function);
208 return LLDB_RECORD_RESULT(sb_function);
211 SBSymbol SBFrame::GetSymbol() const {
212 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBSymbol, SBFrame, GetSymbol);
215 std::unique_lock<std::recursive_mutex> lock;
216 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
218 StackFrame *frame = nullptr;
219 Target *target = exe_ctx.GetTargetPtr();
220 Process *process = exe_ctx.GetProcessPtr();
221 if (target && process) {
222 Process::StopLocker stop_locker;
223 if (stop_locker.TryLock(&process->GetRunLock())) {
224 frame = exe_ctx.GetFramePtr();
226 sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol);
231 return LLDB_RECORD_RESULT(sb_symbol);
234 SBBlock SBFrame::GetBlock() const {
235 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBlock, SBFrame, GetBlock);
238 std::unique_lock<std::recursive_mutex> lock;
239 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
241 StackFrame *frame = nullptr;
242 Target *target = exe_ctx.GetTargetPtr();
243 Process *process = exe_ctx.GetProcessPtr();
244 if (target && process) {
245 Process::StopLocker stop_locker;
246 if (stop_locker.TryLock(&process->GetRunLock())) {
247 frame = exe_ctx.GetFramePtr();
249 sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block);
252 return LLDB_RECORD_RESULT(sb_block);
255 SBBlock SBFrame::GetFrameBlock() const {
256 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBlock, SBFrame, GetFrameBlock);
259 std::unique_lock<std::recursive_mutex> lock;
260 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
262 StackFrame *frame = nullptr;
263 Target *target = exe_ctx.GetTargetPtr();
264 Process *process = exe_ctx.GetProcessPtr();
265 if (target && process) {
266 Process::StopLocker stop_locker;
267 if (stop_locker.TryLock(&process->GetRunLock())) {
268 frame = exe_ctx.GetFramePtr();
270 sb_block.SetPtr(frame->GetFrameBlock());
273 return LLDB_RECORD_RESULT(sb_block);
276 SBLineEntry SBFrame::GetLineEntry() const {
277 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBLineEntry, SBFrame, GetLineEntry);
279 SBLineEntry sb_line_entry;
280 std::unique_lock<std::recursive_mutex> lock;
281 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
283 StackFrame *frame = nullptr;
284 Target *target = exe_ctx.GetTargetPtr();
285 Process *process = exe_ctx.GetProcessPtr();
286 if (target && process) {
287 Process::StopLocker stop_locker;
288 if (stop_locker.TryLock(&process->GetRunLock())) {
289 frame = exe_ctx.GetFramePtr();
291 sb_line_entry.SetLineEntry(
292 frame->GetSymbolContext(eSymbolContextLineEntry).line_entry);
296 return LLDB_RECORD_RESULT(sb_line_entry);
299 uint32_t SBFrame::GetFrameID() const {
300 LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBFrame, GetFrameID);
302 uint32_t frame_idx = UINT32_MAX;
304 std::unique_lock<std::recursive_mutex> lock;
305 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
307 StackFrame *frame = exe_ctx.GetFramePtr();
309 frame_idx = frame->GetFrameIndex();
314 lldb::addr_t SBFrame::GetCFA() const {
315 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetCFA);
317 std::unique_lock<std::recursive_mutex> lock;
318 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
320 StackFrame *frame = exe_ctx.GetFramePtr();
322 return frame->GetStackID().GetCallFrameAddress();
323 return LLDB_INVALID_ADDRESS;
326 addr_t SBFrame::GetPC() const {
327 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetPC);
329 addr_t addr = LLDB_INVALID_ADDRESS;
330 std::unique_lock<std::recursive_mutex> lock;
331 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
333 StackFrame *frame = nullptr;
334 Target *target = exe_ctx.GetTargetPtr();
335 Process *process = exe_ctx.GetProcessPtr();
336 if (target && process) {
337 Process::StopLocker stop_locker;
338 if (stop_locker.TryLock(&process->GetRunLock())) {
339 frame = exe_ctx.GetFramePtr();
341 addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress(
342 target, AddressClass::eCode);
350 bool SBFrame::SetPC(addr_t new_pc) {
351 LLDB_RECORD_METHOD(bool, SBFrame, SetPC, (lldb::addr_t), new_pc);
353 bool ret_val = false;
354 std::unique_lock<std::recursive_mutex> lock;
355 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
357 Target *target = exe_ctx.GetTargetPtr();
358 Process *process = exe_ctx.GetProcessPtr();
359 if (target && process) {
360 Process::StopLocker stop_locker;
361 if (stop_locker.TryLock(&process->GetRunLock())) {
362 if (StackFrame *frame = exe_ctx.GetFramePtr()) {
363 if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
364 ret_val = reg_ctx_sp->SetPC(new_pc);
373 addr_t SBFrame::GetSP() const {
374 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetSP);
376 addr_t addr = LLDB_INVALID_ADDRESS;
377 std::unique_lock<std::recursive_mutex> lock;
378 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
380 Target *target = exe_ctx.GetTargetPtr();
381 Process *process = exe_ctx.GetProcessPtr();
382 if (target && process) {
383 Process::StopLocker stop_locker;
384 if (stop_locker.TryLock(&process->GetRunLock())) {
385 if (StackFrame *frame = exe_ctx.GetFramePtr()) {
386 if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
387 addr = reg_ctx_sp->GetSP();
396 addr_t SBFrame::GetFP() const {
397 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetFP);
399 addr_t addr = LLDB_INVALID_ADDRESS;
400 std::unique_lock<std::recursive_mutex> lock;
401 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
403 Target *target = exe_ctx.GetTargetPtr();
404 Process *process = exe_ctx.GetProcessPtr();
405 if (target && process) {
406 Process::StopLocker stop_locker;
407 if (stop_locker.TryLock(&process->GetRunLock())) {
408 if (StackFrame *frame = exe_ctx.GetFramePtr()) {
409 if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
410 addr = reg_ctx_sp->GetFP();
419 SBAddress SBFrame::GetPCAddress() const {
420 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBFrame, GetPCAddress);
423 std::unique_lock<std::recursive_mutex> lock;
424 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
426 StackFrame *frame = exe_ctx.GetFramePtr();
427 Target *target = exe_ctx.GetTargetPtr();
428 Process *process = exe_ctx.GetProcessPtr();
429 if (target && process) {
430 Process::StopLocker stop_locker;
431 if (stop_locker.TryLock(&process->GetRunLock())) {
432 frame = exe_ctx.GetFramePtr();
434 sb_addr.SetAddress(&frame->GetFrameCodeAddress());
437 return LLDB_RECORD_RESULT(sb_addr);
440 void SBFrame::Clear() {
441 LLDB_RECORD_METHOD_NO_ARGS(void, SBFrame, Clear);
443 m_opaque_sp->Clear();
446 lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) {
447 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath,
448 (const char *), var_path);
451 std::unique_lock<std::recursive_mutex> lock;
452 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
454 StackFrame *frame = exe_ctx.GetFramePtr();
455 Target *target = exe_ctx.GetTargetPtr();
456 if (frame && target) {
457 lldb::DynamicValueType use_dynamic =
458 frame->CalculateTarget()->GetPreferDynamicValue();
459 sb_value = GetValueForVariablePath(var_path, use_dynamic);
461 return LLDB_RECORD_RESULT(sb_value);
464 lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path,
465 DynamicValueType use_dynamic) {
466 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath,
467 (const char *, lldb::DynamicValueType), var_path,
471 if (var_path == nullptr || var_path[0] == '\0') {
472 return LLDB_RECORD_RESULT(sb_value);
475 std::unique_lock<std::recursive_mutex> lock;
476 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
478 StackFrame *frame = nullptr;
479 Target *target = exe_ctx.GetTargetPtr();
480 Process *process = exe_ctx.GetProcessPtr();
481 if (target && process) {
482 Process::StopLocker stop_locker;
483 if (stop_locker.TryLock(&process->GetRunLock())) {
484 frame = exe_ctx.GetFramePtr();
488 ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath(
489 var_path, eNoDynamicValues,
490 StackFrame::eExpressionPathOptionCheckPtrVsMember |
491 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
493 sb_value.SetSP(value_sp, use_dynamic);
497 return LLDB_RECORD_RESULT(sb_value);
500 SBValue SBFrame::FindVariable(const char *name) {
501 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *),
505 std::unique_lock<std::recursive_mutex> lock;
506 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
508 StackFrame *frame = exe_ctx.GetFramePtr();
509 Target *target = exe_ctx.GetTargetPtr();
510 if (frame && target) {
511 lldb::DynamicValueType use_dynamic =
512 frame->CalculateTarget()->GetPreferDynamicValue();
513 value = FindVariable(name, use_dynamic);
515 return LLDB_RECORD_RESULT(value);
518 SBValue SBFrame::FindVariable(const char *name,
519 lldb::DynamicValueType use_dynamic) {
520 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable,
521 (const char *, lldb::DynamicValueType), name, use_dynamic);
526 if (name == nullptr || name[0] == '\0') {
527 return LLDB_RECORD_RESULT(sb_value);
530 ValueObjectSP value_sp;
531 std::unique_lock<std::recursive_mutex> lock;
532 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
534 StackFrame *frame = nullptr;
535 Target *target = exe_ctx.GetTargetPtr();
536 Process *process = exe_ctx.GetProcessPtr();
537 if (target && process) {
538 Process::StopLocker stop_locker;
539 if (stop_locker.TryLock(&process->GetRunLock())) {
540 frame = exe_ctx.GetFramePtr();
542 value_sp = frame->FindVariable(ConstString(name));
545 sb_value.SetSP(value_sp, use_dynamic);
550 return LLDB_RECORD_RESULT(sb_value);
553 SBValue SBFrame::FindValue(const char *name, ValueType value_type) {
554 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue,
555 (const char *, lldb::ValueType), name, value_type);
558 std::unique_lock<std::recursive_mutex> lock;
559 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
561 StackFrame *frame = exe_ctx.GetFramePtr();
562 Target *target = exe_ctx.GetTargetPtr();
563 if (frame && target) {
564 lldb::DynamicValueType use_dynamic =
565 frame->CalculateTarget()->GetPreferDynamicValue();
566 value = FindValue(name, value_type, use_dynamic);
568 return LLDB_RECORD_RESULT(value);
571 SBValue SBFrame::FindValue(const char *name, ValueType value_type,
572 lldb::DynamicValueType use_dynamic) {
573 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue,
574 (const char *, lldb::ValueType, lldb::DynamicValueType),
575 name, value_type, use_dynamic);
579 if (name == nullptr || name[0] == '\0') {
580 return LLDB_RECORD_RESULT(sb_value);
583 ValueObjectSP value_sp;
584 std::unique_lock<std::recursive_mutex> lock;
585 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
587 StackFrame *frame = nullptr;
588 Target *target = exe_ctx.GetTargetPtr();
589 Process *process = exe_ctx.GetProcessPtr();
590 if (target && process) {
591 Process::StopLocker stop_locker;
592 if (stop_locker.TryLock(&process->GetRunLock())) {
593 frame = exe_ctx.GetFramePtr();
595 VariableList variable_list;
597 switch (value_type) {
598 case eValueTypeVariableGlobal: // global variable
599 case eValueTypeVariableStatic: // static variable
600 case eValueTypeVariableArgument: // function argument variables
601 case eValueTypeVariableLocal: // function local variables
602 case eValueTypeVariableThreadLocal: // thread local variables
604 SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock));
606 const bool can_create = true;
607 const bool get_parent_variables = true;
608 const bool stop_if_block_is_inlined_function = true;
611 sc.block->AppendVariables(
612 can_create, get_parent_variables,
613 stop_if_block_is_inlined_function,
614 [frame](Variable *v) { return v->IsInScope(frame); },
616 if (value_type == eValueTypeVariableGlobal) {
617 const bool get_file_globals = true;
618 VariableList *frame_vars = frame->GetVariableList(get_file_globals);
620 frame_vars->AppendVariablesIfUnique(variable_list);
622 ConstString const_name(name);
623 VariableSP variable_sp(
624 variable_list.FindVariable(const_name, value_type));
626 value_sp = frame->GetValueObjectForFrameVariable(variable_sp,
628 sb_value.SetSP(value_sp, use_dynamic);
632 case eValueTypeRegister: // stack frame register value
634 RegisterContextSP reg_ctx(frame->GetRegisterContext());
636 const uint32_t num_regs = reg_ctx->GetRegisterCount();
637 for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) {
638 const RegisterInfo *reg_info =
639 reg_ctx->GetRegisterInfoAtIndex(reg_idx);
641 ((reg_info->name && strcasecmp(reg_info->name, name) == 0) ||
642 (reg_info->alt_name &&
643 strcasecmp(reg_info->alt_name, name) == 0))) {
644 value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx);
645 sb_value.SetSP(value_sp);
652 case eValueTypeRegisterSet: // A collection of stack frame register
655 RegisterContextSP reg_ctx(frame->GetRegisterContext());
657 const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
658 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
659 const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx);
661 ((reg_set->name && strcasecmp(reg_set->name, name) == 0) ||
662 (reg_set->short_name &&
663 strcasecmp(reg_set->short_name, name) == 0))) {
665 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx);
666 sb_value.SetSP(value_sp);
673 case eValueTypeConstResult: // constant result variables
675 ConstString const_name(name);
676 ExpressionVariableSP expr_var_sp(
677 target->GetPersistentVariable(const_name));
679 value_sp = expr_var_sp->GetValueObject();
680 sb_value.SetSP(value_sp, use_dynamic);
691 return LLDB_RECORD_RESULT(sb_value);
694 bool SBFrame::IsEqual(const SBFrame &that) const {
695 LLDB_RECORD_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &),
698 lldb::StackFrameSP this_sp = GetFrameSP();
699 lldb::StackFrameSP that_sp = that.GetFrameSP();
700 return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
703 bool SBFrame::operator==(const SBFrame &rhs) const {
704 LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator==,(const lldb::SBFrame &),
710 bool SBFrame::operator!=(const SBFrame &rhs) const {
711 LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator!=,(const lldb::SBFrame &),
714 return !IsEqual(rhs);
717 SBThread SBFrame::GetThread() const {
718 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBThread, SBFrame, GetThread);
720 std::unique_lock<std::recursive_mutex> lock;
721 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
723 ThreadSP thread_sp(exe_ctx.GetThreadSP());
724 SBThread sb_thread(thread_sp);
726 return LLDB_RECORD_RESULT(sb_thread);
729 const char *SBFrame::Disassemble() const {
730 LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, Disassemble);
732 const char *disassembly = nullptr;
733 std::unique_lock<std::recursive_mutex> lock;
734 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
736 StackFrame *frame = nullptr;
737 Target *target = exe_ctx.GetTargetPtr();
738 Process *process = exe_ctx.GetProcessPtr();
739 if (target && process) {
740 Process::StopLocker stop_locker;
741 if (stop_locker.TryLock(&process->GetRunLock())) {
742 frame = exe_ctx.GetFramePtr();
744 disassembly = frame->Disassemble();
752 SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics,
753 bool in_scope_only) {
754 LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables,
755 (bool, bool, bool, bool), arguments, locals, statics,
758 SBValueList value_list;
759 std::unique_lock<std::recursive_mutex> lock;
760 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
762 StackFrame *frame = exe_ctx.GetFramePtr();
763 Target *target = exe_ctx.GetTargetPtr();
764 if (frame && target) {
765 lldb::DynamicValueType use_dynamic =
766 frame->CalculateTarget()->GetPreferDynamicValue();
767 const bool include_runtime_support_values =
768 target ? target->GetDisplayRuntimeSupportValues() : false;
770 SBVariablesOptions options;
771 options.SetIncludeArguments(arguments);
772 options.SetIncludeLocals(locals);
773 options.SetIncludeStatics(statics);
774 options.SetInScopeOnly(in_scope_only);
775 options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
776 options.SetUseDynamic(use_dynamic);
778 value_list = GetVariables(options);
780 return LLDB_RECORD_RESULT(value_list);
783 lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals,
784 bool statics, bool in_scope_only,
785 lldb::DynamicValueType use_dynamic) {
786 LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables,
787 (bool, bool, bool, bool, lldb::DynamicValueType),
788 arguments, locals, statics, in_scope_only, use_dynamic);
790 std::unique_lock<std::recursive_mutex> lock;
791 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
793 Target *target = exe_ctx.GetTargetPtr();
794 const bool include_runtime_support_values =
795 target ? target->GetDisplayRuntimeSupportValues() : false;
796 SBVariablesOptions options;
797 options.SetIncludeArguments(arguments);
798 options.SetIncludeLocals(locals);
799 options.SetIncludeStatics(statics);
800 options.SetInScopeOnly(in_scope_only);
801 options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
802 options.SetUseDynamic(use_dynamic);
803 return LLDB_RECORD_RESULT(GetVariables(options));
806 SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) {
807 LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables,
808 (const lldb::SBVariablesOptions &), options);
810 SBValueList value_list;
811 std::unique_lock<std::recursive_mutex> lock;
812 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
814 StackFrame *frame = nullptr;
815 Target *target = exe_ctx.GetTargetPtr();
817 const bool statics = options.GetIncludeStatics();
818 const bool arguments = options.GetIncludeArguments();
819 const bool recognized_arguments =
820 options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP()));
821 const bool locals = options.GetIncludeLocals();
822 const bool in_scope_only = options.GetInScopeOnly();
823 const bool include_runtime_support_values =
824 options.GetIncludeRuntimeSupportValues();
825 const lldb::DynamicValueType use_dynamic = options.GetUseDynamic();
828 std::set<VariableSP> variable_set;
829 Process *process = exe_ctx.GetProcessPtr();
830 if (target && process) {
831 Process::StopLocker stop_locker;
832 if (stop_locker.TryLock(&process->GetRunLock())) {
833 frame = exe_ctx.GetFramePtr();
835 VariableList *variable_list = nullptr;
836 variable_list = frame->GetVariableList(true);
838 const size_t num_variables = variable_list->GetSize();
840 for (const VariableSP &variable_sp : *variable_list) {
842 bool add_variable = false;
843 switch (variable_sp->GetScope()) {
844 case eValueTypeVariableGlobal:
845 case eValueTypeVariableStatic:
846 case eValueTypeVariableThreadLocal:
847 add_variable = statics;
850 case eValueTypeVariableArgument:
851 add_variable = arguments;
854 case eValueTypeVariableLocal:
855 add_variable = locals;
862 // Only add variables once so we don't end up with duplicates
863 if (variable_set.find(variable_sp) == variable_set.end())
864 variable_set.insert(variable_sp);
868 if (in_scope_only && !variable_sp->IsInScope(frame))
871 ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable(
872 variable_sp, eNoDynamicValues));
874 if (!include_runtime_support_values && valobj_sp != nullptr &&
875 valobj_sp->IsRuntimeSupportValue())
879 value_sb.SetSP(valobj_sp, use_dynamic);
880 value_list.Append(value_sb);
886 if (recognized_arguments) {
887 auto recognized_frame = frame->GetRecognizedFrame();
888 if (recognized_frame) {
889 ValueObjectListSP recognized_arg_list =
890 recognized_frame->GetRecognizedArguments();
891 if (recognized_arg_list) {
892 for (auto &rec_value_sp : recognized_arg_list->GetObjects()) {
894 value_sb.SetSP(rec_value_sp, use_dynamic);
895 value_list.Append(value_sb);
904 return LLDB_RECORD_RESULT(value_list);
907 SBValueList SBFrame::GetRegisters() {
908 LLDB_RECORD_METHOD_NO_ARGS(lldb::SBValueList, SBFrame, GetRegisters);
910 SBValueList value_list;
911 std::unique_lock<std::recursive_mutex> lock;
912 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
914 StackFrame *frame = nullptr;
915 Target *target = exe_ctx.GetTargetPtr();
916 Process *process = exe_ctx.GetProcessPtr();
917 if (target && process) {
918 Process::StopLocker stop_locker;
919 if (stop_locker.TryLock(&process->GetRunLock())) {
920 frame = exe_ctx.GetFramePtr();
922 RegisterContextSP reg_ctx(frame->GetRegisterContext());
924 const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
925 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
927 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx));
934 return LLDB_RECORD_RESULT(value_list);
937 SBValue SBFrame::FindRegister(const char *name) {
938 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *),
942 ValueObjectSP value_sp;
943 std::unique_lock<std::recursive_mutex> lock;
944 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
946 StackFrame *frame = nullptr;
947 Target *target = exe_ctx.GetTargetPtr();
948 Process *process = exe_ctx.GetProcessPtr();
949 if (target && process) {
950 Process::StopLocker stop_locker;
951 if (stop_locker.TryLock(&process->GetRunLock())) {
952 frame = exe_ctx.GetFramePtr();
954 RegisterContextSP reg_ctx(frame->GetRegisterContext());
956 const uint32_t num_regs = reg_ctx->GetRegisterCount();
957 for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) {
958 const RegisterInfo *reg_info =
959 reg_ctx->GetRegisterInfoAtIndex(reg_idx);
961 ((reg_info->name && strcasecmp(reg_info->name, name) == 0) ||
962 (reg_info->alt_name &&
963 strcasecmp(reg_info->alt_name, name) == 0))) {
964 value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx);
965 result.SetSP(value_sp);
974 return LLDB_RECORD_RESULT(result);
977 bool SBFrame::GetDescription(SBStream &description) {
978 LLDB_RECORD_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &),
981 Stream &strm = description.ref();
983 std::unique_lock<std::recursive_mutex> lock;
984 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
987 Target *target = exe_ctx.GetTargetPtr();
988 Process *process = exe_ctx.GetProcessPtr();
989 if (target && process) {
990 Process::StopLocker stop_locker;
991 if (stop_locker.TryLock(&process->GetRunLock())) {
992 frame = exe_ctx.GetFramePtr();
994 frame->DumpUsingSettingsFormat(&strm);
999 strm.PutCString("No value");
1004 SBValue SBFrame::EvaluateExpression(const char *expr) {
1005 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, (const char *),
1009 std::unique_lock<std::recursive_mutex> lock;
1010 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1012 StackFrame *frame = exe_ctx.GetFramePtr();
1013 Target *target = exe_ctx.GetTargetPtr();
1014 if (frame && target) {
1015 SBExpressionOptions options;
1016 lldb::DynamicValueType fetch_dynamic_value =
1017 frame->CalculateTarget()->GetPreferDynamicValue();
1018 options.SetFetchDynamicValue(fetch_dynamic_value);
1019 options.SetUnwindOnError(true);
1020 options.SetIgnoreBreakpoints(true);
1021 if (target->GetLanguage() != eLanguageTypeUnknown)
1022 options.SetLanguage(target->GetLanguage());
1024 options.SetLanguage(frame->GetLanguage());
1025 return LLDB_RECORD_RESULT(EvaluateExpression(expr, options));
1027 return LLDB_RECORD_RESULT(result);
1031 SBFrame::EvaluateExpression(const char *expr,
1032 lldb::DynamicValueType fetch_dynamic_value) {
1033 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1034 (const char *, lldb::DynamicValueType), expr,
1035 fetch_dynamic_value);
1037 SBExpressionOptions options;
1038 options.SetFetchDynamicValue(fetch_dynamic_value);
1039 options.SetUnwindOnError(true);
1040 options.SetIgnoreBreakpoints(true);
1041 std::unique_lock<std::recursive_mutex> lock;
1042 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1044 StackFrame *frame = exe_ctx.GetFramePtr();
1045 Target *target = exe_ctx.GetTargetPtr();
1046 if (target && target->GetLanguage() != eLanguageTypeUnknown)
1047 options.SetLanguage(target->GetLanguage());
1049 options.SetLanguage(frame->GetLanguage());
1050 return LLDB_RECORD_RESULT(EvaluateExpression(expr, options));
1053 SBValue SBFrame::EvaluateExpression(const char *expr,
1054 lldb::DynamicValueType fetch_dynamic_value,
1055 bool unwind_on_error) {
1056 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1057 (const char *, lldb::DynamicValueType, bool), expr,
1058 fetch_dynamic_value, unwind_on_error);
1060 SBExpressionOptions options;
1061 std::unique_lock<std::recursive_mutex> lock;
1062 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1064 options.SetFetchDynamicValue(fetch_dynamic_value);
1065 options.SetUnwindOnError(unwind_on_error);
1066 options.SetIgnoreBreakpoints(true);
1067 StackFrame *frame = exe_ctx.GetFramePtr();
1068 Target *target = exe_ctx.GetTargetPtr();
1069 if (target && target->GetLanguage() != eLanguageTypeUnknown)
1070 options.SetLanguage(target->GetLanguage());
1072 options.SetLanguage(frame->GetLanguage());
1073 return LLDB_RECORD_RESULT(EvaluateExpression(expr, options));
1076 lldb::SBValue SBFrame::EvaluateExpression(const char *expr,
1077 const SBExpressionOptions &options) {
1078 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1079 (const char *, const lldb::SBExpressionOptions &), expr,
1082 Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1084 SBValue expr_result;
1086 if (expr == nullptr || expr[0] == '\0') {
1087 return LLDB_RECORD_RESULT(expr_result);
1090 ValueObjectSP expr_value_sp;
1092 std::unique_lock<std::recursive_mutex> lock;
1093 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1096 StackFrame *frame = nullptr;
1097 Target *target = exe_ctx.GetTargetPtr();
1098 Process *process = exe_ctx.GetProcessPtr();
1100 if (target && process) {
1101 Process::StopLocker stop_locker;
1102 if (stop_locker.TryLock(&process->GetRunLock())) {
1103 frame = exe_ctx.GetFramePtr();
1105 std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace;
1106 if (target->GetDisplayExpressionsInCrashlogs()) {
1107 StreamString frame_description;
1108 frame->DumpUsingSettingsFormat(&frame_description);
1109 stack_trace = std::make_unique<llvm::PrettyStackTraceFormat>(
1110 "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value "
1112 expr, options.GetFetchDynamicValue(),
1113 frame_description.GetData());
1116 target->EvaluateExpression(expr, frame, expr_value_sp, options.ref());
1117 expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
1123 "** [SBFrame::EvaluateExpression] Expression result is "
1124 "%s, summary %s **",
1125 expr_result.GetValue(), expr_result.GetSummary());
1127 return LLDB_RECORD_RESULT(expr_result);
1130 bool SBFrame::IsInlined() {
1131 LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsInlined);
1133 return static_cast<const SBFrame *>(this)->IsInlined();
1136 bool SBFrame::IsInlined() const {
1137 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsInlined);
1139 std::unique_lock<std::recursive_mutex> lock;
1140 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1142 StackFrame *frame = nullptr;
1143 Target *target = exe_ctx.GetTargetPtr();
1144 Process *process = exe_ctx.GetProcessPtr();
1145 if (target && process) {
1146 Process::StopLocker stop_locker;
1147 if (stop_locker.TryLock(&process->GetRunLock())) {
1148 frame = exe_ctx.GetFramePtr();
1151 Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1153 return block->GetContainingInlinedBlock() != nullptr;
1160 bool SBFrame::IsArtificial() {
1161 LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsArtificial);
1163 return static_cast<const SBFrame *>(this)->IsArtificial();
1166 bool SBFrame::IsArtificial() const {
1167 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsArtificial);
1169 std::unique_lock<std::recursive_mutex> lock;
1170 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1172 StackFrame *frame = exe_ctx.GetFramePtr();
1174 return frame->IsArtificial();
1179 const char *SBFrame::GetFunctionName() {
1180 LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetFunctionName);
1182 return static_cast<const SBFrame *>(this)->GetFunctionName();
1185 lldb::LanguageType SBFrame::GuessLanguage() const {
1186 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::LanguageType, SBFrame, GuessLanguage);
1188 std::unique_lock<std::recursive_mutex> lock;
1189 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1191 StackFrame *frame = nullptr;
1192 Target *target = exe_ctx.GetTargetPtr();
1193 Process *process = exe_ctx.GetProcessPtr();
1194 if (target && process) {
1195 Process::StopLocker stop_locker;
1196 if (stop_locker.TryLock(&process->GetRunLock())) {
1197 frame = exe_ctx.GetFramePtr();
1199 return frame->GuessLanguage();
1203 return eLanguageTypeUnknown;
1206 const char *SBFrame::GetFunctionName() const {
1207 LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, GetFunctionName);
1209 const char *name = nullptr;
1210 std::unique_lock<std::recursive_mutex> lock;
1211 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1213 StackFrame *frame = nullptr;
1214 Target *target = exe_ctx.GetTargetPtr();
1215 Process *process = exe_ctx.GetProcessPtr();
1216 if (target && process) {
1217 Process::StopLocker stop_locker;
1218 if (stop_locker.TryLock(&process->GetRunLock())) {
1219 frame = exe_ctx.GetFramePtr();
1221 SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1222 eSymbolContextBlock |
1223 eSymbolContextSymbol));
1225 Block *inlined_block = sc.block->GetContainingInlinedBlock();
1226 if (inlined_block) {
1227 const InlineFunctionInfo *inlined_info =
1228 inlined_block->GetInlinedFunctionInfo();
1229 name = inlined_info->GetName().AsCString();
1233 if (name == nullptr) {
1235 name = sc.function->GetName().GetCString();
1238 if (name == nullptr) {
1240 name = sc.symbol->GetName().GetCString();
1248 const char *SBFrame::GetDisplayFunctionName() {
1249 LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetDisplayFunctionName);
1251 const char *name = nullptr;
1253 std::unique_lock<std::recursive_mutex> lock;
1254 ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1256 StackFrame *frame = nullptr;
1257 Target *target = exe_ctx.GetTargetPtr();
1258 Process *process = exe_ctx.GetProcessPtr();
1259 if (target && process) {
1260 Process::StopLocker stop_locker;
1261 if (stop_locker.TryLock(&process->GetRunLock())) {
1262 frame = exe_ctx.GetFramePtr();
1264 SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1265 eSymbolContextBlock |
1266 eSymbolContextSymbol));
1268 Block *inlined_block = sc.block->GetContainingInlinedBlock();
1269 if (inlined_block) {
1270 const InlineFunctionInfo *inlined_info =
1271 inlined_block->GetInlinedFunctionInfo();
1272 name = inlined_info->GetDisplayName().AsCString();
1276 if (name == nullptr) {
1278 name = sc.function->GetDisplayName().GetCString();
1281 if (name == nullptr) {
1283 name = sc.symbol->GetDisplayName().GetCString();
1291 namespace lldb_private {
1295 void RegisterMethods<SBFrame>(Registry &R) {
1296 LLDB_REGISTER_CONSTRUCTOR(SBFrame, ());
1297 LLDB_REGISTER_CONSTRUCTOR(SBFrame, (const lldb::StackFrameSP &));
1298 LLDB_REGISTER_CONSTRUCTOR(SBFrame, (const lldb::SBFrame &));
1299 LLDB_REGISTER_METHOD(const lldb::SBFrame &,
1300 SBFrame, operator=,(const lldb::SBFrame &));
1301 LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsValid, ());
1302 LLDB_REGISTER_METHOD_CONST(bool, SBFrame, operator bool, ());
1303 LLDB_REGISTER_METHOD_CONST(lldb::SBSymbolContext, SBFrame, GetSymbolContext,
1305 LLDB_REGISTER_METHOD_CONST(lldb::SBModule, SBFrame, GetModule, ());
1306 LLDB_REGISTER_METHOD_CONST(lldb::SBCompileUnit, SBFrame, GetCompileUnit,
1308 LLDB_REGISTER_METHOD_CONST(lldb::SBFunction, SBFrame, GetFunction, ());
1309 LLDB_REGISTER_METHOD_CONST(lldb::SBSymbol, SBFrame, GetSymbol, ());
1310 LLDB_REGISTER_METHOD_CONST(lldb::SBBlock, SBFrame, GetBlock, ());
1311 LLDB_REGISTER_METHOD_CONST(lldb::SBBlock, SBFrame, GetFrameBlock, ());
1312 LLDB_REGISTER_METHOD_CONST(lldb::SBLineEntry, SBFrame, GetLineEntry, ());
1313 LLDB_REGISTER_METHOD_CONST(uint32_t, SBFrame, GetFrameID, ());
1314 LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetCFA, ());
1315 LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetPC, ());
1316 LLDB_REGISTER_METHOD(bool, SBFrame, SetPC, (lldb::addr_t));
1317 LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetSP, ());
1318 LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetFP, ());
1319 LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBFrame, GetPCAddress, ());
1320 LLDB_REGISTER_METHOD(void, SBFrame, Clear, ());
1321 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath,
1323 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath,
1324 (const char *, lldb::DynamicValueType));
1325 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *));
1326 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindVariable,
1327 (const char *, lldb::DynamicValueType));
1328 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindValue,
1329 (const char *, lldb::ValueType));
1330 LLDB_REGISTER_METHOD(
1331 lldb::SBValue, SBFrame, FindValue,
1332 (const char *, lldb::ValueType, lldb::DynamicValueType));
1333 LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &));
1334 LLDB_REGISTER_METHOD_CONST(bool,
1335 SBFrame, operator==,(const lldb::SBFrame &));
1336 LLDB_REGISTER_METHOD_CONST(bool,
1337 SBFrame, operator!=,(const lldb::SBFrame &));
1338 LLDB_REGISTER_METHOD_CONST(lldb::SBThread, SBFrame, GetThread, ());
1339 LLDB_REGISTER_METHOD_CONST(const char *, SBFrame, Disassemble, ());
1340 LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables,
1341 (bool, bool, bool, bool));
1342 LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables,
1343 (bool, bool, bool, bool, lldb::DynamicValueType));
1344 LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables,
1345 (const lldb::SBVariablesOptions &));
1346 LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetRegisters, ());
1347 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *));
1348 LLDB_REGISTER_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &));
1349 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1351 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1352 (const char *, lldb::DynamicValueType));
1353 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1354 (const char *, lldb::DynamicValueType, bool));
1355 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression,
1356 (const char *, const lldb::SBExpressionOptions &));
1357 LLDB_REGISTER_METHOD(bool, SBFrame, IsInlined, ());
1358 LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsInlined, ());
1359 LLDB_REGISTER_METHOD(bool, SBFrame, IsArtificial, ());
1360 LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsArtificial, ());
1361 LLDB_REGISTER_METHOD(const char *, SBFrame, GetFunctionName, ());
1362 LLDB_REGISTER_METHOD_CONST(lldb::LanguageType, SBFrame, GuessLanguage, ());
1363 LLDB_REGISTER_METHOD_CONST(const char *, SBFrame, GetFunctionName, ());
1364 LLDB_REGISTER_METHOD(const char *, SBFrame, GetDisplayFunctionName, ());