xref: /freebsd/contrib/llvm-project/lldb/source/API/SBFrame.cpp (revision 04eeddc0aa8e0a417a16eaf9d7d095207f4a8623)
1 //===-- SBFrame.cpp -------------------------------------------------------===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include <algorithm>
10 #include <set>
11 #include <string>
12 
13 #include "lldb/API/SBFrame.h"
14 
15 #include "lldb/lldb-types.h"
16 
17 #include "Utils.h"
18 #include "lldb/Core/Address.h"
19 #include "lldb/Core/StreamFile.h"
20 #include "lldb/Core/ValueObjectRegister.h"
21 #include "lldb/Core/ValueObjectVariable.h"
22 #include "lldb/Expression/ExpressionVariable.h"
23 #include "lldb/Expression/UserExpression.h"
24 #include "lldb/Host/Host.h"
25 #include "lldb/Symbol/Block.h"
26 #include "lldb/Symbol/Function.h"
27 #include "lldb/Symbol/Symbol.h"
28 #include "lldb/Symbol/SymbolContext.h"
29 #include "lldb/Symbol/Variable.h"
30 #include "lldb/Symbol/VariableList.h"
31 #include "lldb/Target/ExecutionContext.h"
32 #include "lldb/Target/Process.h"
33 #include "lldb/Target/RegisterContext.h"
34 #include "lldb/Target/StackFrame.h"
35 #include "lldb/Target/StackFrameRecognizer.h"
36 #include "lldb/Target/StackID.h"
37 #include "lldb/Target/Target.h"
38 #include "lldb/Target/Thread.h"
39 #include "lldb/Utility/ConstString.h"
40 #include "lldb/Utility/Instrumentation.h"
41 #include "lldb/Utility/Stream.h"
42 
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"
51 
52 #include "llvm/Support/PrettyStackTrace.h"
53 
54 using namespace lldb;
55 using namespace lldb_private;
56 
57 SBFrame::SBFrame() : m_opaque_sp(new ExecutionContextRef()) {
58   LLDB_INSTRUMENT_VA(this);
59 }
60 
61 SBFrame::SBFrame(const StackFrameSP &lldb_object_sp)
62     : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) {
63   LLDB_INSTRUMENT_VA(this, lldb_object_sp);
64 }
65 
66 SBFrame::SBFrame(const SBFrame &rhs) {
67   LLDB_INSTRUMENT_VA(this, rhs);
68 
69   m_opaque_sp = clone(rhs.m_opaque_sp);
70 }
71 
72 SBFrame::~SBFrame() = default;
73 
74 const SBFrame &SBFrame::operator=(const SBFrame &rhs) {
75   LLDB_INSTRUMENT_VA(this, rhs);
76 
77   if (this != &rhs)
78     m_opaque_sp = clone(rhs.m_opaque_sp);
79   return *this;
80 }
81 
82 StackFrameSP SBFrame::GetFrameSP() const {
83   return (m_opaque_sp ? m_opaque_sp->GetFrameSP() : StackFrameSP());
84 }
85 
86 void SBFrame::SetFrameSP(const StackFrameSP &lldb_object_sp) {
87   return m_opaque_sp->SetFrameSP(lldb_object_sp);
88 }
89 
90 bool SBFrame::IsValid() const {
91   LLDB_INSTRUMENT_VA(this);
92   return this->operator bool();
93 }
94 SBFrame::operator bool() const {
95   LLDB_INSTRUMENT_VA(this);
96 
97   std::unique_lock<std::recursive_mutex> lock;
98   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
99 
100   Target *target = exe_ctx.GetTargetPtr();
101   Process *process = exe_ctx.GetProcessPtr();
102   if (target && process) {
103     Process::StopLocker stop_locker;
104     if (stop_locker.TryLock(&process->GetRunLock()))
105       return GetFrameSP().get() != nullptr;
106   }
107 
108   // Without a target & process we can't have a valid stack frame.
109   return false;
110 }
111 
112 SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const {
113   LLDB_INSTRUMENT_VA(this, resolve_scope);
114 
115   SBSymbolContext sb_sym_ctx;
116   std::unique_lock<std::recursive_mutex> lock;
117   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
118   SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope);
119   Target *target = exe_ctx.GetTargetPtr();
120   Process *process = exe_ctx.GetProcessPtr();
121   if (target && process) {
122     Process::StopLocker stop_locker;
123     if (stop_locker.TryLock(&process->GetRunLock())) {
124       if (StackFrame *frame = exe_ctx.GetFramePtr())
125         sb_sym_ctx = frame->GetSymbolContext(scope);
126     }
127   }
128 
129   return sb_sym_ctx;
130 }
131 
132 SBModule SBFrame::GetModule() const {
133   LLDB_INSTRUMENT_VA(this);
134 
135   SBModule sb_module;
136   ModuleSP module_sp;
137   std::unique_lock<std::recursive_mutex> lock;
138   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
139 
140   StackFrame *frame = nullptr;
141   Target *target = exe_ctx.GetTargetPtr();
142   Process *process = exe_ctx.GetProcessPtr();
143   if (target && process) {
144     Process::StopLocker stop_locker;
145     if (stop_locker.TryLock(&process->GetRunLock())) {
146       frame = exe_ctx.GetFramePtr();
147       if (frame) {
148         module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp;
149         sb_module.SetSP(module_sp);
150       }
151     }
152   }
153 
154   return sb_module;
155 }
156 
157 SBCompileUnit SBFrame::GetCompileUnit() const {
158   LLDB_INSTRUMENT_VA(this);
159 
160   SBCompileUnit sb_comp_unit;
161   std::unique_lock<std::recursive_mutex> lock;
162   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
163 
164   StackFrame *frame = nullptr;
165   Target *target = exe_ctx.GetTargetPtr();
166   Process *process = exe_ctx.GetProcessPtr();
167   if (target && process) {
168     Process::StopLocker stop_locker;
169     if (stop_locker.TryLock(&process->GetRunLock())) {
170       frame = exe_ctx.GetFramePtr();
171       if (frame) {
172         sb_comp_unit.reset(
173             frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit);
174       }
175     }
176   }
177 
178   return sb_comp_unit;
179 }
180 
181 SBFunction SBFrame::GetFunction() const {
182   LLDB_INSTRUMENT_VA(this);
183 
184   SBFunction sb_function;
185   std::unique_lock<std::recursive_mutex> lock;
186   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
187 
188   StackFrame *frame = nullptr;
189   Target *target = exe_ctx.GetTargetPtr();
190   Process *process = exe_ctx.GetProcessPtr();
191   if (target && process) {
192     Process::StopLocker stop_locker;
193     if (stop_locker.TryLock(&process->GetRunLock())) {
194       frame = exe_ctx.GetFramePtr();
195       if (frame) {
196         sb_function.reset(
197             frame->GetSymbolContext(eSymbolContextFunction).function);
198       }
199     }
200   }
201 
202   return sb_function;
203 }
204 
205 SBSymbol SBFrame::GetSymbol() const {
206   LLDB_INSTRUMENT_VA(this);
207 
208   SBSymbol sb_symbol;
209   std::unique_lock<std::recursive_mutex> lock;
210   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
211 
212   StackFrame *frame = nullptr;
213   Target *target = exe_ctx.GetTargetPtr();
214   Process *process = exe_ctx.GetProcessPtr();
215   if (target && process) {
216     Process::StopLocker stop_locker;
217     if (stop_locker.TryLock(&process->GetRunLock())) {
218       frame = exe_ctx.GetFramePtr();
219       if (frame) {
220         sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol);
221       }
222     }
223   }
224 
225   return sb_symbol;
226 }
227 
228 SBBlock SBFrame::GetBlock() const {
229   LLDB_INSTRUMENT_VA(this);
230 
231   SBBlock sb_block;
232   std::unique_lock<std::recursive_mutex> lock;
233   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
234 
235   StackFrame *frame = nullptr;
236   Target *target = exe_ctx.GetTargetPtr();
237   Process *process = exe_ctx.GetProcessPtr();
238   if (target && process) {
239     Process::StopLocker stop_locker;
240     if (stop_locker.TryLock(&process->GetRunLock())) {
241       frame = exe_ctx.GetFramePtr();
242       if (frame)
243         sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block);
244     }
245   }
246   return sb_block;
247 }
248 
249 SBBlock SBFrame::GetFrameBlock() const {
250   LLDB_INSTRUMENT_VA(this);
251 
252   SBBlock sb_block;
253   std::unique_lock<std::recursive_mutex> lock;
254   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
255 
256   StackFrame *frame = nullptr;
257   Target *target = exe_ctx.GetTargetPtr();
258   Process *process = exe_ctx.GetProcessPtr();
259   if (target && process) {
260     Process::StopLocker stop_locker;
261     if (stop_locker.TryLock(&process->GetRunLock())) {
262       frame = exe_ctx.GetFramePtr();
263       if (frame)
264         sb_block.SetPtr(frame->GetFrameBlock());
265     }
266   }
267   return sb_block;
268 }
269 
270 SBLineEntry SBFrame::GetLineEntry() const {
271   LLDB_INSTRUMENT_VA(this);
272 
273   SBLineEntry sb_line_entry;
274   std::unique_lock<std::recursive_mutex> lock;
275   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
276 
277   StackFrame *frame = nullptr;
278   Target *target = exe_ctx.GetTargetPtr();
279   Process *process = exe_ctx.GetProcessPtr();
280   if (target && process) {
281     Process::StopLocker stop_locker;
282     if (stop_locker.TryLock(&process->GetRunLock())) {
283       frame = exe_ctx.GetFramePtr();
284       if (frame) {
285         sb_line_entry.SetLineEntry(
286             frame->GetSymbolContext(eSymbolContextLineEntry).line_entry);
287       }
288     }
289   }
290   return sb_line_entry;
291 }
292 
293 uint32_t SBFrame::GetFrameID() const {
294   LLDB_INSTRUMENT_VA(this);
295 
296   uint32_t frame_idx = UINT32_MAX;
297 
298   std::unique_lock<std::recursive_mutex> lock;
299   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
300 
301   StackFrame *frame = exe_ctx.GetFramePtr();
302   if (frame)
303     frame_idx = frame->GetFrameIndex();
304 
305   return frame_idx;
306 }
307 
308 lldb::addr_t SBFrame::GetCFA() const {
309   LLDB_INSTRUMENT_VA(this);
310 
311   std::unique_lock<std::recursive_mutex> lock;
312   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
313 
314   StackFrame *frame = exe_ctx.GetFramePtr();
315   if (frame)
316     return frame->GetStackID().GetCallFrameAddress();
317   return LLDB_INVALID_ADDRESS;
318 }
319 
320 addr_t SBFrame::GetPC() const {
321   LLDB_INSTRUMENT_VA(this);
322 
323   addr_t addr = LLDB_INVALID_ADDRESS;
324   std::unique_lock<std::recursive_mutex> lock;
325   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
326 
327   StackFrame *frame = nullptr;
328   Target *target = exe_ctx.GetTargetPtr();
329   Process *process = exe_ctx.GetProcessPtr();
330   if (target && process) {
331     Process::StopLocker stop_locker;
332     if (stop_locker.TryLock(&process->GetRunLock())) {
333       frame = exe_ctx.GetFramePtr();
334       if (frame) {
335         addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress(
336             target, AddressClass::eCode);
337       }
338     }
339   }
340 
341   return addr;
342 }
343 
344 bool SBFrame::SetPC(addr_t new_pc) {
345   LLDB_INSTRUMENT_VA(this, new_pc);
346 
347   bool ret_val = false;
348   std::unique_lock<std::recursive_mutex> lock;
349   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
350 
351   Target *target = exe_ctx.GetTargetPtr();
352   Process *process = exe_ctx.GetProcessPtr();
353   if (target && process) {
354     Process::StopLocker stop_locker;
355     if (stop_locker.TryLock(&process->GetRunLock())) {
356       if (StackFrame *frame = exe_ctx.GetFramePtr()) {
357         if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
358           ret_val = reg_ctx_sp->SetPC(new_pc);
359         }
360       }
361     }
362   }
363 
364   return ret_val;
365 }
366 
367 addr_t SBFrame::GetSP() const {
368   LLDB_INSTRUMENT_VA(this);
369 
370   addr_t addr = LLDB_INVALID_ADDRESS;
371   std::unique_lock<std::recursive_mutex> lock;
372   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
373 
374   Target *target = exe_ctx.GetTargetPtr();
375   Process *process = exe_ctx.GetProcessPtr();
376   if (target && process) {
377     Process::StopLocker stop_locker;
378     if (stop_locker.TryLock(&process->GetRunLock())) {
379       if (StackFrame *frame = exe_ctx.GetFramePtr()) {
380         if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
381           addr = reg_ctx_sp->GetSP();
382         }
383       }
384     }
385   }
386 
387   return addr;
388 }
389 
390 addr_t SBFrame::GetFP() const {
391   LLDB_INSTRUMENT_VA(this);
392 
393   addr_t addr = LLDB_INVALID_ADDRESS;
394   std::unique_lock<std::recursive_mutex> lock;
395   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
396 
397   Target *target = exe_ctx.GetTargetPtr();
398   Process *process = exe_ctx.GetProcessPtr();
399   if (target && process) {
400     Process::StopLocker stop_locker;
401     if (stop_locker.TryLock(&process->GetRunLock())) {
402       if (StackFrame *frame = exe_ctx.GetFramePtr()) {
403         if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) {
404           addr = reg_ctx_sp->GetFP();
405         }
406       }
407     }
408   }
409 
410   return addr;
411 }
412 
413 SBAddress SBFrame::GetPCAddress() const {
414   LLDB_INSTRUMENT_VA(this);
415 
416   SBAddress sb_addr;
417   std::unique_lock<std::recursive_mutex> lock;
418   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
419 
420   StackFrame *frame = exe_ctx.GetFramePtr();
421   Target *target = exe_ctx.GetTargetPtr();
422   Process *process = exe_ctx.GetProcessPtr();
423   if (target && process) {
424     Process::StopLocker stop_locker;
425     if (stop_locker.TryLock(&process->GetRunLock())) {
426       frame = exe_ctx.GetFramePtr();
427       if (frame)
428         sb_addr.SetAddress(frame->GetFrameCodeAddress());
429     }
430   }
431   return sb_addr;
432 }
433 
434 void SBFrame::Clear() {
435   LLDB_INSTRUMENT_VA(this);
436 
437   m_opaque_sp->Clear();
438 }
439 
440 lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) {
441   LLDB_INSTRUMENT_VA(this, var_path);
442 
443   SBValue sb_value;
444   std::unique_lock<std::recursive_mutex> lock;
445   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
446 
447   StackFrame *frame = exe_ctx.GetFramePtr();
448   Target *target = exe_ctx.GetTargetPtr();
449   if (frame && target) {
450     lldb::DynamicValueType use_dynamic =
451         frame->CalculateTarget()->GetPreferDynamicValue();
452     sb_value = GetValueForVariablePath(var_path, use_dynamic);
453   }
454   return sb_value;
455 }
456 
457 lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path,
458                                                DynamicValueType use_dynamic) {
459   LLDB_INSTRUMENT_VA(this, var_path, use_dynamic);
460 
461   SBValue sb_value;
462   if (var_path == nullptr || var_path[0] == '\0') {
463     return sb_value;
464   }
465 
466   std::unique_lock<std::recursive_mutex> lock;
467   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
468 
469   StackFrame *frame = nullptr;
470   Target *target = exe_ctx.GetTargetPtr();
471   Process *process = exe_ctx.GetProcessPtr();
472   if (target && process) {
473     Process::StopLocker stop_locker;
474     if (stop_locker.TryLock(&process->GetRunLock())) {
475       frame = exe_ctx.GetFramePtr();
476       if (frame) {
477         VariableSP var_sp;
478         Status error;
479         ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath(
480             var_path, eNoDynamicValues,
481             StackFrame::eExpressionPathOptionCheckPtrVsMember |
482                 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
483             var_sp, error));
484         sb_value.SetSP(value_sp, use_dynamic);
485       }
486     }
487   }
488   return sb_value;
489 }
490 
491 SBValue SBFrame::FindVariable(const char *name) {
492   LLDB_INSTRUMENT_VA(this, name);
493 
494   SBValue value;
495   std::unique_lock<std::recursive_mutex> lock;
496   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
497 
498   StackFrame *frame = exe_ctx.GetFramePtr();
499   Target *target = exe_ctx.GetTargetPtr();
500   if (frame && target) {
501     lldb::DynamicValueType use_dynamic =
502         frame->CalculateTarget()->GetPreferDynamicValue();
503     value = FindVariable(name, use_dynamic);
504   }
505   return value;
506 }
507 
508 SBValue SBFrame::FindVariable(const char *name,
509                               lldb::DynamicValueType use_dynamic) {
510   LLDB_INSTRUMENT_VA(this, name, use_dynamic);
511 
512   VariableSP var_sp;
513   SBValue sb_value;
514 
515   if (name == nullptr || name[0] == '\0') {
516     return sb_value;
517   }
518 
519   ValueObjectSP value_sp;
520   std::unique_lock<std::recursive_mutex> lock;
521   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
522 
523   StackFrame *frame = nullptr;
524   Target *target = exe_ctx.GetTargetPtr();
525   Process *process = exe_ctx.GetProcessPtr();
526   if (target && process) {
527     Process::StopLocker stop_locker;
528     if (stop_locker.TryLock(&process->GetRunLock())) {
529       frame = exe_ctx.GetFramePtr();
530       if (frame) {
531         value_sp = frame->FindVariable(ConstString(name));
532 
533         if (value_sp)
534           sb_value.SetSP(value_sp, use_dynamic);
535       }
536     }
537   }
538 
539   return sb_value;
540 }
541 
542 SBValue SBFrame::FindValue(const char *name, ValueType value_type) {
543   LLDB_INSTRUMENT_VA(this, name, value_type);
544 
545   SBValue value;
546   std::unique_lock<std::recursive_mutex> lock;
547   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
548 
549   StackFrame *frame = exe_ctx.GetFramePtr();
550   Target *target = exe_ctx.GetTargetPtr();
551   if (frame && target) {
552     lldb::DynamicValueType use_dynamic =
553         frame->CalculateTarget()->GetPreferDynamicValue();
554     value = FindValue(name, value_type, use_dynamic);
555   }
556   return value;
557 }
558 
559 SBValue SBFrame::FindValue(const char *name, ValueType value_type,
560                            lldb::DynamicValueType use_dynamic) {
561   LLDB_INSTRUMENT_VA(this, name, value_type, use_dynamic);
562 
563   SBValue sb_value;
564 
565   if (name == nullptr || name[0] == '\0') {
566     return sb_value;
567   }
568 
569   ValueObjectSP value_sp;
570   std::unique_lock<std::recursive_mutex> lock;
571   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
572 
573   StackFrame *frame = nullptr;
574   Target *target = exe_ctx.GetTargetPtr();
575   Process *process = exe_ctx.GetProcessPtr();
576   if (target && process) {
577     Process::StopLocker stop_locker;
578     if (stop_locker.TryLock(&process->GetRunLock())) {
579       frame = exe_ctx.GetFramePtr();
580       if (frame) {
581         VariableList variable_list;
582 
583         switch (value_type) {
584         case eValueTypeVariableGlobal:      // global variable
585         case eValueTypeVariableStatic:      // static variable
586         case eValueTypeVariableArgument:    // function argument variables
587         case eValueTypeVariableLocal:       // function local variables
588         case eValueTypeVariableThreadLocal: // thread local variables
589         {
590           SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock));
591 
592           const bool can_create = true;
593           const bool get_parent_variables = true;
594           const bool stop_if_block_is_inlined_function = true;
595 
596           if (sc.block)
597             sc.block->AppendVariables(
598                 can_create, get_parent_variables,
599                 stop_if_block_is_inlined_function,
600                 [frame](Variable *v) { return v->IsInScope(frame); },
601                 &variable_list);
602           if (value_type == eValueTypeVariableGlobal) {
603             const bool get_file_globals = true;
604             VariableList *frame_vars = frame->GetVariableList(get_file_globals);
605             if (frame_vars)
606               frame_vars->AppendVariablesIfUnique(variable_list);
607           }
608           ConstString const_name(name);
609           VariableSP variable_sp(
610               variable_list.FindVariable(const_name, value_type));
611           if (variable_sp) {
612             value_sp = frame->GetValueObjectForFrameVariable(variable_sp,
613                                                              eNoDynamicValues);
614             sb_value.SetSP(value_sp, use_dynamic);
615           }
616         } break;
617 
618         case eValueTypeRegister: // stack frame register value
619         {
620           RegisterContextSP reg_ctx(frame->GetRegisterContext());
621           if (reg_ctx) {
622             if (const RegisterInfo *reg_info =
623                     reg_ctx->GetRegisterInfoByName(name)) {
624               value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_info);
625               sb_value.SetSP(value_sp);
626             }
627           }
628         } break;
629 
630         case eValueTypeRegisterSet: // A collection of stack frame register
631                                     // values
632         {
633           RegisterContextSP reg_ctx(frame->GetRegisterContext());
634           if (reg_ctx) {
635             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
636             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
637               const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx);
638               if (reg_set &&
639                   ((reg_set->name && strcasecmp(reg_set->name, name) == 0) ||
640                    (reg_set->short_name &&
641                     strcasecmp(reg_set->short_name, name) == 0))) {
642                 value_sp =
643                     ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx);
644                 sb_value.SetSP(value_sp);
645                 break;
646               }
647             }
648           }
649         } break;
650 
651         case eValueTypeConstResult: // constant result variables
652         {
653           ConstString const_name(name);
654           ExpressionVariableSP expr_var_sp(
655               target->GetPersistentVariable(const_name));
656           if (expr_var_sp) {
657             value_sp = expr_var_sp->GetValueObject();
658             sb_value.SetSP(value_sp, use_dynamic);
659           }
660         } break;
661 
662         default:
663           break;
664         }
665       }
666     }
667   }
668 
669   return sb_value;
670 }
671 
672 bool SBFrame::IsEqual(const SBFrame &that) const {
673   LLDB_INSTRUMENT_VA(this, that);
674 
675   lldb::StackFrameSP this_sp = GetFrameSP();
676   lldb::StackFrameSP that_sp = that.GetFrameSP();
677   return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
678 }
679 
680 bool SBFrame::operator==(const SBFrame &rhs) const {
681   LLDB_INSTRUMENT_VA(this, rhs);
682 
683   return IsEqual(rhs);
684 }
685 
686 bool SBFrame::operator!=(const SBFrame &rhs) const {
687   LLDB_INSTRUMENT_VA(this, rhs);
688 
689   return !IsEqual(rhs);
690 }
691 
692 SBThread SBFrame::GetThread() const {
693   LLDB_INSTRUMENT_VA(this);
694 
695   std::unique_lock<std::recursive_mutex> lock;
696   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
697 
698   ThreadSP thread_sp(exe_ctx.GetThreadSP());
699   SBThread sb_thread(thread_sp);
700 
701   return sb_thread;
702 }
703 
704 const char *SBFrame::Disassemble() const {
705   LLDB_INSTRUMENT_VA(this);
706 
707   const char *disassembly = nullptr;
708   std::unique_lock<std::recursive_mutex> lock;
709   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
710 
711   StackFrame *frame = nullptr;
712   Target *target = exe_ctx.GetTargetPtr();
713   Process *process = exe_ctx.GetProcessPtr();
714   if (target && process) {
715     Process::StopLocker stop_locker;
716     if (stop_locker.TryLock(&process->GetRunLock())) {
717       frame = exe_ctx.GetFramePtr();
718       if (frame) {
719         disassembly = frame->Disassemble();
720       }
721     }
722   }
723 
724   return disassembly;
725 }
726 
727 SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics,
728                                   bool in_scope_only) {
729   LLDB_INSTRUMENT_VA(this, arguments, locals, statics, in_scope_only);
730 
731   SBValueList value_list;
732   std::unique_lock<std::recursive_mutex> lock;
733   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
734 
735   StackFrame *frame = exe_ctx.GetFramePtr();
736   Target *target = exe_ctx.GetTargetPtr();
737   if (frame && target) {
738     lldb::DynamicValueType use_dynamic =
739         frame->CalculateTarget()->GetPreferDynamicValue();
740     const bool include_runtime_support_values =
741         target ? target->GetDisplayRuntimeSupportValues() : false;
742 
743     SBVariablesOptions options;
744     options.SetIncludeArguments(arguments);
745     options.SetIncludeLocals(locals);
746     options.SetIncludeStatics(statics);
747     options.SetInScopeOnly(in_scope_only);
748     options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
749     options.SetUseDynamic(use_dynamic);
750 
751     value_list = GetVariables(options);
752   }
753   return value_list;
754 }
755 
756 lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals,
757                                         bool statics, bool in_scope_only,
758                                         lldb::DynamicValueType use_dynamic) {
759   LLDB_INSTRUMENT_VA(this, arguments, locals, statics, in_scope_only,
760                      use_dynamic);
761 
762   std::unique_lock<std::recursive_mutex> lock;
763   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
764 
765   Target *target = exe_ctx.GetTargetPtr();
766   const bool include_runtime_support_values =
767       target ? target->GetDisplayRuntimeSupportValues() : false;
768   SBVariablesOptions options;
769   options.SetIncludeArguments(arguments);
770   options.SetIncludeLocals(locals);
771   options.SetIncludeStatics(statics);
772   options.SetInScopeOnly(in_scope_only);
773   options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
774   options.SetUseDynamic(use_dynamic);
775   return GetVariables(options);
776 }
777 
778 SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) {
779   LLDB_INSTRUMENT_VA(this, options);
780 
781   SBValueList value_list;
782   std::unique_lock<std::recursive_mutex> lock;
783   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
784 
785   StackFrame *frame = nullptr;
786   Target *target = exe_ctx.GetTargetPtr();
787 
788   const bool statics = options.GetIncludeStatics();
789   const bool arguments = options.GetIncludeArguments();
790   const bool recognized_arguments =
791         options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP()));
792   const bool locals = options.GetIncludeLocals();
793   const bool in_scope_only = options.GetInScopeOnly();
794   const bool include_runtime_support_values =
795       options.GetIncludeRuntimeSupportValues();
796   const lldb::DynamicValueType use_dynamic = options.GetUseDynamic();
797 
798 
799   std::set<VariableSP> variable_set;
800   Process *process = exe_ctx.GetProcessPtr();
801   if (target && process) {
802     Process::StopLocker stop_locker;
803     if (stop_locker.TryLock(&process->GetRunLock())) {
804       frame = exe_ctx.GetFramePtr();
805       if (frame) {
806         VariableList *variable_list = nullptr;
807         variable_list = frame->GetVariableList(true);
808         if (variable_list) {
809           const size_t num_variables = variable_list->GetSize();
810           if (num_variables) {
811             for (const VariableSP &variable_sp : *variable_list) {
812               if (variable_sp) {
813                 bool add_variable = false;
814                 switch (variable_sp->GetScope()) {
815                 case eValueTypeVariableGlobal:
816                 case eValueTypeVariableStatic:
817                 case eValueTypeVariableThreadLocal:
818                   add_variable = statics;
819                   break;
820 
821                 case eValueTypeVariableArgument:
822                   add_variable = arguments;
823                   break;
824 
825                 case eValueTypeVariableLocal:
826                   add_variable = locals;
827                   break;
828 
829                 default:
830                   break;
831                 }
832                 if (add_variable) {
833                   // Only add variables once so we don't end up with duplicates
834                   if (variable_set.find(variable_sp) == variable_set.end())
835                     variable_set.insert(variable_sp);
836                   else
837                     continue;
838 
839                   if (in_scope_only && !variable_sp->IsInScope(frame))
840                     continue;
841 
842                   ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable(
843                       variable_sp, eNoDynamicValues));
844 
845                   if (!include_runtime_support_values && valobj_sp != nullptr &&
846                       valobj_sp->IsRuntimeSupportValue())
847                     continue;
848 
849                   SBValue value_sb;
850                   value_sb.SetSP(valobj_sp, use_dynamic);
851                   value_list.Append(value_sb);
852                 }
853               }
854             }
855           }
856         }
857         if (recognized_arguments) {
858           auto recognized_frame = frame->GetRecognizedFrame();
859           if (recognized_frame) {
860             ValueObjectListSP recognized_arg_list =
861                 recognized_frame->GetRecognizedArguments();
862             if (recognized_arg_list) {
863               for (auto &rec_value_sp : recognized_arg_list->GetObjects()) {
864                 SBValue value_sb;
865                 value_sb.SetSP(rec_value_sp, use_dynamic);
866                 value_list.Append(value_sb);
867               }
868             }
869           }
870         }
871       }
872     }
873   }
874 
875   return value_list;
876 }
877 
878 SBValueList SBFrame::GetRegisters() {
879   LLDB_INSTRUMENT_VA(this);
880 
881   SBValueList value_list;
882   std::unique_lock<std::recursive_mutex> lock;
883   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
884 
885   StackFrame *frame = nullptr;
886   Target *target = exe_ctx.GetTargetPtr();
887   Process *process = exe_ctx.GetProcessPtr();
888   if (target && process) {
889     Process::StopLocker stop_locker;
890     if (stop_locker.TryLock(&process->GetRunLock())) {
891       frame = exe_ctx.GetFramePtr();
892       if (frame) {
893         RegisterContextSP reg_ctx(frame->GetRegisterContext());
894         if (reg_ctx) {
895           const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
896           for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
897             value_list.Append(
898                 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx));
899           }
900         }
901       }
902     }
903   }
904 
905   return value_list;
906 }
907 
908 SBValue SBFrame::FindRegister(const char *name) {
909   LLDB_INSTRUMENT_VA(this, name);
910 
911   SBValue result;
912   ValueObjectSP value_sp;
913   std::unique_lock<std::recursive_mutex> lock;
914   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
915 
916   StackFrame *frame = nullptr;
917   Target *target = exe_ctx.GetTargetPtr();
918   Process *process = exe_ctx.GetProcessPtr();
919   if (target && process) {
920     Process::StopLocker stop_locker;
921     if (stop_locker.TryLock(&process->GetRunLock())) {
922       frame = exe_ctx.GetFramePtr();
923       if (frame) {
924         RegisterContextSP reg_ctx(frame->GetRegisterContext());
925         if (reg_ctx) {
926           if (const RegisterInfo *reg_info =
927                   reg_ctx->GetRegisterInfoByName(name)) {
928             value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_info);
929             result.SetSP(value_sp);
930           }
931         }
932       }
933     }
934   }
935 
936   return result;
937 }
938 
939 bool SBFrame::GetDescription(SBStream &description) {
940   LLDB_INSTRUMENT_VA(this, description);
941 
942   Stream &strm = description.ref();
943 
944   std::unique_lock<std::recursive_mutex> lock;
945   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
946 
947   StackFrame *frame;
948   Target *target = exe_ctx.GetTargetPtr();
949   Process *process = exe_ctx.GetProcessPtr();
950   if (target && process) {
951     Process::StopLocker stop_locker;
952     if (stop_locker.TryLock(&process->GetRunLock())) {
953       frame = exe_ctx.GetFramePtr();
954       if (frame) {
955         frame->DumpUsingSettingsFormat(&strm);
956       }
957     }
958 
959   } else
960     strm.PutCString("No value");
961 
962   return true;
963 }
964 
965 SBValue SBFrame::EvaluateExpression(const char *expr) {
966   LLDB_INSTRUMENT_VA(this, expr);
967 
968   SBValue result;
969   std::unique_lock<std::recursive_mutex> lock;
970   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
971 
972   StackFrame *frame = exe_ctx.GetFramePtr();
973   Target *target = exe_ctx.GetTargetPtr();
974   if (frame && target) {
975     SBExpressionOptions options;
976     lldb::DynamicValueType fetch_dynamic_value =
977         frame->CalculateTarget()->GetPreferDynamicValue();
978     options.SetFetchDynamicValue(fetch_dynamic_value);
979     options.SetUnwindOnError(true);
980     options.SetIgnoreBreakpoints(true);
981     if (target->GetLanguage() != eLanguageTypeUnknown)
982       options.SetLanguage(target->GetLanguage());
983     else
984       options.SetLanguage(frame->GetLanguage());
985     return EvaluateExpression(expr, options);
986   }
987   return result;
988 }
989 
990 SBValue
991 SBFrame::EvaluateExpression(const char *expr,
992                             lldb::DynamicValueType fetch_dynamic_value) {
993   LLDB_INSTRUMENT_VA(this, expr, fetch_dynamic_value);
994 
995   SBExpressionOptions options;
996   options.SetFetchDynamicValue(fetch_dynamic_value);
997   options.SetUnwindOnError(true);
998   options.SetIgnoreBreakpoints(true);
999   std::unique_lock<std::recursive_mutex> lock;
1000   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1001 
1002   StackFrame *frame = exe_ctx.GetFramePtr();
1003   Target *target = exe_ctx.GetTargetPtr();
1004   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1005     options.SetLanguage(target->GetLanguage());
1006   else if (frame)
1007     options.SetLanguage(frame->GetLanguage());
1008   return EvaluateExpression(expr, options);
1009 }
1010 
1011 SBValue SBFrame::EvaluateExpression(const char *expr,
1012                                     lldb::DynamicValueType fetch_dynamic_value,
1013                                     bool unwind_on_error) {
1014   LLDB_INSTRUMENT_VA(this, expr, fetch_dynamic_value, unwind_on_error);
1015 
1016   SBExpressionOptions options;
1017   std::unique_lock<std::recursive_mutex> lock;
1018   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1019 
1020   options.SetFetchDynamicValue(fetch_dynamic_value);
1021   options.SetUnwindOnError(unwind_on_error);
1022   options.SetIgnoreBreakpoints(true);
1023   StackFrame *frame = exe_ctx.GetFramePtr();
1024   Target *target = exe_ctx.GetTargetPtr();
1025   if (target && target->GetLanguage() != eLanguageTypeUnknown)
1026     options.SetLanguage(target->GetLanguage());
1027   else if (frame)
1028     options.SetLanguage(frame->GetLanguage());
1029   return EvaluateExpression(expr, options);
1030 }
1031 
1032 lldb::SBValue SBFrame::EvaluateExpression(const char *expr,
1033                                           const SBExpressionOptions &options) {
1034   LLDB_INSTRUMENT_VA(this, expr, options);
1035 
1036   Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1037 
1038   SBValue expr_result;
1039 
1040   if (expr == nullptr || expr[0] == '\0') {
1041     return expr_result;
1042   }
1043 
1044   ValueObjectSP expr_value_sp;
1045 
1046   std::unique_lock<std::recursive_mutex> lock;
1047   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1048 
1049 
1050   StackFrame *frame = nullptr;
1051   Target *target = exe_ctx.GetTargetPtr();
1052   Process *process = exe_ctx.GetProcessPtr();
1053 
1054   if (target && process) {
1055     Process::StopLocker stop_locker;
1056     if (stop_locker.TryLock(&process->GetRunLock())) {
1057       frame = exe_ctx.GetFramePtr();
1058       if (frame) {
1059         std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace;
1060         if (target->GetDisplayExpressionsInCrashlogs()) {
1061           StreamString frame_description;
1062           frame->DumpUsingSettingsFormat(&frame_description);
1063           stack_trace = std::make_unique<llvm::PrettyStackTraceFormat>(
1064               "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value "
1065               "= %u) %s",
1066               expr, options.GetFetchDynamicValue(),
1067               frame_description.GetData());
1068         }
1069 
1070         target->EvaluateExpression(expr, frame, expr_value_sp, options.ref());
1071         expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
1072       }
1073     }
1074   }
1075 
1076   LLDB_LOGF(expr_log,
1077             "** [SBFrame::EvaluateExpression] Expression result is "
1078             "%s, summary %s **",
1079             expr_result.GetValue(), expr_result.GetSummary());
1080 
1081   return expr_result;
1082 }
1083 
1084 bool SBFrame::IsInlined() {
1085   LLDB_INSTRUMENT_VA(this);
1086 
1087   return static_cast<const SBFrame *>(this)->IsInlined();
1088 }
1089 
1090 bool SBFrame::IsInlined() const {
1091   LLDB_INSTRUMENT_VA(this);
1092 
1093   std::unique_lock<std::recursive_mutex> lock;
1094   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1095 
1096   StackFrame *frame = nullptr;
1097   Target *target = exe_ctx.GetTargetPtr();
1098   Process *process = exe_ctx.GetProcessPtr();
1099   if (target && process) {
1100     Process::StopLocker stop_locker;
1101     if (stop_locker.TryLock(&process->GetRunLock())) {
1102       frame = exe_ctx.GetFramePtr();
1103       if (frame) {
1104 
1105         Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1106         if (block)
1107           return block->GetContainingInlinedBlock() != nullptr;
1108       }
1109     }
1110   }
1111   return false;
1112 }
1113 
1114 bool SBFrame::IsArtificial() {
1115   LLDB_INSTRUMENT_VA(this);
1116 
1117   return static_cast<const SBFrame *>(this)->IsArtificial();
1118 }
1119 
1120 bool SBFrame::IsArtificial() const {
1121   LLDB_INSTRUMENT_VA(this);
1122 
1123   std::unique_lock<std::recursive_mutex> lock;
1124   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1125 
1126   StackFrame *frame = exe_ctx.GetFramePtr();
1127   if (frame)
1128     return frame->IsArtificial();
1129 
1130   return false;
1131 }
1132 
1133 const char *SBFrame::GetFunctionName() {
1134   LLDB_INSTRUMENT_VA(this);
1135 
1136   return static_cast<const SBFrame *>(this)->GetFunctionName();
1137 }
1138 
1139 lldb::LanguageType SBFrame::GuessLanguage() const {
1140   LLDB_INSTRUMENT_VA(this);
1141 
1142   std::unique_lock<std::recursive_mutex> lock;
1143   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1144 
1145   StackFrame *frame = nullptr;
1146   Target *target = exe_ctx.GetTargetPtr();
1147   Process *process = exe_ctx.GetProcessPtr();
1148   if (target && process) {
1149     Process::StopLocker stop_locker;
1150     if (stop_locker.TryLock(&process->GetRunLock())) {
1151       frame = exe_ctx.GetFramePtr();
1152       if (frame) {
1153         return frame->GuessLanguage();
1154       }
1155     }
1156   }
1157   return eLanguageTypeUnknown;
1158 }
1159 
1160 const char *SBFrame::GetFunctionName() const {
1161   LLDB_INSTRUMENT_VA(this);
1162 
1163   const char *name = nullptr;
1164   std::unique_lock<std::recursive_mutex> lock;
1165   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1166 
1167   StackFrame *frame = nullptr;
1168   Target *target = exe_ctx.GetTargetPtr();
1169   Process *process = exe_ctx.GetProcessPtr();
1170   if (target && process) {
1171     Process::StopLocker stop_locker;
1172     if (stop_locker.TryLock(&process->GetRunLock())) {
1173       frame = exe_ctx.GetFramePtr();
1174       if (frame) {
1175         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1176                                                  eSymbolContextBlock |
1177                                                  eSymbolContextSymbol));
1178         if (sc.block) {
1179           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1180           if (inlined_block) {
1181             const InlineFunctionInfo *inlined_info =
1182                 inlined_block->GetInlinedFunctionInfo();
1183             name = inlined_info->GetName().AsCString();
1184           }
1185         }
1186 
1187         if (name == nullptr) {
1188           if (sc.function)
1189             name = sc.function->GetName().GetCString();
1190         }
1191 
1192         if (name == nullptr) {
1193           if (sc.symbol)
1194             name = sc.symbol->GetName().GetCString();
1195         }
1196       }
1197     }
1198   }
1199   return name;
1200 }
1201 
1202 const char *SBFrame::GetDisplayFunctionName() {
1203   LLDB_INSTRUMENT_VA(this);
1204 
1205   const char *name = nullptr;
1206 
1207   std::unique_lock<std::recursive_mutex> lock;
1208   ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
1209 
1210   StackFrame *frame = nullptr;
1211   Target *target = exe_ctx.GetTargetPtr();
1212   Process *process = exe_ctx.GetProcessPtr();
1213   if (target && process) {
1214     Process::StopLocker stop_locker;
1215     if (stop_locker.TryLock(&process->GetRunLock())) {
1216       frame = exe_ctx.GetFramePtr();
1217       if (frame) {
1218         SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction |
1219                                                  eSymbolContextBlock |
1220                                                  eSymbolContextSymbol));
1221         if (sc.block) {
1222           Block *inlined_block = sc.block->GetContainingInlinedBlock();
1223           if (inlined_block) {
1224             const InlineFunctionInfo *inlined_info =
1225                 inlined_block->GetInlinedFunctionInfo();
1226             name = inlined_info->GetDisplayName().AsCString();
1227           }
1228         }
1229 
1230         if (name == nullptr) {
1231           if (sc.function)
1232             name = sc.function->GetDisplayName().GetCString();
1233         }
1234 
1235         if (name == nullptr) {
1236           if (sc.symbol)
1237             name = sc.symbol->GetDisplayName().GetCString();
1238         }
1239       }
1240     }
1241   }
1242   return name;
1243 }
1244