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