1 //===-- RegisterContextLLDB.cpp --------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "lldb/Core/Address.h"
11 #include "lldb/Core/AddressRange.h"
12 #include "lldb/Core/DataBufferHeap.h"
13 #include "lldb/Core/Log.h"
14 #include "lldb/Core/Module.h"
15 #include "lldb/Core/RegisterValue.h"
16 #include "lldb/Core/Value.h"
17 #include "lldb/Expression/DWARFExpression.h"
18 #include "lldb/Symbol/ArmUnwindInfo.h"
19 #include "lldb/Symbol/DWARFCallFrameInfo.h"
20 #include "lldb/Symbol/FuncUnwinders.h"
21 #include "lldb/Symbol/Function.h"
22 #include "lldb/Symbol/ObjectFile.h"
23 #include "lldb/Symbol/Symbol.h"
24 #include "lldb/Symbol/SymbolContext.h"
25 #include "lldb/Target/ABI.h"
26 #include "lldb/Target/DynamicLoader.h"
27 #include "lldb/Target/ExecutionContext.h"
28 #include "lldb/Target/Platform.h"
29 #include "lldb/Target/Process.h"
30 #include "lldb/Target/SectionLoadList.h"
31 #include "lldb/Target/StackFrame.h"
32 #include "lldb/Target/Target.h"
33 #include "lldb/Target/Thread.h"
34 #include "lldb/lldb-private.h"
35 
36 #include "RegisterContextLLDB.h"
37 
38 using namespace lldb;
39 using namespace lldb_private;
40 
41 static ConstString GetSymbolOrFunctionName(const SymbolContext &sym_ctx) {
42   if (sym_ctx.symbol)
43     return sym_ctx.symbol->GetName();
44   else if (sym_ctx.function)
45     return sym_ctx.function->GetName();
46   return ConstString();
47 }
48 
49 RegisterContextLLDB::RegisterContextLLDB(Thread &thread,
50                                          const SharedPtr &next_frame,
51                                          SymbolContext &sym_ctx,
52                                          uint32_t frame_number,
53                                          UnwindLLDB &unwind_lldb)
54     : RegisterContext(thread, frame_number), m_thread(thread),
55       m_fast_unwind_plan_sp(), m_full_unwind_plan_sp(),
56       m_fallback_unwind_plan_sp(), m_all_registers_available(false),
57       m_frame_type(-1), m_cfa(LLDB_INVALID_ADDRESS), m_start_pc(),
58       m_current_pc(), m_current_offset(0), m_current_offset_backed_up_one(0),
59       m_sym_ctx(sym_ctx), m_sym_ctx_valid(false), m_frame_number(frame_number),
60       m_registers(), m_parent_unwind(unwind_lldb) {
61   m_sym_ctx.Clear(false);
62   m_sym_ctx_valid = false;
63 
64   if (IsFrameZero()) {
65     InitializeZerothFrame();
66   } else {
67     InitializeNonZerothFrame();
68   }
69 
70   // This same code exists over in the GetFullUnwindPlanForFrame() but it may
71   // not have been executed yet
72   if (IsFrameZero() || next_frame->m_frame_type == eTrapHandlerFrame ||
73       next_frame->m_frame_type == eDebuggerFrame) {
74     m_all_registers_available = true;
75   }
76 }
77 
78 bool RegisterContextLLDB::IsUnwindPlanValidForCurrentPC(
79     lldb::UnwindPlanSP unwind_plan_sp, int &valid_pc_offset) {
80   if (!unwind_plan_sp)
81     return false;
82 
83   // check if m_current_pc is valid
84   if (unwind_plan_sp->PlanValidAtAddress(m_current_pc)) {
85     // yes - current offset can be used as is
86     valid_pc_offset = m_current_offset;
87     return true;
88   }
89 
90   // if m_current_offset <= 0, we've got nothing else to try
91   if (m_current_offset <= 0)
92     return false;
93 
94   // check pc - 1 to see if it's valid
95   Address pc_minus_one(m_current_pc);
96   pc_minus_one.SetOffset(m_current_pc.GetOffset() - 1);
97   if (unwind_plan_sp->PlanValidAtAddress(pc_minus_one)) {
98     // *valid_pc_offset = m_current_offset - 1;
99     valid_pc_offset = m_current_pc.GetOffset() - 1;
100     return true;
101   }
102 
103   return false;
104 }
105 
106 // Initialize a RegisterContextLLDB which is the first frame of a stack -- the
107 // zeroth frame or currently
108 // executing frame.
109 
110 void RegisterContextLLDB::InitializeZerothFrame() {
111   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_UNWIND));
112   ExecutionContext exe_ctx(m_thread.shared_from_this());
113   RegisterContextSP reg_ctx_sp = m_thread.GetRegisterContext();
114 
115   if (reg_ctx_sp.get() == NULL) {
116     m_frame_type = eNotAValidFrame;
117     UnwindLogMsg("frame does not have a register context");
118     return;
119   }
120 
121   addr_t current_pc = reg_ctx_sp->GetPC();
122 
123   if (current_pc == LLDB_INVALID_ADDRESS) {
124     m_frame_type = eNotAValidFrame;
125     UnwindLogMsg("frame does not have a pc");
126     return;
127   }
128 
129   Process *process = exe_ctx.GetProcessPtr();
130 
131   // Let ABIs fixup code addresses to make sure they are valid. In ARM ABIs
132   // this will strip bit zero in case we read a PC from memory or from the LR.
133   // (which would be a no-op in frame 0 where we get it from the register set,
134   // but still a good idea to make the call here for other ABIs that may exist.)
135   ABI *abi = process->GetABI().get();
136   if (abi)
137     current_pc = abi->FixCodeAddress(current_pc);
138 
139   // Initialize m_current_pc, an Address object, based on current_pc, an addr_t.
140   m_current_pc.SetLoadAddress(current_pc, &process->GetTarget());
141 
142   // If we don't have a Module for some reason, we're not going to find
143   // symbol/function information - just
144   // stick in some reasonable defaults and hope we can unwind past this frame.
145   ModuleSP pc_module_sp(m_current_pc.GetModule());
146   if (!m_current_pc.IsValid() || !pc_module_sp) {
147     UnwindLogMsg("using architectural default unwind method");
148   }
149 
150   // We require either a symbol or function in the symbols context to be
151   // successfully
152   // filled in or this context is of no use to us.
153   const uint32_t resolve_scope = eSymbolContextFunction | eSymbolContextSymbol;
154   if (pc_module_sp.get() && (pc_module_sp->ResolveSymbolContextForAddress(
155                                  m_current_pc, resolve_scope, m_sym_ctx) &
156                              resolve_scope)) {
157     m_sym_ctx_valid = true;
158   }
159 
160   if (m_sym_ctx.symbol) {
161     UnwindLogMsg("with pc value of 0x%" PRIx64 ", symbol name is '%s'",
162                  current_pc, GetSymbolOrFunctionName(m_sym_ctx).AsCString(""));
163   } else if (m_sym_ctx.function) {
164     UnwindLogMsg("with pc value of 0x%" PRIx64 ", function name is '%s'",
165                  current_pc, GetSymbolOrFunctionName(m_sym_ctx).AsCString(""));
166   } else {
167     UnwindLogMsg("with pc value of 0x%" PRIx64
168                  ", no symbol/function name is known.",
169                  current_pc);
170   }
171 
172   AddressRange addr_range;
173   m_sym_ctx.GetAddressRange(resolve_scope, 0, false, addr_range);
174 
175   if (IsTrapHandlerSymbol(process, m_sym_ctx)) {
176     m_frame_type = eTrapHandlerFrame;
177   } else {
178     // FIXME:  Detect eDebuggerFrame here.
179     m_frame_type = eNormalFrame;
180   }
181 
182   // If we were able to find a symbol/function, set addr_range to the bounds of
183   // that symbol/function.
184   // else treat the current pc value as the start_pc and record no offset.
185   if (addr_range.GetBaseAddress().IsValid()) {
186     m_start_pc = addr_range.GetBaseAddress();
187     if (m_current_pc.GetSection() == m_start_pc.GetSection()) {
188       m_current_offset = m_current_pc.GetOffset() - m_start_pc.GetOffset();
189     } else if (m_current_pc.GetModule() == m_start_pc.GetModule()) {
190       // This means that whatever symbol we kicked up isn't really correct
191       // --- we should not cross section boundaries ... We really should NULL
192       // out
193       // the function/symbol in this case unless there is a bad assumption
194       // here due to inlined functions?
195       m_current_offset =
196           m_current_pc.GetFileAddress() - m_start_pc.GetFileAddress();
197     }
198     m_current_offset_backed_up_one = m_current_offset;
199   } else {
200     m_start_pc = m_current_pc;
201     m_current_offset = -1;
202     m_current_offset_backed_up_one = -1;
203   }
204 
205   // We've set m_frame_type and m_sym_ctx before these calls.
206 
207   m_fast_unwind_plan_sp = GetFastUnwindPlanForFrame();
208   m_full_unwind_plan_sp = GetFullUnwindPlanForFrame();
209 
210   UnwindPlan::RowSP active_row;
211   lldb::RegisterKind row_register_kind = eRegisterKindGeneric;
212   if (m_full_unwind_plan_sp &&
213       m_full_unwind_plan_sp->PlanValidAtAddress(m_current_pc)) {
214     active_row =
215         m_full_unwind_plan_sp->GetRowForFunctionOffset(m_current_offset);
216     row_register_kind = m_full_unwind_plan_sp->GetRegisterKind();
217     if (active_row.get() && log) {
218       StreamString active_row_strm;
219       active_row->Dump(active_row_strm, m_full_unwind_plan_sp.get(), &m_thread,
220                        m_start_pc.GetLoadAddress(exe_ctx.GetTargetPtr()));
221       UnwindLogMsg("%s", active_row_strm.GetData());
222     }
223   }
224 
225   if (!active_row.get()) {
226     UnwindLogMsg("could not find an unwindplan row for this frame's pc");
227     m_frame_type = eNotAValidFrame;
228     return;
229   }
230 
231   if (!ReadCFAValueForRow(row_register_kind, active_row, m_cfa)) {
232     // Try the fall back unwind plan since the
233     // full unwind plan failed.
234     FuncUnwindersSP func_unwinders_sp;
235     UnwindPlanSP call_site_unwind_plan;
236     bool cfa_status = false;
237 
238     if (m_sym_ctx_valid) {
239       func_unwinders_sp =
240           pc_module_sp->GetObjectFile()
241               ->GetUnwindTable()
242               .GetFuncUnwindersContainingAddress(m_current_pc, m_sym_ctx);
243     }
244 
245     if (func_unwinders_sp.get() != nullptr)
246       call_site_unwind_plan = func_unwinders_sp->GetUnwindPlanAtCallSite(
247           process->GetTarget(), m_current_offset_backed_up_one);
248 
249     if (call_site_unwind_plan.get() != nullptr) {
250       m_fallback_unwind_plan_sp = call_site_unwind_plan;
251       if (TryFallbackUnwindPlan())
252         cfa_status = true;
253     }
254     if (!cfa_status) {
255       UnwindLogMsg("could not read CFA value for first frame.");
256       m_frame_type = eNotAValidFrame;
257       return;
258     }
259   }
260 
261   UnwindLogMsg("initialized frame current pc is 0x%" PRIx64 " cfa is 0x%" PRIx64
262                " using %s UnwindPlan",
263                (uint64_t)m_current_pc.GetLoadAddress(exe_ctx.GetTargetPtr()),
264                (uint64_t)m_cfa,
265                m_full_unwind_plan_sp->GetSourceName().GetCString());
266 }
267 
268 // Initialize a RegisterContextLLDB for the non-zeroth frame -- rely on the
269 // RegisterContextLLDB "below" it
270 // to provide things like its current pc value.
271 
272 void RegisterContextLLDB::InitializeNonZerothFrame() {
273   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_UNWIND));
274   if (IsFrameZero()) {
275     m_frame_type = eNotAValidFrame;
276     UnwindLogMsg("non-zeroth frame tests positive for IsFrameZero -- that "
277                  "shouldn't happen.");
278     return;
279   }
280 
281   if (!GetNextFrame().get() || !GetNextFrame()->IsValid()) {
282     m_frame_type = eNotAValidFrame;
283     UnwindLogMsg("Could not get next frame, marking this frame as invalid.");
284     return;
285   }
286   if (!m_thread.GetRegisterContext()) {
287     m_frame_type = eNotAValidFrame;
288     UnwindLogMsg("Could not get register context for this thread, marking this "
289                  "frame as invalid.");
290     return;
291   }
292 
293   addr_t pc;
294   if (!ReadGPRValue(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, pc)) {
295     UnwindLogMsg("could not get pc value");
296     m_frame_type = eNotAValidFrame;
297     return;
298   }
299 
300   if (log) {
301     UnwindLogMsg("pc = 0x%" PRIx64, pc);
302     addr_t reg_val;
303     if (ReadGPRValue(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FP, reg_val))
304       UnwindLogMsg("fp = 0x%" PRIx64, reg_val);
305     if (ReadGPRValue(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, reg_val))
306       UnwindLogMsg("sp = 0x%" PRIx64, reg_val);
307   }
308 
309   // A pc of 0x0 means it's the end of the stack crawl unless we're above a trap
310   // handler function
311   bool above_trap_handler = false;
312   if (GetNextFrame().get() && GetNextFrame()->IsValid() &&
313       GetNextFrame()->IsTrapHandlerFrame())
314     above_trap_handler = true;
315 
316   if (pc == 0 || pc == 0x1) {
317     if (above_trap_handler == false) {
318       m_frame_type = eNotAValidFrame;
319       UnwindLogMsg("this frame has a pc of 0x0");
320       return;
321     }
322   }
323 
324   ExecutionContext exe_ctx(m_thread.shared_from_this());
325   Process *process = exe_ctx.GetProcessPtr();
326   // Let ABIs fixup code addresses to make sure they are valid. In ARM ABIs
327   // this will strip bit zero in case we read a PC from memory or from the LR.
328   ABI *abi = process->GetABI().get();
329   if (abi)
330     pc = abi->FixCodeAddress(pc);
331 
332   m_current_pc.SetLoadAddress(pc, &process->GetTarget());
333 
334   // If we don't have a Module for some reason, we're not going to find
335   // symbol/function information - just
336   // stick in some reasonable defaults and hope we can unwind past this frame.
337   ModuleSP pc_module_sp(m_current_pc.GetModule());
338   if (!m_current_pc.IsValid() || !pc_module_sp) {
339     UnwindLogMsg("using architectural default unwind method");
340 
341     // Test the pc value to see if we know it's in an unmapped/non-executable
342     // region of memory.
343     uint32_t permissions;
344     if (process->GetLoadAddressPermissions(pc, permissions) &&
345         (permissions & ePermissionsExecutable) == 0) {
346       // If this is the second frame off the stack, we may have unwound the
347       // first frame
348       // incorrectly.  But using the architecture default unwind plan may get us
349       // back on
350       // track -- albeit possibly skipping a real frame.  Give this frame a
351       // clearly-invalid
352       // pc and see if we can get any further.
353       if (GetNextFrame().get() && GetNextFrame()->IsValid() &&
354           GetNextFrame()->IsFrameZero()) {
355         UnwindLogMsg("had a pc of 0x%" PRIx64 " which is not in executable "
356                                               "memory but on frame 1 -- "
357                                               "allowing it once.",
358                      (uint64_t)pc);
359         m_frame_type = eSkipFrame;
360       } else {
361         // anywhere other than the second frame, a non-executable pc means we're
362         // off in the weeds -- stop now.
363         m_frame_type = eNotAValidFrame;
364         UnwindLogMsg("pc is in a non-executable section of memory and this "
365                      "isn't the 2nd frame in the stack walk.");
366         return;
367       }
368     }
369 
370     if (abi) {
371       m_fast_unwind_plan_sp.reset();
372       m_full_unwind_plan_sp.reset(new UnwindPlan(lldb::eRegisterKindGeneric));
373       abi->CreateDefaultUnwindPlan(*m_full_unwind_plan_sp);
374       if (m_frame_type != eSkipFrame) // don't override eSkipFrame
375       {
376         m_frame_type = eNormalFrame;
377       }
378       m_all_registers_available = false;
379       m_current_offset = -1;
380       m_current_offset_backed_up_one = -1;
381       RegisterKind row_register_kind = m_full_unwind_plan_sp->GetRegisterKind();
382       UnwindPlan::RowSP row = m_full_unwind_plan_sp->GetRowForFunctionOffset(0);
383       if (row.get()) {
384         if (!ReadCFAValueForRow(row_register_kind, row, m_cfa)) {
385           UnwindLogMsg("failed to get cfa value");
386           if (m_frame_type != eSkipFrame) // don't override eSkipFrame
387           {
388             m_frame_type = eNotAValidFrame;
389           }
390           return;
391         }
392 
393         // A couple of sanity checks..
394         if (m_cfa == LLDB_INVALID_ADDRESS || m_cfa == 0 || m_cfa == 1) {
395           UnwindLogMsg("could not find a valid cfa address");
396           m_frame_type = eNotAValidFrame;
397           return;
398         }
399 
400         // m_cfa should point into the stack memory; if we can query memory
401         // region permissions,
402         // see if the memory is allocated & readable.
403         if (process->GetLoadAddressPermissions(m_cfa, permissions) &&
404             (permissions & ePermissionsReadable) == 0) {
405           m_frame_type = eNotAValidFrame;
406           UnwindLogMsg(
407               "the CFA points to a region of memory that is not readable");
408           return;
409         }
410       } else {
411         UnwindLogMsg("could not find a row for function offset zero");
412         m_frame_type = eNotAValidFrame;
413         return;
414       }
415 
416       if (CheckIfLoopingStack()) {
417         TryFallbackUnwindPlan();
418         if (CheckIfLoopingStack()) {
419           UnwindLogMsg("same CFA address as next frame, assuming the unwind is "
420                        "looping - stopping");
421           m_frame_type = eNotAValidFrame;
422           return;
423         }
424       }
425 
426       UnwindLogMsg("initialized frame cfa is 0x%" PRIx64, (uint64_t)m_cfa);
427       return;
428     }
429     m_frame_type = eNotAValidFrame;
430     UnwindLogMsg("could not find any symbol for this pc, or a default unwind "
431                  "plan, to continue unwind.");
432     return;
433   }
434 
435   bool resolve_tail_call_address = false; // m_current_pc can be one past the
436                                           // address range of the function...
437   // If the saved pc does not point to a function/symbol because it is
438   // beyond the bounds of the correct function and there's no symbol there,
439   // we do *not* want ResolveSymbolContextForAddress to back up the pc by 1,
440   // because then we might not find the correct unwind information later.
441   // Instead, let ResolveSymbolContextForAddress fail, and handle the case
442   // via decr_pc_and_recompute_addr_range below.
443   const uint32_t resolve_scope = eSymbolContextFunction | eSymbolContextSymbol;
444   uint32_t resolved_scope = pc_module_sp->ResolveSymbolContextForAddress(
445       m_current_pc, resolve_scope, m_sym_ctx, resolve_tail_call_address);
446 
447   // We require either a symbol or function in the symbols context to be
448   // successfully
449   // filled in or this context is of no use to us.
450   if (resolve_scope & resolved_scope) {
451     m_sym_ctx_valid = true;
452   }
453 
454   if (m_sym_ctx.symbol) {
455     UnwindLogMsg("with pc value of 0x%" PRIx64 ", symbol name is '%s'", pc,
456                  GetSymbolOrFunctionName(m_sym_ctx).AsCString(""));
457   } else if (m_sym_ctx.function) {
458     UnwindLogMsg("with pc value of 0x%" PRIx64 ", function name is '%s'", pc,
459                  GetSymbolOrFunctionName(m_sym_ctx).AsCString(""));
460   } else {
461     UnwindLogMsg("with pc value of 0x%" PRIx64
462                  ", no symbol/function name is known.",
463                  pc);
464   }
465 
466   AddressRange addr_range;
467   if (!m_sym_ctx.GetAddressRange(resolve_scope, 0, false, addr_range)) {
468     m_sym_ctx_valid = false;
469   }
470 
471   bool decr_pc_and_recompute_addr_range = false;
472 
473   // If the symbol lookup failed...
474   if (m_sym_ctx_valid == false)
475     decr_pc_and_recompute_addr_range = true;
476 
477   // Or if we're in the middle of the stack (and not "above" an asynchronous
478   // event like sigtramp),
479   // and our "current" pc is the start of a function...
480   if (m_sym_ctx_valid && GetNextFrame()->m_frame_type != eTrapHandlerFrame &&
481       GetNextFrame()->m_frame_type != eDebuggerFrame &&
482       addr_range.GetBaseAddress().IsValid() &&
483       addr_range.GetBaseAddress().GetSection() == m_current_pc.GetSection() &&
484       addr_range.GetBaseAddress().GetOffset() == m_current_pc.GetOffset()) {
485     decr_pc_and_recompute_addr_range = true;
486   }
487 
488   // We need to back up the pc by 1 byte and re-search for the Symbol to handle
489   // the case where the "saved pc"
490   // value is pointing to the next function, e.g. if a function ends with a CALL
491   // instruction.
492   // FIXME this may need to be an architectural-dependent behavior; if so we'll
493   // need to add a member function
494   // to the ABI plugin and consult that.
495   if (decr_pc_and_recompute_addr_range) {
496     UnwindLogMsg("Backing up the pc value of 0x%" PRIx64
497                  " by 1 and re-doing symbol lookup; old symbol was %s",
498                  pc, GetSymbolOrFunctionName(m_sym_ctx).AsCString(""));
499     Address temporary_pc;
500     temporary_pc.SetLoadAddress(pc - 1, &process->GetTarget());
501     m_sym_ctx.Clear(false);
502     m_sym_ctx_valid = false;
503     uint32_t resolve_scope = eSymbolContextFunction | eSymbolContextSymbol;
504 
505     ModuleSP temporary_module_sp = temporary_pc.GetModule();
506     if (temporary_module_sp &&
507         temporary_module_sp->ResolveSymbolContextForAddress(
508             temporary_pc, resolve_scope, m_sym_ctx) &
509             resolve_scope) {
510       if (m_sym_ctx.GetAddressRange(resolve_scope, 0, false, addr_range))
511         m_sym_ctx_valid = true;
512     }
513     UnwindLogMsg("Symbol is now %s",
514                  GetSymbolOrFunctionName(m_sym_ctx).AsCString(""));
515   }
516 
517   // If we were able to find a symbol/function, set addr_range_ptr to the bounds
518   // of that symbol/function.
519   // else treat the current pc value as the start_pc and record no offset.
520   if (addr_range.GetBaseAddress().IsValid()) {
521     m_start_pc = addr_range.GetBaseAddress();
522     m_current_offset = pc - m_start_pc.GetLoadAddress(&process->GetTarget());
523     m_current_offset_backed_up_one = m_current_offset;
524     if (decr_pc_and_recompute_addr_range &&
525         m_current_offset_backed_up_one > 0) {
526       m_current_offset_backed_up_one--;
527       if (m_sym_ctx_valid) {
528         m_current_pc.SetLoadAddress(pc - 1, &process->GetTarget());
529       }
530     }
531   } else {
532     m_start_pc = m_current_pc;
533     m_current_offset = -1;
534     m_current_offset_backed_up_one = -1;
535   }
536 
537   if (IsTrapHandlerSymbol(process, m_sym_ctx)) {
538     m_frame_type = eTrapHandlerFrame;
539   } else {
540     // FIXME:  Detect eDebuggerFrame here.
541     if (m_frame_type != eSkipFrame) // don't override eSkipFrame
542     {
543       m_frame_type = eNormalFrame;
544     }
545   }
546 
547   // We've set m_frame_type and m_sym_ctx before this call.
548   m_fast_unwind_plan_sp = GetFastUnwindPlanForFrame();
549 
550   UnwindPlan::RowSP active_row;
551   RegisterKind row_register_kind = eRegisterKindGeneric;
552 
553   // Try to get by with just the fast UnwindPlan if possible - the full
554   // UnwindPlan may be expensive to get
555   // (e.g. if we have to parse the entire eh_frame section of an ObjectFile for
556   // the first time.)
557 
558   if (m_fast_unwind_plan_sp &&
559       m_fast_unwind_plan_sp->PlanValidAtAddress(m_current_pc)) {
560     active_row =
561         m_fast_unwind_plan_sp->GetRowForFunctionOffset(m_current_offset);
562     row_register_kind = m_fast_unwind_plan_sp->GetRegisterKind();
563     if (active_row.get() && log) {
564       StreamString active_row_strm;
565       active_row->Dump(active_row_strm, m_fast_unwind_plan_sp.get(), &m_thread,
566                        m_start_pc.GetLoadAddress(exe_ctx.GetTargetPtr()));
567       UnwindLogMsg("active row: %s", active_row_strm.GetData());
568     }
569   } else {
570     m_full_unwind_plan_sp = GetFullUnwindPlanForFrame();
571     int valid_offset = -1;
572     if (IsUnwindPlanValidForCurrentPC(m_full_unwind_plan_sp, valid_offset)) {
573       active_row = m_full_unwind_plan_sp->GetRowForFunctionOffset(valid_offset);
574       row_register_kind = m_full_unwind_plan_sp->GetRegisterKind();
575       if (active_row.get() && log) {
576         StreamString active_row_strm;
577         active_row->Dump(active_row_strm, m_full_unwind_plan_sp.get(),
578                          &m_thread,
579                          m_start_pc.GetLoadAddress(exe_ctx.GetTargetPtr()));
580         UnwindLogMsg("active row: %s", active_row_strm.GetData());
581       }
582     }
583   }
584 
585   if (!active_row.get()) {
586     m_frame_type = eNotAValidFrame;
587     UnwindLogMsg("could not find unwind row for this pc");
588     return;
589   }
590 
591   if (!ReadCFAValueForRow(row_register_kind, active_row, m_cfa)) {
592     UnwindLogMsg("failed to get cfa");
593     m_frame_type = eNotAValidFrame;
594     return;
595   }
596 
597   UnwindLogMsg("m_cfa = 0x%" PRIx64, m_cfa);
598 
599   if (CheckIfLoopingStack()) {
600     TryFallbackUnwindPlan();
601     if (CheckIfLoopingStack()) {
602       UnwindLogMsg("same CFA address as next frame, assuming the unwind is "
603                    "looping - stopping");
604       m_frame_type = eNotAValidFrame;
605       return;
606     }
607   }
608 
609   UnwindLogMsg("initialized frame current pc is 0x%" PRIx64
610                " cfa is 0x%" PRIx64,
611                (uint64_t)m_current_pc.GetLoadAddress(exe_ctx.GetTargetPtr()),
612                (uint64_t)m_cfa);
613 }
614 
615 bool RegisterContextLLDB::CheckIfLoopingStack() {
616   // If we have a bad stack setup, we can get the same CFA value multiple times
617   // -- or even
618   // more devious, we can actually oscillate between two CFA values. Detect that
619   // here and
620   // break out to avoid a possible infinite loop in lldb trying to unwind the
621   // stack.
622   // To detect when we have the same CFA value multiple times, we compare the
623   // CFA of the current
624   // frame with the 2nd next frame because in some specail case (e.g. signal
625   // hanlders, hand
626   // written assembly without ABI compiance) we can have 2 frames with the same
627   // CFA (in theory we
628   // can have arbitrary number of frames with the same CFA, but more then 2 is
629   // very very unlikely)
630 
631   RegisterContextLLDB::SharedPtr next_frame = GetNextFrame();
632   if (next_frame) {
633     RegisterContextLLDB::SharedPtr next_next_frame = next_frame->GetNextFrame();
634     addr_t next_next_frame_cfa = LLDB_INVALID_ADDRESS;
635     if (next_next_frame && next_next_frame->GetCFA(next_next_frame_cfa)) {
636       if (next_next_frame_cfa == m_cfa) {
637         // We have a loop in the stack unwind
638         return true;
639       }
640     }
641   }
642   return false;
643 }
644 
645 bool RegisterContextLLDB::IsFrameZero() const { return m_frame_number == 0; }
646 
647 // Find a fast unwind plan for this frame, if possible.
648 //
649 // On entry to this method,
650 //
651 //   1. m_frame_type should already be set to eTrapHandlerFrame/eDebuggerFrame
652 //   if either of those are correct,
653 //   2. m_sym_ctx should already be filled in, and
654 //   3. m_current_pc should have the current pc value for this frame
655 //   4. m_current_offset_backed_up_one should have the current byte offset into
656 //   the function, maybe backed up by 1, -1 if unknown
657 
658 UnwindPlanSP RegisterContextLLDB::GetFastUnwindPlanForFrame() {
659   UnwindPlanSP unwind_plan_sp;
660   ModuleSP pc_module_sp(m_current_pc.GetModule());
661 
662   if (!m_current_pc.IsValid() || !pc_module_sp ||
663       pc_module_sp->GetObjectFile() == NULL)
664     return unwind_plan_sp;
665 
666   if (IsFrameZero())
667     return unwind_plan_sp;
668 
669   FuncUnwindersSP func_unwinders_sp(
670       pc_module_sp->GetObjectFile()
671           ->GetUnwindTable()
672           .GetFuncUnwindersContainingAddress(m_current_pc, m_sym_ctx));
673   if (!func_unwinders_sp)
674     return unwind_plan_sp;
675 
676   // If we're in _sigtramp(), unwinding past this frame requires special
677   // knowledge.
678   if (m_frame_type == eTrapHandlerFrame || m_frame_type == eDebuggerFrame)
679     return unwind_plan_sp;
680 
681   unwind_plan_sp = func_unwinders_sp->GetUnwindPlanFastUnwind(
682       *m_thread.CalculateTarget(), m_thread);
683   if (unwind_plan_sp) {
684     if (unwind_plan_sp->PlanValidAtAddress(m_current_pc)) {
685       Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_UNWIND));
686       if (log && log->GetVerbose()) {
687         if (m_fast_unwind_plan_sp)
688           UnwindLogMsgVerbose("frame, and has a fast UnwindPlan");
689         else
690           UnwindLogMsgVerbose("frame");
691       }
692       m_frame_type = eNormalFrame;
693       return unwind_plan_sp;
694     } else {
695       unwind_plan_sp.reset();
696     }
697   }
698   return unwind_plan_sp;
699 }
700 
701 // On entry to this method,
702 //
703 //   1. m_frame_type should already be set to eTrapHandlerFrame/eDebuggerFrame
704 //   if either of those are correct,
705 //   2. m_sym_ctx should already be filled in, and
706 //   3. m_current_pc should have the current pc value for this frame
707 //   4. m_current_offset_backed_up_one should have the current byte offset into
708 //   the function, maybe backed up by 1, -1 if unknown
709 
710 UnwindPlanSP RegisterContextLLDB::GetFullUnwindPlanForFrame() {
711   UnwindPlanSP unwind_plan_sp;
712   UnwindPlanSP arch_default_unwind_plan_sp;
713   ExecutionContext exe_ctx(m_thread.shared_from_this());
714   Process *process = exe_ctx.GetProcessPtr();
715   ABI *abi = process ? process->GetABI().get() : NULL;
716   if (abi) {
717     arch_default_unwind_plan_sp.reset(
718         new UnwindPlan(lldb::eRegisterKindGeneric));
719     abi->CreateDefaultUnwindPlan(*arch_default_unwind_plan_sp);
720   } else {
721     UnwindLogMsg(
722         "unable to get architectural default UnwindPlan from ABI plugin");
723   }
724 
725   bool behaves_like_zeroth_frame = false;
726   if (IsFrameZero() || GetNextFrame()->m_frame_type == eTrapHandlerFrame ||
727       GetNextFrame()->m_frame_type == eDebuggerFrame) {
728     behaves_like_zeroth_frame = true;
729     // If this frame behaves like a 0th frame (currently executing or
730     // interrupted asynchronously), all registers can be retrieved.
731     m_all_registers_available = true;
732   }
733 
734   // If we've done a jmp 0x0 / bl 0x0 (called through a null function pointer)
735   // so the pc is 0x0
736   // in the zeroth frame, we need to use the "unwind at first instruction" arch
737   // default UnwindPlan
738   // Also, if this Process can report on memory region attributes, any
739   // non-executable region means
740   // we jumped through a bad function pointer - handle the same way as 0x0.
741   // Note, if we have a symbol context & a symbol, we don't want to follow this
742   // code path.  This is
743   // for jumping to memory regions without any information available.
744 
745   if ((!m_sym_ctx_valid ||
746        (m_sym_ctx.function == NULL && m_sym_ctx.symbol == NULL)) &&
747       behaves_like_zeroth_frame && m_current_pc.IsValid()) {
748     uint32_t permissions;
749     addr_t current_pc_addr =
750         m_current_pc.GetLoadAddress(exe_ctx.GetTargetPtr());
751     if (current_pc_addr == 0 ||
752         (process &&
753          process->GetLoadAddressPermissions(current_pc_addr, permissions) &&
754          (permissions & ePermissionsExecutable) == 0)) {
755       if (abi) {
756         unwind_plan_sp.reset(new UnwindPlan(lldb::eRegisterKindGeneric));
757         abi->CreateFunctionEntryUnwindPlan(*unwind_plan_sp);
758         m_frame_type = eNormalFrame;
759         return unwind_plan_sp;
760       }
761     }
762   }
763 
764   // No Module for the current pc, try using the architecture default unwind.
765   ModuleSP pc_module_sp(m_current_pc.GetModule());
766   if (!m_current_pc.IsValid() || !pc_module_sp ||
767       pc_module_sp->GetObjectFile() == NULL) {
768     m_frame_type = eNormalFrame;
769     return arch_default_unwind_plan_sp;
770   }
771 
772   FuncUnwindersSP func_unwinders_sp;
773   if (m_sym_ctx_valid) {
774     func_unwinders_sp =
775         pc_module_sp->GetObjectFile()
776             ->GetUnwindTable()
777             .GetFuncUnwindersContainingAddress(m_current_pc, m_sym_ctx);
778   }
779 
780   // No FuncUnwinders available for this pc (stripped function symbols, lldb
781   // could not augment its
782   // function table with another source, like LC_FUNCTION_STARTS or eh_frame in
783   // ObjectFileMachO).
784   // See if eh_frame or the .ARM.exidx tables have unwind information for this
785   // address, else fall
786   // back to the architectural default unwind.
787   if (!func_unwinders_sp) {
788     m_frame_type = eNormalFrame;
789 
790     if (!pc_module_sp || !pc_module_sp->GetObjectFile() ||
791         !m_current_pc.IsValid())
792       return arch_default_unwind_plan_sp;
793 
794     // Even with -fomit-frame-pointer, we can try eh_frame to get back on track.
795     DWARFCallFrameInfo *eh_frame =
796         pc_module_sp->GetObjectFile()->GetUnwindTable().GetEHFrameInfo();
797     if (eh_frame) {
798       unwind_plan_sp.reset(new UnwindPlan(lldb::eRegisterKindGeneric));
799       if (eh_frame->GetUnwindPlan(m_current_pc, *unwind_plan_sp))
800         return unwind_plan_sp;
801       else
802         unwind_plan_sp.reset();
803     }
804 
805     ArmUnwindInfo *arm_exidx =
806         pc_module_sp->GetObjectFile()->GetUnwindTable().GetArmUnwindInfo();
807     if (arm_exidx) {
808       unwind_plan_sp.reset(new UnwindPlan(lldb::eRegisterKindGeneric));
809       if (arm_exidx->GetUnwindPlan(exe_ctx.GetTargetRef(), m_current_pc,
810                                    *unwind_plan_sp))
811         return unwind_plan_sp;
812       else
813         unwind_plan_sp.reset();
814     }
815 
816     return arch_default_unwind_plan_sp;
817   }
818 
819   // If we're in _sigtramp(), unwinding past this frame requires special
820   // knowledge.  On Mac OS X this knowledge
821   // is properly encoded in the eh_frame section, so prefer that if available.
822   // On other platforms we may need to provide a platform-specific UnwindPlan
823   // which encodes the details of
824   // how to unwind out of sigtramp.
825   if (m_frame_type == eTrapHandlerFrame && process) {
826     m_fast_unwind_plan_sp.reset();
827     unwind_plan_sp = func_unwinders_sp->GetEHFrameUnwindPlan(
828         process->GetTarget(), m_current_offset_backed_up_one);
829     if (unwind_plan_sp && unwind_plan_sp->PlanValidAtAddress(m_current_pc) &&
830         unwind_plan_sp->GetSourcedFromCompiler() == eLazyBoolYes) {
831       return unwind_plan_sp;
832     }
833   }
834 
835   // Ask the DynamicLoader if the eh_frame CFI should be trusted in this frame
836   // even when it's frame zero
837   // This comes up if we have hand-written functions in a Module and
838   // hand-written eh_frame.  The assembly
839   // instruction inspection may fail and the eh_frame CFI were probably written
840   // with some care to do the
841   // right thing.  It'd be nice if there was a way to ask the eh_frame directly
842   // if it is asynchronous
843   // (can be trusted at every instruction point) or synchronous (the normal case
844   // - only at call sites).
845   // But there is not.
846   if (process && process->GetDynamicLoader() &&
847       process->GetDynamicLoader()->AlwaysRelyOnEHUnwindInfo(m_sym_ctx)) {
848     // We must specifically call the GetEHFrameUnwindPlan() method here --
849     // normally we would
850     // call GetUnwindPlanAtCallSite() -- because CallSite may return an unwind
851     // plan sourced from
852     // either eh_frame (that's what we intend) or compact unwind (this won't
853     // work)
854     unwind_plan_sp = func_unwinders_sp->GetEHFrameUnwindPlan(
855         process->GetTarget(), m_current_offset_backed_up_one);
856     if (unwind_plan_sp && unwind_plan_sp->PlanValidAtAddress(m_current_pc)) {
857       UnwindLogMsgVerbose("frame uses %s for full UnwindPlan because the "
858                           "DynamicLoader suggested we prefer it",
859                           unwind_plan_sp->GetSourceName().GetCString());
860       return unwind_plan_sp;
861     }
862   }
863 
864   // Typically the NonCallSite UnwindPlan is the unwind created by inspecting
865   // the assembly language instructions
866   if (behaves_like_zeroth_frame && process) {
867     unwind_plan_sp = func_unwinders_sp->GetUnwindPlanAtNonCallSite(
868         process->GetTarget(), m_thread, m_current_offset_backed_up_one);
869     if (unwind_plan_sp && unwind_plan_sp->PlanValidAtAddress(m_current_pc)) {
870       if (unwind_plan_sp->GetSourcedFromCompiler() == eLazyBoolNo) {
871         // We probably have an UnwindPlan created by inspecting assembly
872         // instructions. The
873         // assembly profilers work really well with compiler-generated functions
874         // but hand-
875         // written assembly can be problematic. We set the eh_frame based unwind
876         // plan as our
877         // fallback unwind plan if instruction emulation doesn't work out even
878         // for non call
879         // sites if it is available and use the architecture default unwind plan
880         // if it is
881         // not available. The eh_frame unwind plan is more reliable even on non
882         // call sites
883         // then the architecture default plan and for hand written assembly code
884         // it is often
885         // written in a way that it valid at all location what helps in the most
886         // common
887         // cases when the instruction emulation fails.
888         UnwindPlanSP call_site_unwind_plan =
889             func_unwinders_sp->GetUnwindPlanAtCallSite(
890                 process->GetTarget(), m_current_offset_backed_up_one);
891         if (call_site_unwind_plan &&
892             call_site_unwind_plan.get() != unwind_plan_sp.get() &&
893             call_site_unwind_plan->GetSourceName() !=
894                 unwind_plan_sp->GetSourceName()) {
895           m_fallback_unwind_plan_sp = call_site_unwind_plan;
896         } else {
897           m_fallback_unwind_plan_sp = arch_default_unwind_plan_sp;
898         }
899       }
900       UnwindLogMsgVerbose("frame uses %s for full UnwindPlan",
901                           unwind_plan_sp->GetSourceName().GetCString());
902       return unwind_plan_sp;
903     }
904   }
905 
906   // Typically this is unwind info from an eh_frame section intended for
907   // exception handling; only valid at call sites
908   if (process) {
909     unwind_plan_sp = func_unwinders_sp->GetUnwindPlanAtCallSite(
910         process->GetTarget(), m_current_offset_backed_up_one);
911   }
912   int valid_offset = -1;
913   if (IsUnwindPlanValidForCurrentPC(unwind_plan_sp, valid_offset)) {
914     UnwindLogMsgVerbose("frame uses %s for full UnwindPlan",
915                         unwind_plan_sp->GetSourceName().GetCString());
916     return unwind_plan_sp;
917   }
918 
919   // We'd prefer to use an UnwindPlan intended for call sites when we're at a
920   // call site but if we've
921   // struck out on that, fall back to using the non-call-site assembly
922   // inspection UnwindPlan if possible.
923   if (process) {
924     unwind_plan_sp = func_unwinders_sp->GetUnwindPlanAtNonCallSite(
925         process->GetTarget(), m_thread, m_current_offset_backed_up_one);
926   }
927   if (unwind_plan_sp &&
928       unwind_plan_sp->GetSourcedFromCompiler() == eLazyBoolNo) {
929     // We probably have an UnwindPlan created by inspecting assembly
930     // instructions. The assembly
931     // profilers work really well with compiler-generated functions but hand-
932     // written assembly
933     // can be problematic. We set the eh_frame based unwind plan as our fallback
934     // unwind plan if
935     // instruction emulation doesn't work out even for non call sites if it is
936     // available and use
937     // the architecture default unwind plan if it is not available. The eh_frame
938     // unwind plan is
939     // more reliable even on non call sites then the architecture default plan
940     // and for hand
941     // written assembly code it is often written in a way that it valid at all
942     // location what
943     // helps in the most common cases when the instruction emulation fails.
944     UnwindPlanSP call_site_unwind_plan =
945         func_unwinders_sp->GetUnwindPlanAtCallSite(
946             process->GetTarget(), m_current_offset_backed_up_one);
947     if (call_site_unwind_plan &&
948         call_site_unwind_plan.get() != unwind_plan_sp.get() &&
949         call_site_unwind_plan->GetSourceName() !=
950             unwind_plan_sp->GetSourceName()) {
951       m_fallback_unwind_plan_sp = call_site_unwind_plan;
952     } else {
953       m_fallback_unwind_plan_sp = arch_default_unwind_plan_sp;
954     }
955   }
956 
957   if (IsUnwindPlanValidForCurrentPC(unwind_plan_sp, valid_offset)) {
958     UnwindLogMsgVerbose("frame uses %s for full UnwindPlan",
959                         unwind_plan_sp->GetSourceName().GetCString());
960     return unwind_plan_sp;
961   }
962 
963   // If we're on the first instruction of a function, and we have an
964   // architectural default UnwindPlan
965   // for the initial instruction of a function, use that.
966   if (m_current_offset_backed_up_one == 0) {
967     unwind_plan_sp =
968         func_unwinders_sp->GetUnwindPlanArchitectureDefaultAtFunctionEntry(
969             m_thread);
970     if (unwind_plan_sp) {
971       UnwindLogMsgVerbose("frame uses %s for full UnwindPlan",
972                           unwind_plan_sp->GetSourceName().GetCString());
973       return unwind_plan_sp;
974     }
975   }
976 
977   // If nothing else, use the architectural default UnwindPlan and hope that
978   // does the job.
979   if (arch_default_unwind_plan_sp)
980     UnwindLogMsgVerbose(
981         "frame uses %s for full UnwindPlan",
982         arch_default_unwind_plan_sp->GetSourceName().GetCString());
983   else
984     UnwindLogMsg(
985         "Unable to find any UnwindPlan for full unwind of this frame.");
986 
987   return arch_default_unwind_plan_sp;
988 }
989 
990 void RegisterContextLLDB::InvalidateAllRegisters() {
991   m_frame_type = eNotAValidFrame;
992 }
993 
994 size_t RegisterContextLLDB::GetRegisterCount() {
995   return m_thread.GetRegisterContext()->GetRegisterCount();
996 }
997 
998 const RegisterInfo *RegisterContextLLDB::GetRegisterInfoAtIndex(size_t reg) {
999   return m_thread.GetRegisterContext()->GetRegisterInfoAtIndex(reg);
1000 }
1001 
1002 size_t RegisterContextLLDB::GetRegisterSetCount() {
1003   return m_thread.GetRegisterContext()->GetRegisterSetCount();
1004 }
1005 
1006 const RegisterSet *RegisterContextLLDB::GetRegisterSet(size_t reg_set) {
1007   return m_thread.GetRegisterContext()->GetRegisterSet(reg_set);
1008 }
1009 
1010 uint32_t RegisterContextLLDB::ConvertRegisterKindToRegisterNumber(
1011     lldb::RegisterKind kind, uint32_t num) {
1012   return m_thread.GetRegisterContext()->ConvertRegisterKindToRegisterNumber(
1013       kind, num);
1014 }
1015 
1016 bool RegisterContextLLDB::ReadRegisterValueFromRegisterLocation(
1017     lldb_private::UnwindLLDB::RegisterLocation regloc,
1018     const RegisterInfo *reg_info, RegisterValue &value) {
1019   if (!IsValid())
1020     return false;
1021   bool success = false;
1022 
1023   switch (regloc.type) {
1024   case UnwindLLDB::RegisterLocation::eRegisterInLiveRegisterContext: {
1025     const RegisterInfo *other_reg_info =
1026         GetRegisterInfoAtIndex(regloc.location.register_number);
1027 
1028     if (!other_reg_info)
1029       return false;
1030 
1031     success =
1032         m_thread.GetRegisterContext()->ReadRegister(other_reg_info, value);
1033   } break;
1034   case UnwindLLDB::RegisterLocation::eRegisterInRegister: {
1035     const RegisterInfo *other_reg_info =
1036         GetRegisterInfoAtIndex(regloc.location.register_number);
1037 
1038     if (!other_reg_info)
1039       return false;
1040 
1041     if (IsFrameZero()) {
1042       success =
1043           m_thread.GetRegisterContext()->ReadRegister(other_reg_info, value);
1044     } else {
1045       success = GetNextFrame()->ReadRegister(other_reg_info, value);
1046     }
1047   } break;
1048   case UnwindLLDB::RegisterLocation::eRegisterValueInferred:
1049     success =
1050         value.SetUInt(regloc.location.inferred_value, reg_info->byte_size);
1051     break;
1052 
1053   case UnwindLLDB::RegisterLocation::eRegisterNotSaved:
1054     break;
1055   case UnwindLLDB::RegisterLocation::eRegisterSavedAtHostMemoryLocation:
1056     llvm_unreachable("FIXME debugger inferior function call unwind");
1057   case UnwindLLDB::RegisterLocation::eRegisterSavedAtMemoryLocation: {
1058     Error error(ReadRegisterValueFromMemory(
1059         reg_info, regloc.location.target_memory_location, reg_info->byte_size,
1060         value));
1061     success = error.Success();
1062   } break;
1063   default:
1064     llvm_unreachable("Unknown RegisterLocation type.");
1065   }
1066   return success;
1067 }
1068 
1069 bool RegisterContextLLDB::WriteRegisterValueToRegisterLocation(
1070     lldb_private::UnwindLLDB::RegisterLocation regloc,
1071     const RegisterInfo *reg_info, const RegisterValue &value) {
1072   if (!IsValid())
1073     return false;
1074 
1075   bool success = false;
1076 
1077   switch (regloc.type) {
1078   case UnwindLLDB::RegisterLocation::eRegisterInLiveRegisterContext: {
1079     const RegisterInfo *other_reg_info =
1080         GetRegisterInfoAtIndex(regloc.location.register_number);
1081     success =
1082         m_thread.GetRegisterContext()->WriteRegister(other_reg_info, value);
1083   } break;
1084   case UnwindLLDB::RegisterLocation::eRegisterInRegister: {
1085     const RegisterInfo *other_reg_info =
1086         GetRegisterInfoAtIndex(regloc.location.register_number);
1087     if (IsFrameZero()) {
1088       success =
1089           m_thread.GetRegisterContext()->WriteRegister(other_reg_info, value);
1090     } else {
1091       success = GetNextFrame()->WriteRegister(other_reg_info, value);
1092     }
1093   } break;
1094   case UnwindLLDB::RegisterLocation::eRegisterValueInferred:
1095   case UnwindLLDB::RegisterLocation::eRegisterNotSaved:
1096     break;
1097   case UnwindLLDB::RegisterLocation::eRegisterSavedAtHostMemoryLocation:
1098     llvm_unreachable("FIXME debugger inferior function call unwind");
1099   case UnwindLLDB::RegisterLocation::eRegisterSavedAtMemoryLocation: {
1100     Error error(WriteRegisterValueToMemory(
1101         reg_info, regloc.location.target_memory_location, reg_info->byte_size,
1102         value));
1103     success = error.Success();
1104   } break;
1105   default:
1106     llvm_unreachable("Unknown RegisterLocation type.");
1107   }
1108   return success;
1109 }
1110 
1111 bool RegisterContextLLDB::IsValid() const {
1112   return m_frame_type != eNotAValidFrame;
1113 }
1114 
1115 // After the final stack frame in a stack walk we'll get one invalid
1116 // (eNotAValidFrame) stack frame --
1117 // one past the end of the stack walk.  But higher-level code will need to tell
1118 // the differnece between
1119 // "the unwind plan below this frame failed" versus "we successfully completed
1120 // the stack walk" so
1121 // this method helps to disambiguate that.
1122 
1123 bool RegisterContextLLDB::IsTrapHandlerFrame() const {
1124   return m_frame_type == eTrapHandlerFrame;
1125 }
1126 
1127 // A skip frame is a bogus frame on the stack -- but one where we're likely to
1128 // find a real frame farther
1129 // up the stack if we keep looking.  It's always the second frame in an unwind
1130 // (i.e. the first frame after
1131 // frame zero) where unwinding can be the trickiest.  Ideally we'll mark up this
1132 // frame in some way so the
1133 // user knows we're displaying bad data and we may have skipped one frame of
1134 // their real program in the
1135 // process of getting back on track.
1136 
1137 bool RegisterContextLLDB::IsSkipFrame() const {
1138   return m_frame_type == eSkipFrame;
1139 }
1140 
1141 bool RegisterContextLLDB::IsTrapHandlerSymbol(
1142     lldb_private::Process *process,
1143     const lldb_private::SymbolContext &m_sym_ctx) const {
1144   PlatformSP platform_sp(process->GetTarget().GetPlatform());
1145   if (platform_sp) {
1146     const std::vector<ConstString> trap_handler_names(
1147         platform_sp->GetTrapHandlerSymbolNames());
1148     for (ConstString name : trap_handler_names) {
1149       if ((m_sym_ctx.function && m_sym_ctx.function->GetName() == name) ||
1150           (m_sym_ctx.symbol && m_sym_ctx.symbol->GetName() == name)) {
1151         return true;
1152       }
1153     }
1154   }
1155   const std::vector<ConstString> user_specified_trap_handler_names(
1156       m_parent_unwind.GetUserSpecifiedTrapHandlerFunctionNames());
1157   for (ConstString name : user_specified_trap_handler_names) {
1158     if ((m_sym_ctx.function && m_sym_ctx.function->GetName() == name) ||
1159         (m_sym_ctx.symbol && m_sym_ctx.symbol->GetName() == name)) {
1160       return true;
1161     }
1162   }
1163 
1164   return false;
1165 }
1166 
1167 // Answer the question: Where did THIS frame save the CALLER frame ("previous"
1168 // frame)'s register value?
1169 
1170 enum UnwindLLDB::RegisterSearchResult
1171 RegisterContextLLDB::SavedLocationForRegister(
1172     uint32_t lldb_regnum, lldb_private::UnwindLLDB::RegisterLocation &regloc) {
1173   RegisterNumber regnum(m_thread, eRegisterKindLLDB, lldb_regnum);
1174 
1175   // Have we already found this register location?
1176   if (!m_registers.empty()) {
1177     std::map<uint32_t,
1178              lldb_private::UnwindLLDB::RegisterLocation>::const_iterator
1179         iterator;
1180     iterator = m_registers.find(regnum.GetAsKind(eRegisterKindLLDB));
1181     if (iterator != m_registers.end()) {
1182       regloc = iterator->second;
1183       UnwindLogMsg("supplying caller's saved %s (%d)'s location, cached",
1184                    regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB));
1185       return UnwindLLDB::RegisterSearchResult::eRegisterFound;
1186     }
1187   }
1188 
1189   // Look through the available UnwindPlans for the register location.
1190 
1191   UnwindPlan::Row::RegisterLocation unwindplan_regloc;
1192   bool have_unwindplan_regloc = false;
1193   RegisterKind unwindplan_registerkind = kNumRegisterKinds;
1194 
1195   if (m_fast_unwind_plan_sp) {
1196     UnwindPlan::RowSP active_row =
1197         m_fast_unwind_plan_sp->GetRowForFunctionOffset(m_current_offset);
1198     unwindplan_registerkind = m_fast_unwind_plan_sp->GetRegisterKind();
1199     if (regnum.GetAsKind(unwindplan_registerkind) == LLDB_INVALID_REGNUM) {
1200       UnwindLogMsg("could not convert lldb regnum %s (%d) into %d RegisterKind "
1201                    "reg numbering scheme",
1202                    regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB),
1203                    (int)unwindplan_registerkind);
1204       return UnwindLLDB::RegisterSearchResult::eRegisterNotFound;
1205     }
1206     if (active_row->GetRegisterInfo(regnum.GetAsKind(unwindplan_registerkind),
1207                                     unwindplan_regloc)) {
1208       UnwindLogMsg(
1209           "supplying caller's saved %s (%d)'s location using FastUnwindPlan",
1210           regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB));
1211       have_unwindplan_regloc = true;
1212     }
1213   }
1214 
1215   if (!have_unwindplan_regloc) {
1216     // m_full_unwind_plan_sp being NULL means that we haven't tried to find a
1217     // full UnwindPlan yet
1218     if (!m_full_unwind_plan_sp)
1219       m_full_unwind_plan_sp = GetFullUnwindPlanForFrame();
1220 
1221     if (m_full_unwind_plan_sp) {
1222       RegisterNumber pc_regnum(m_thread, eRegisterKindGeneric,
1223                                LLDB_REGNUM_GENERIC_PC);
1224 
1225       UnwindPlan::RowSP active_row =
1226           m_full_unwind_plan_sp->GetRowForFunctionOffset(m_current_offset);
1227       unwindplan_registerkind = m_full_unwind_plan_sp->GetRegisterKind();
1228 
1229       RegisterNumber return_address_reg;
1230 
1231       // If we're fetching the saved pc and this UnwindPlan defines a
1232       // ReturnAddress register (e.g. lr on arm),
1233       // look for the return address register number in the UnwindPlan's row.
1234       if (pc_regnum.IsValid() && pc_regnum == regnum &&
1235           m_full_unwind_plan_sp->GetReturnAddressRegister() !=
1236               LLDB_INVALID_REGNUM) {
1237 
1238         return_address_reg.init(
1239             m_thread, m_full_unwind_plan_sp->GetRegisterKind(),
1240             m_full_unwind_plan_sp->GetReturnAddressRegister());
1241         regnum = return_address_reg;
1242         UnwindLogMsg("requested caller's saved PC but this UnwindPlan uses a "
1243                      "RA reg; getting %s (%d) instead",
1244                      return_address_reg.GetName(),
1245                      return_address_reg.GetAsKind(eRegisterKindLLDB));
1246       } else {
1247         if (regnum.GetAsKind(unwindplan_registerkind) == LLDB_INVALID_REGNUM) {
1248           if (unwindplan_registerkind == eRegisterKindGeneric) {
1249             UnwindLogMsg("could not convert lldb regnum %s (%d) into "
1250                          "eRegisterKindGeneric reg numbering scheme",
1251                          regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB));
1252           } else {
1253             UnwindLogMsg("could not convert lldb regnum %s (%d) into %d "
1254                          "RegisterKind reg numbering scheme",
1255                          regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB),
1256                          (int)unwindplan_registerkind);
1257           }
1258           return UnwindLLDB::RegisterSearchResult::eRegisterNotFound;
1259         }
1260       }
1261 
1262       if (regnum.IsValid() &&
1263           active_row->GetRegisterInfo(regnum.GetAsKind(unwindplan_registerkind),
1264                                       unwindplan_regloc)) {
1265         have_unwindplan_regloc = true;
1266         UnwindLogMsg(
1267             "supplying caller's saved %s (%d)'s location using %s UnwindPlan",
1268             regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB),
1269             m_full_unwind_plan_sp->GetSourceName().GetCString());
1270       }
1271 
1272       // This is frame 0 and we're retrieving the PC and it's saved in a Return
1273       // Address register and
1274       // it hasn't been saved anywhere yet -- that is, it's still live in the
1275       // actual register.
1276       // Handle this specially.
1277 
1278       if (have_unwindplan_regloc == false && return_address_reg.IsValid() &&
1279           IsFrameZero()) {
1280         if (return_address_reg.GetAsKind(eRegisterKindLLDB) !=
1281             LLDB_INVALID_REGNUM) {
1282           lldb_private::UnwindLLDB::RegisterLocation new_regloc;
1283           new_regloc.type =
1284               UnwindLLDB::RegisterLocation::eRegisterInLiveRegisterContext;
1285           new_regloc.location.register_number =
1286               return_address_reg.GetAsKind(eRegisterKindLLDB);
1287           m_registers[regnum.GetAsKind(eRegisterKindLLDB)] = new_regloc;
1288           regloc = new_regloc;
1289           UnwindLogMsg("supplying caller's register %s (%d) from the live "
1290                        "RegisterContext at frame 0, saved in %d",
1291                        return_address_reg.GetName(),
1292                        return_address_reg.GetAsKind(eRegisterKindLLDB),
1293                        return_address_reg.GetAsKind(eRegisterKindLLDB));
1294           return UnwindLLDB::RegisterSearchResult::eRegisterFound;
1295         }
1296       }
1297 
1298       // If this architecture stores the return address in a register (it
1299       // defines a Return Address register)
1300       // and we're on a non-zero stack frame and the Full UnwindPlan says that
1301       // the pc is stored in the
1302       // RA registers (e.g. lr on arm), then we know that the full unwindplan is
1303       // not trustworthy -- this
1304       // is an impossible situation and the instruction emulation code has
1305       // likely been misled.
1306       // If this stack frame meets those criteria, we need to throw away the
1307       // Full UnwindPlan that the
1308       // instruction emulation came up with and fall back to the architecture's
1309       // Default UnwindPlan so
1310       // the stack walk can get past this point.
1311 
1312       // Special note:  If the Full UnwindPlan was generated from the compiler,
1313       // don't second-guess it
1314       // when we're at a call site location.
1315 
1316       // arch_default_ra_regnum is the return address register # in the Full
1317       // UnwindPlan register numbering
1318       RegisterNumber arch_default_ra_regnum(m_thread, eRegisterKindGeneric,
1319                                             LLDB_REGNUM_GENERIC_RA);
1320 
1321       if (arch_default_ra_regnum.GetAsKind(unwindplan_registerkind) !=
1322               LLDB_INVALID_REGNUM &&
1323           pc_regnum == regnum && unwindplan_regloc.IsInOtherRegister() &&
1324           unwindplan_regloc.GetRegisterNumber() ==
1325               arch_default_ra_regnum.GetAsKind(unwindplan_registerkind) &&
1326           m_full_unwind_plan_sp->GetSourcedFromCompiler() != eLazyBoolYes &&
1327           !m_all_registers_available) {
1328         UnwindLogMsg("%s UnwindPlan tried to restore the pc from the link "
1329                      "register but this is a non-zero frame",
1330                      m_full_unwind_plan_sp->GetSourceName().GetCString());
1331 
1332         // Throw away the full unwindplan; install the arch default unwindplan
1333         if (ForceSwitchToFallbackUnwindPlan()) {
1334           // Update for the possibly new unwind plan
1335           unwindplan_registerkind = m_full_unwind_plan_sp->GetRegisterKind();
1336           UnwindPlan::RowSP active_row =
1337               m_full_unwind_plan_sp->GetRowForFunctionOffset(m_current_offset);
1338 
1339           // Sanity check: Verify that we can fetch a pc value and CFA value
1340           // with this unwind plan
1341 
1342           RegisterNumber arch_default_pc_reg(m_thread, eRegisterKindGeneric,
1343                                              LLDB_REGNUM_GENERIC_PC);
1344           bool can_fetch_pc_value = false;
1345           bool can_fetch_cfa = false;
1346           addr_t cfa_value;
1347           if (active_row) {
1348             if (arch_default_pc_reg.GetAsKind(unwindplan_registerkind) !=
1349                     LLDB_INVALID_REGNUM &&
1350                 active_row->GetRegisterInfo(
1351                     arch_default_pc_reg.GetAsKind(unwindplan_registerkind),
1352                     unwindplan_regloc)) {
1353               can_fetch_pc_value = true;
1354             }
1355             if (ReadCFAValueForRow(unwindplan_registerkind, active_row,
1356                                    cfa_value)) {
1357               can_fetch_cfa = true;
1358             }
1359           }
1360 
1361           if (can_fetch_pc_value && can_fetch_cfa) {
1362             have_unwindplan_regloc = true;
1363           } else {
1364             have_unwindplan_regloc = false;
1365           }
1366         } else {
1367           // We were unable to fall back to another unwind plan
1368           have_unwindplan_regloc = false;
1369         }
1370       }
1371     }
1372   }
1373 
1374   ExecutionContext exe_ctx(m_thread.shared_from_this());
1375   Process *process = exe_ctx.GetProcessPtr();
1376   if (have_unwindplan_regloc == false) {
1377     // If the UnwindPlan failed to give us an unwind location for this register,
1378     // we may be able to fall back
1379     // to some ABI-defined default.  For example, some ABIs allow to determine
1380     // the caller's SP via the CFA.
1381     // Also, the ABI may set volatile registers to the undefined state.
1382     ABI *abi = process ? process->GetABI().get() : NULL;
1383     if (abi) {
1384       const RegisterInfo *reg_info =
1385           GetRegisterInfoAtIndex(regnum.GetAsKind(eRegisterKindLLDB));
1386       if (reg_info &&
1387           abi->GetFallbackRegisterLocation(reg_info, unwindplan_regloc)) {
1388         UnwindLogMsg(
1389             "supplying caller's saved %s (%d)'s location using ABI default",
1390             regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB));
1391         have_unwindplan_regloc = true;
1392       }
1393     }
1394   }
1395 
1396   if (have_unwindplan_regloc == false) {
1397     if (IsFrameZero()) {
1398       // This is frame 0 - we should return the actual live register context
1399       // value
1400       lldb_private::UnwindLLDB::RegisterLocation new_regloc;
1401       new_regloc.type =
1402           UnwindLLDB::RegisterLocation::eRegisterInLiveRegisterContext;
1403       new_regloc.location.register_number = regnum.GetAsKind(eRegisterKindLLDB);
1404       m_registers[regnum.GetAsKind(eRegisterKindLLDB)] = new_regloc;
1405       regloc = new_regloc;
1406       UnwindLogMsg("supplying caller's register %s (%d) from the live "
1407                    "RegisterContext at frame 0",
1408                    regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB));
1409       return UnwindLLDB::RegisterSearchResult::eRegisterFound;
1410     } else {
1411       std::string unwindplan_name("");
1412       if (m_full_unwind_plan_sp) {
1413         unwindplan_name += "via '";
1414         unwindplan_name += m_full_unwind_plan_sp->GetSourceName().AsCString();
1415         unwindplan_name += "'";
1416       }
1417       UnwindLogMsg("no save location for %s (%d) %s", regnum.GetName(),
1418                    regnum.GetAsKind(eRegisterKindLLDB),
1419                    unwindplan_name.c_str());
1420     }
1421     return UnwindLLDB::RegisterSearchResult::eRegisterNotFound;
1422   }
1423 
1424   // unwindplan_regloc has valid contents about where to retrieve the register
1425   if (unwindplan_regloc.IsUnspecified()) {
1426     lldb_private::UnwindLLDB::RegisterLocation new_regloc;
1427     new_regloc.type = UnwindLLDB::RegisterLocation::eRegisterNotSaved;
1428     m_registers[regnum.GetAsKind(eRegisterKindLLDB)] = new_regloc;
1429     UnwindLogMsg("save location for %s (%d) is unspecified, continue searching",
1430                  regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB));
1431     return UnwindLLDB::RegisterSearchResult::eRegisterNotFound;
1432   }
1433 
1434   if (unwindplan_regloc.IsUndefined()) {
1435     UnwindLogMsg(
1436         "did not supply reg location for %s (%d) because it is volatile",
1437         regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB));
1438     return UnwindLLDB::RegisterSearchResult::eRegisterIsVolatile;
1439   }
1440 
1441   if (unwindplan_regloc.IsSame()) {
1442     if (IsFrameZero() == false &&
1443         (regnum.GetAsKind(eRegisterKindGeneric) == LLDB_REGNUM_GENERIC_PC ||
1444          regnum.GetAsKind(eRegisterKindGeneric) == LLDB_REGNUM_GENERIC_RA)) {
1445       UnwindLogMsg("register %s (%d) is marked as 'IsSame' - it is a pc or "
1446                    "return address reg on a non-zero frame -- treat as if we "
1447                    "have no information",
1448                    regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB));
1449       return UnwindLLDB::RegisterSearchResult::eRegisterNotFound;
1450     } else {
1451       regloc.type = UnwindLLDB::RegisterLocation::eRegisterInRegister;
1452       regloc.location.register_number = regnum.GetAsKind(eRegisterKindLLDB);
1453       m_registers[regnum.GetAsKind(eRegisterKindLLDB)] = regloc;
1454       UnwindLogMsg(
1455           "supplying caller's register %s (%d), saved in register %s (%d)",
1456           regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB),
1457           regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB));
1458       return UnwindLLDB::RegisterSearchResult::eRegisterFound;
1459     }
1460   }
1461 
1462   if (unwindplan_regloc.IsCFAPlusOffset()) {
1463     int offset = unwindplan_regloc.GetOffset();
1464     regloc.type = UnwindLLDB::RegisterLocation::eRegisterValueInferred;
1465     regloc.location.inferred_value = m_cfa + offset;
1466     m_registers[regnum.GetAsKind(eRegisterKindLLDB)] = regloc;
1467     UnwindLogMsg("supplying caller's register %s (%d), value is CFA plus "
1468                  "offset %d [value is 0x%" PRIx64 "]",
1469                  regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB), offset,
1470                  regloc.location.inferred_value);
1471     return UnwindLLDB::RegisterSearchResult::eRegisterFound;
1472   }
1473 
1474   if (unwindplan_regloc.IsAtCFAPlusOffset()) {
1475     int offset = unwindplan_regloc.GetOffset();
1476     regloc.type = UnwindLLDB::RegisterLocation::eRegisterSavedAtMemoryLocation;
1477     regloc.location.target_memory_location = m_cfa + offset;
1478     m_registers[regnum.GetAsKind(eRegisterKindLLDB)] = regloc;
1479     UnwindLogMsg("supplying caller's register %s (%d) from the stack, saved at "
1480                  "CFA plus offset %d [saved at 0x%" PRIx64 "]",
1481                  regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB), offset,
1482                  regloc.location.target_memory_location);
1483     return UnwindLLDB::RegisterSearchResult::eRegisterFound;
1484   }
1485 
1486   if (unwindplan_regloc.IsInOtherRegister()) {
1487     uint32_t unwindplan_regnum = unwindplan_regloc.GetRegisterNumber();
1488     RegisterNumber row_regnum(m_thread, unwindplan_registerkind,
1489                               unwindplan_regnum);
1490     if (row_regnum.GetAsKind(eRegisterKindLLDB) == LLDB_INVALID_REGNUM) {
1491       UnwindLogMsg("could not supply caller's %s (%d) location - was saved in "
1492                    "another reg but couldn't convert that regnum",
1493                    regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB));
1494       return UnwindLLDB::RegisterSearchResult::eRegisterNotFound;
1495     }
1496     regloc.type = UnwindLLDB::RegisterLocation::eRegisterInRegister;
1497     regloc.location.register_number = row_regnum.GetAsKind(eRegisterKindLLDB);
1498     m_registers[regnum.GetAsKind(eRegisterKindLLDB)] = regloc;
1499     UnwindLogMsg(
1500         "supplying caller's register %s (%d), saved in register %s (%d)",
1501         regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB),
1502         row_regnum.GetName(), row_regnum.GetAsKind(eRegisterKindLLDB));
1503     return UnwindLLDB::RegisterSearchResult::eRegisterFound;
1504   }
1505 
1506   if (unwindplan_regloc.IsDWARFExpression() ||
1507       unwindplan_regloc.IsAtDWARFExpression()) {
1508     DataExtractor dwarfdata(unwindplan_regloc.GetDWARFExpressionBytes(),
1509                             unwindplan_regloc.GetDWARFExpressionLength(),
1510                             process->GetByteOrder(),
1511                             process->GetAddressByteSize());
1512     ModuleSP opcode_ctx;
1513     DWARFExpression dwarfexpr(opcode_ctx, dwarfdata, nullptr, 0,
1514                               unwindplan_regloc.GetDWARFExpressionLength());
1515     dwarfexpr.SetRegisterKind(unwindplan_registerkind);
1516     Value result;
1517     Error error;
1518     if (dwarfexpr.Evaluate(&exe_ctx, nullptr, nullptr, this, 0, nullptr,
1519                            nullptr, result, &error)) {
1520       addr_t val;
1521       val = result.GetScalar().ULongLong();
1522       if (unwindplan_regloc.IsDWARFExpression()) {
1523         regloc.type = UnwindLLDB::RegisterLocation::eRegisterValueInferred;
1524         regloc.location.inferred_value = val;
1525         m_registers[regnum.GetAsKind(eRegisterKindLLDB)] = regloc;
1526         UnwindLogMsg("supplying caller's register %s (%d) via DWARF expression "
1527                      "(IsDWARFExpression)",
1528                      regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB));
1529         return UnwindLLDB::RegisterSearchResult::eRegisterFound;
1530       } else {
1531         regloc.type =
1532             UnwindLLDB::RegisterLocation::eRegisterSavedAtMemoryLocation;
1533         regloc.location.target_memory_location = val;
1534         m_registers[regnum.GetAsKind(eRegisterKindLLDB)] = regloc;
1535         UnwindLogMsg("supplying caller's register %s (%d) via DWARF expression "
1536                      "(IsAtDWARFExpression)",
1537                      regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB));
1538         return UnwindLLDB::RegisterSearchResult::eRegisterFound;
1539       }
1540     }
1541     UnwindLogMsg("tried to use IsDWARFExpression or IsAtDWARFExpression for %s "
1542                  "(%d) but failed",
1543                  regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB));
1544     return UnwindLLDB::RegisterSearchResult::eRegisterNotFound;
1545   }
1546 
1547   UnwindLogMsg("no save location for %s (%d) in this stack frame",
1548                regnum.GetName(), regnum.GetAsKind(eRegisterKindLLDB));
1549 
1550   // FIXME UnwindPlan::Row types atDWARFExpression and isDWARFExpression are
1551   // unsupported.
1552 
1553   return UnwindLLDB::RegisterSearchResult::eRegisterNotFound;
1554 }
1555 
1556 // TryFallbackUnwindPlan() -- this method is a little tricky.
1557 //
1558 // When this is called, the frame above -- the caller frame, the "previous"
1559 // frame --
1560 // is invalid or bad.
1561 //
1562 // Instead of stopping the stack walk here, we'll try a different UnwindPlan and
1563 // see
1564 // if we can get a valid frame above us.
1565 //
1566 // This most often happens when an unwind plan based on assembly instruction
1567 // inspection
1568 // is not correct -- mostly with hand-written assembly functions or functions
1569 // where the
1570 // stack frame is set up "out of band", e.g. the kernel saved the register
1571 // context and
1572 // then called an asynchronous trap handler like _sigtramp.
1573 //
1574 // Often in these cases, if we just do a dumb stack walk we'll get past this
1575 // tricky
1576 // frame and our usual techniques can continue to be used.
1577 
1578 bool RegisterContextLLDB::TryFallbackUnwindPlan() {
1579   if (m_fallback_unwind_plan_sp.get() == nullptr)
1580     return false;
1581 
1582   if (m_full_unwind_plan_sp.get() == nullptr)
1583     return false;
1584 
1585   if (m_full_unwind_plan_sp.get() == m_fallback_unwind_plan_sp.get() ||
1586       m_full_unwind_plan_sp->GetSourceName() ==
1587           m_fallback_unwind_plan_sp->GetSourceName()) {
1588     return false;
1589   }
1590 
1591   // If a compiler generated unwind plan failed, trying the arch default
1592   // unwindplan
1593   // isn't going to do any better.
1594   if (m_full_unwind_plan_sp->GetSourcedFromCompiler() == eLazyBoolYes)
1595     return false;
1596 
1597   // Get the caller's pc value and our own CFA value.
1598   // Swap in the fallback unwind plan, re-fetch the caller's pc value and CFA
1599   // value.
1600   // If they're the same, then the fallback unwind plan provides no benefit.
1601 
1602   RegisterNumber pc_regnum(m_thread, eRegisterKindGeneric,
1603                            LLDB_REGNUM_GENERIC_PC);
1604 
1605   addr_t old_caller_pc_value = LLDB_INVALID_ADDRESS;
1606   addr_t new_caller_pc_value = LLDB_INVALID_ADDRESS;
1607   addr_t old_this_frame_cfa_value = m_cfa;
1608   UnwindLLDB::RegisterLocation regloc;
1609   if (SavedLocationForRegister(pc_regnum.GetAsKind(eRegisterKindLLDB),
1610                                regloc) ==
1611       UnwindLLDB::RegisterSearchResult::eRegisterFound) {
1612     const RegisterInfo *reg_info =
1613         GetRegisterInfoAtIndex(pc_regnum.GetAsKind(eRegisterKindLLDB));
1614     if (reg_info) {
1615       RegisterValue reg_value;
1616       if (ReadRegisterValueFromRegisterLocation(regloc, reg_info, reg_value)) {
1617         old_caller_pc_value = reg_value.GetAsUInt64();
1618       }
1619     }
1620   }
1621 
1622   // This is a tricky wrinkle!  If SavedLocationForRegister() detects a really
1623   // impossible
1624   // register location for the full unwind plan, it may call
1625   // ForceSwitchToFallbackUnwindPlan()
1626   // which in turn replaces the full unwindplan with the fallback... in short,
1627   // we're done,
1628   // we're using the fallback UnwindPlan.
1629   // We checked if m_fallback_unwind_plan_sp was nullptr at the top -- the only
1630   // way it
1631   // became nullptr since then is via SavedLocationForRegister().
1632   if (m_fallback_unwind_plan_sp.get() == nullptr)
1633     return true;
1634 
1635   // Switch the full UnwindPlan to be the fallback UnwindPlan.  If we decide
1636   // this isn't
1637   // working, we need to restore.
1638   // We'll also need to save & restore the value of the m_cfa ivar.  Save is
1639   // down below a bit in 'old_cfa'.
1640   UnwindPlanSP original_full_unwind_plan_sp = m_full_unwind_plan_sp;
1641   addr_t old_cfa = m_cfa;
1642 
1643   m_registers.clear();
1644 
1645   m_full_unwind_plan_sp = m_fallback_unwind_plan_sp;
1646 
1647   UnwindPlan::RowSP active_row =
1648       m_fallback_unwind_plan_sp->GetRowForFunctionOffset(m_current_offset);
1649 
1650   if (active_row &&
1651       active_row->GetCFAValue().GetValueType() !=
1652           UnwindPlan::Row::CFAValue::unspecified) {
1653     addr_t new_cfa;
1654     if (!ReadCFAValueForRow(m_fallback_unwind_plan_sp->GetRegisterKind(),
1655                             active_row, new_cfa) ||
1656         new_cfa == 0 || new_cfa == 1 || new_cfa == LLDB_INVALID_ADDRESS) {
1657       UnwindLogMsg("failed to get cfa with fallback unwindplan");
1658       m_fallback_unwind_plan_sp.reset();
1659       m_full_unwind_plan_sp = original_full_unwind_plan_sp;
1660       m_cfa = old_cfa;
1661       return false;
1662     }
1663     m_cfa = new_cfa;
1664 
1665     if (SavedLocationForRegister(pc_regnum.GetAsKind(eRegisterKindLLDB),
1666                                  regloc) ==
1667         UnwindLLDB::RegisterSearchResult::eRegisterFound) {
1668       const RegisterInfo *reg_info =
1669           GetRegisterInfoAtIndex(pc_regnum.GetAsKind(eRegisterKindLLDB));
1670       if (reg_info) {
1671         RegisterValue reg_value;
1672         if (ReadRegisterValueFromRegisterLocation(regloc, reg_info,
1673                                                   reg_value)) {
1674           new_caller_pc_value = reg_value.GetAsUInt64();
1675         }
1676       }
1677     }
1678 
1679     if (new_caller_pc_value == LLDB_INVALID_ADDRESS) {
1680       UnwindLogMsg("failed to get a pc value for the caller frame with the "
1681                    "fallback unwind plan");
1682       m_fallback_unwind_plan_sp.reset();
1683       m_full_unwind_plan_sp = original_full_unwind_plan_sp;
1684       m_cfa = old_cfa;
1685       return false;
1686     }
1687 
1688     if (old_caller_pc_value != LLDB_INVALID_ADDRESS) {
1689       if (old_caller_pc_value == new_caller_pc_value &&
1690           new_cfa == old_this_frame_cfa_value) {
1691         UnwindLogMsg("fallback unwind plan got the same values for this frame "
1692                      "CFA and caller frame pc, not using");
1693         m_fallback_unwind_plan_sp.reset();
1694         m_full_unwind_plan_sp = original_full_unwind_plan_sp;
1695         m_cfa = old_cfa;
1696         return false;
1697       }
1698     }
1699 
1700     UnwindLogMsg("trying to unwind from this function with the UnwindPlan '%s' "
1701                  "because UnwindPlan '%s' failed.",
1702                  m_fallback_unwind_plan_sp->GetSourceName().GetCString(),
1703                  original_full_unwind_plan_sp->GetSourceName().GetCString());
1704 
1705     // We've copied the fallback unwind plan into the full - now clear the
1706     // fallback.
1707     m_fallback_unwind_plan_sp.reset();
1708   }
1709 
1710   return true;
1711 }
1712 
1713 bool RegisterContextLLDB::ForceSwitchToFallbackUnwindPlan() {
1714   if (m_fallback_unwind_plan_sp.get() == NULL)
1715     return false;
1716 
1717   if (m_full_unwind_plan_sp.get() == NULL)
1718     return false;
1719 
1720   if (m_full_unwind_plan_sp.get() == m_fallback_unwind_plan_sp.get() ||
1721       m_full_unwind_plan_sp->GetSourceName() ==
1722           m_fallback_unwind_plan_sp->GetSourceName()) {
1723     return false;
1724   }
1725 
1726   UnwindPlan::RowSP active_row =
1727       m_fallback_unwind_plan_sp->GetRowForFunctionOffset(m_current_offset);
1728 
1729   if (active_row &&
1730       active_row->GetCFAValue().GetValueType() !=
1731           UnwindPlan::Row::CFAValue::unspecified) {
1732     addr_t new_cfa;
1733     if (!ReadCFAValueForRow(m_fallback_unwind_plan_sp->GetRegisterKind(),
1734                             active_row, new_cfa) ||
1735         new_cfa == 0 || new_cfa == 1 || new_cfa == LLDB_INVALID_ADDRESS) {
1736       UnwindLogMsg("failed to get cfa with fallback unwindplan");
1737       m_fallback_unwind_plan_sp.reset();
1738       return false;
1739     }
1740 
1741     m_full_unwind_plan_sp = m_fallback_unwind_plan_sp;
1742     m_fallback_unwind_plan_sp.reset();
1743 
1744     m_registers.clear();
1745 
1746     m_cfa = new_cfa;
1747 
1748     UnwindLogMsg("switched unconditionally to the fallback unwindplan %s",
1749                  m_full_unwind_plan_sp->GetSourceName().GetCString());
1750     return true;
1751   }
1752   return false;
1753 }
1754 
1755 bool RegisterContextLLDB::ReadCFAValueForRow(
1756     lldb::RegisterKind row_register_kind, const UnwindPlan::RowSP &row,
1757     addr_t &cfa_value) {
1758   RegisterValue reg_value;
1759 
1760   cfa_value = LLDB_INVALID_ADDRESS;
1761   addr_t cfa_reg_contents;
1762 
1763   switch (row->GetCFAValue().GetValueType()) {
1764   case UnwindPlan::Row::CFAValue::isRegisterDereferenced: {
1765     RegisterNumber cfa_reg(m_thread, row_register_kind,
1766                            row->GetCFAValue().GetRegisterNumber());
1767     if (ReadGPRValue(cfa_reg, cfa_reg_contents)) {
1768       const RegisterInfo *reg_info =
1769           GetRegisterInfoAtIndex(cfa_reg.GetAsKind(eRegisterKindLLDB));
1770       RegisterValue reg_value;
1771       if (reg_info) {
1772         Error error = ReadRegisterValueFromMemory(
1773             reg_info, cfa_reg_contents, reg_info->byte_size, reg_value);
1774         if (error.Success()) {
1775           cfa_value = reg_value.GetAsUInt64();
1776           UnwindLogMsg(
1777               "CFA value via dereferencing reg %s (%d): reg has val 0x%" PRIx64
1778               ", CFA value is 0x%" PRIx64,
1779               cfa_reg.GetName(), cfa_reg.GetAsKind(eRegisterKindLLDB),
1780               cfa_reg_contents, cfa_value);
1781           return true;
1782         } else {
1783           UnwindLogMsg("Tried to deref reg %s (%d) [0x%" PRIx64
1784                        "] but memory read failed.",
1785                        cfa_reg.GetName(), cfa_reg.GetAsKind(eRegisterKindLLDB),
1786                        cfa_reg_contents);
1787         }
1788       }
1789     }
1790     break;
1791   }
1792   case UnwindPlan::Row::CFAValue::isRegisterPlusOffset: {
1793     RegisterNumber cfa_reg(m_thread, row_register_kind,
1794                            row->GetCFAValue().GetRegisterNumber());
1795     if (ReadGPRValue(cfa_reg, cfa_reg_contents)) {
1796       if (cfa_reg_contents == LLDB_INVALID_ADDRESS || cfa_reg_contents == 0 ||
1797           cfa_reg_contents == 1) {
1798         UnwindLogMsg(
1799             "Got an invalid CFA register value - reg %s (%d), value 0x%" PRIx64,
1800             cfa_reg.GetName(), cfa_reg.GetAsKind(eRegisterKindLLDB),
1801             cfa_reg_contents);
1802         cfa_reg_contents = LLDB_INVALID_ADDRESS;
1803         return false;
1804       }
1805       cfa_value = cfa_reg_contents + row->GetCFAValue().GetOffset();
1806       UnwindLogMsg(
1807           "CFA is 0x%" PRIx64 ": Register %s (%d) contents are 0x%" PRIx64
1808           ", offset is %d",
1809           cfa_value, cfa_reg.GetName(), cfa_reg.GetAsKind(eRegisterKindLLDB),
1810           cfa_reg_contents, row->GetCFAValue().GetOffset());
1811       return true;
1812     }
1813     break;
1814   }
1815   case UnwindPlan::Row::CFAValue::isDWARFExpression: {
1816     ExecutionContext exe_ctx(m_thread.shared_from_this());
1817     Process *process = exe_ctx.GetProcessPtr();
1818     DataExtractor dwarfdata(row->GetCFAValue().GetDWARFExpressionBytes(),
1819                             row->GetCFAValue().GetDWARFExpressionLength(),
1820                             process->GetByteOrder(),
1821                             process->GetAddressByteSize());
1822     ModuleSP opcode_ctx;
1823     DWARFExpression dwarfexpr(opcode_ctx, dwarfdata, nullptr, 0,
1824                               row->GetCFAValue().GetDWARFExpressionLength());
1825     dwarfexpr.SetRegisterKind(row_register_kind);
1826     Value result;
1827     Error error;
1828     if (dwarfexpr.Evaluate(&exe_ctx, nullptr, nullptr, this, 0, nullptr,
1829                            nullptr, result, &error)) {
1830       cfa_value = result.GetScalar().ULongLong();
1831 
1832       UnwindLogMsg("CFA value set by DWARF expression is 0x%" PRIx64,
1833                    cfa_value);
1834       return true;
1835     }
1836     UnwindLogMsg("Failed to set CFA value via DWARF expression: %s",
1837                  error.AsCString());
1838     break;
1839   }
1840   default:
1841     return false;
1842   }
1843   return false;
1844 }
1845 
1846 // Retrieve a general purpose register value for THIS frame, as saved by the
1847 // NEXT frame, i.e. the frame that
1848 // this frame called.  e.g.
1849 //
1850 //  foo () { }
1851 //  bar () { foo (); }
1852 //  main () { bar (); }
1853 //
1854 //  stopped in foo() so
1855 //     frame 0 - foo
1856 //     frame 1 - bar
1857 //     frame 2 - main
1858 //  and this RegisterContext is for frame 1 (bar) - if we want to get the pc
1859 //  value for frame 1, we need to ask
1860 //  where frame 0 (the "next" frame) saved that and retrieve the value.
1861 
1862 bool RegisterContextLLDB::ReadGPRValue(lldb::RegisterKind register_kind,
1863                                        uint32_t regnum, addr_t &value) {
1864   if (!IsValid())
1865     return false;
1866 
1867   uint32_t lldb_regnum;
1868   if (register_kind == eRegisterKindLLDB) {
1869     lldb_regnum = regnum;
1870   } else if (!m_thread.GetRegisterContext()->ConvertBetweenRegisterKinds(
1871                  register_kind, regnum, eRegisterKindLLDB, lldb_regnum)) {
1872     return false;
1873   }
1874 
1875   const RegisterInfo *reg_info = GetRegisterInfoAtIndex(lldb_regnum);
1876   RegisterValue reg_value;
1877   // if this is frame 0 (currently executing frame), get the requested reg
1878   // contents from the actual thread registers
1879   if (IsFrameZero()) {
1880     if (m_thread.GetRegisterContext()->ReadRegister(reg_info, reg_value)) {
1881       value = reg_value.GetAsUInt64();
1882       return true;
1883     }
1884     return false;
1885   }
1886 
1887   bool pc_register = false;
1888   uint32_t generic_regnum;
1889   if (register_kind == eRegisterKindGeneric &&
1890       (regnum == LLDB_REGNUM_GENERIC_PC || regnum == LLDB_REGNUM_GENERIC_RA)) {
1891     pc_register = true;
1892   } else if (m_thread.GetRegisterContext()->ConvertBetweenRegisterKinds(
1893                  register_kind, regnum, eRegisterKindGeneric, generic_regnum) &&
1894              (generic_regnum == LLDB_REGNUM_GENERIC_PC ||
1895               generic_regnum == LLDB_REGNUM_GENERIC_RA)) {
1896     pc_register = true;
1897   }
1898 
1899   lldb_private::UnwindLLDB::RegisterLocation regloc;
1900   if (!m_parent_unwind.SearchForSavedLocationForRegister(
1901           lldb_regnum, regloc, m_frame_number - 1, pc_register)) {
1902     return false;
1903   }
1904   if (ReadRegisterValueFromRegisterLocation(regloc, reg_info, reg_value)) {
1905     value = reg_value.GetAsUInt64();
1906     return true;
1907   }
1908   return false;
1909 }
1910 
1911 bool RegisterContextLLDB::ReadGPRValue(const RegisterNumber &regnum,
1912                                        addr_t &value) {
1913   return ReadGPRValue(regnum.GetRegisterKind(), regnum.GetRegisterNumber(),
1914                       value);
1915 }
1916 
1917 // Find the value of a register in THIS frame
1918 
1919 bool RegisterContextLLDB::ReadRegister(const RegisterInfo *reg_info,
1920                                        RegisterValue &value) {
1921   if (!IsValid())
1922     return false;
1923 
1924   const uint32_t lldb_regnum = reg_info->kinds[eRegisterKindLLDB];
1925   UnwindLogMsgVerbose("looking for register saved location for reg %d",
1926                       lldb_regnum);
1927 
1928   // If this is the 0th frame, hand this over to the live register context
1929   if (IsFrameZero()) {
1930     UnwindLogMsgVerbose("passing along to the live register context for reg %d",
1931                         lldb_regnum);
1932     return m_thread.GetRegisterContext()->ReadRegister(reg_info, value);
1933   }
1934 
1935   bool is_pc_regnum = false;
1936   if (reg_info->kinds[eRegisterKindGeneric] == LLDB_REGNUM_GENERIC_PC ||
1937       reg_info->kinds[eRegisterKindGeneric] == LLDB_REGNUM_GENERIC_RA) {
1938     is_pc_regnum = true;
1939   }
1940 
1941   lldb_private::UnwindLLDB::RegisterLocation regloc;
1942   // Find out where the NEXT frame saved THIS frame's register contents
1943   if (!m_parent_unwind.SearchForSavedLocationForRegister(
1944           lldb_regnum, regloc, m_frame_number - 1, is_pc_regnum))
1945     return false;
1946 
1947   return ReadRegisterValueFromRegisterLocation(regloc, reg_info, value);
1948 }
1949 
1950 bool RegisterContextLLDB::WriteRegister(const RegisterInfo *reg_info,
1951                                         const RegisterValue &value) {
1952   if (!IsValid())
1953     return false;
1954 
1955   const uint32_t lldb_regnum = reg_info->kinds[eRegisterKindLLDB];
1956   UnwindLogMsgVerbose("looking for register saved location for reg %d",
1957                       lldb_regnum);
1958 
1959   // If this is the 0th frame, hand this over to the live register context
1960   if (IsFrameZero()) {
1961     UnwindLogMsgVerbose("passing along to the live register context for reg %d",
1962                         lldb_regnum);
1963     return m_thread.GetRegisterContext()->WriteRegister(reg_info, value);
1964   }
1965 
1966   lldb_private::UnwindLLDB::RegisterLocation regloc;
1967   // Find out where the NEXT frame saved THIS frame's register contents
1968   if (!m_parent_unwind.SearchForSavedLocationForRegister(
1969           lldb_regnum, regloc, m_frame_number - 1, false))
1970     return false;
1971 
1972   return WriteRegisterValueToRegisterLocation(regloc, reg_info, value);
1973 }
1974 
1975 // Don't need to implement this one
1976 bool RegisterContextLLDB::ReadAllRegisterValues(lldb::DataBufferSP &data_sp) {
1977   return false;
1978 }
1979 
1980 // Don't need to implement this one
1981 bool RegisterContextLLDB::WriteAllRegisterValues(
1982     const lldb::DataBufferSP &data_sp) {
1983   return false;
1984 }
1985 
1986 // Retrieve the pc value for THIS from
1987 
1988 bool RegisterContextLLDB::GetCFA(addr_t &cfa) {
1989   if (!IsValid()) {
1990     return false;
1991   }
1992   if (m_cfa == LLDB_INVALID_ADDRESS) {
1993     return false;
1994   }
1995   cfa = m_cfa;
1996   return true;
1997 }
1998 
1999 RegisterContextLLDB::SharedPtr RegisterContextLLDB::GetNextFrame() const {
2000   RegisterContextLLDB::SharedPtr regctx;
2001   if (m_frame_number == 0)
2002     return regctx;
2003   return m_parent_unwind.GetRegisterContextForFrameNum(m_frame_number - 1);
2004 }
2005 
2006 RegisterContextLLDB::SharedPtr RegisterContextLLDB::GetPrevFrame() const {
2007   RegisterContextLLDB::SharedPtr regctx;
2008   return m_parent_unwind.GetRegisterContextForFrameNum(m_frame_number + 1);
2009 }
2010 
2011 // Retrieve the address of the start of the function of THIS frame
2012 
2013 bool RegisterContextLLDB::GetStartPC(addr_t &start_pc) {
2014   if (!IsValid())
2015     return false;
2016 
2017   if (!m_start_pc.IsValid()) {
2018     return ReadPC(start_pc);
2019   }
2020   start_pc = m_start_pc.GetLoadAddress(CalculateTarget().get());
2021   return true;
2022 }
2023 
2024 // Retrieve the current pc value for THIS frame, as saved by the NEXT frame.
2025 
2026 bool RegisterContextLLDB::ReadPC(addr_t &pc) {
2027   if (!IsValid())
2028     return false;
2029 
2030   bool above_trap_handler = false;
2031   if (GetNextFrame().get() && GetNextFrame()->IsValid() &&
2032       GetNextFrame()->IsTrapHandlerFrame())
2033     above_trap_handler = true;
2034 
2035   if (ReadGPRValue(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, pc)) {
2036     // A pc value of 0 or 1 is impossible in the middle of the stack -- it
2037     // indicates the end of a stack walk.
2038     // On the currently executing frame (or such a frame interrupted
2039     // asynchronously by sigtramp et al) this may
2040     // occur if code has jumped through a NULL pointer -- we want to be able to
2041     // unwind past that frame to help
2042     // find the bug.
2043 
2044     if (m_all_registers_available == false && above_trap_handler == false &&
2045         (pc == 0 || pc == 1)) {
2046       return false;
2047     } else {
2048       return true;
2049     }
2050   } else {
2051     return false;
2052   }
2053 }
2054 
2055 void RegisterContextLLDB::UnwindLogMsg(const char *fmt, ...) {
2056   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_UNWIND));
2057   if (log) {
2058     va_list args;
2059     va_start(args, fmt);
2060 
2061     char *logmsg;
2062     if (vasprintf(&logmsg, fmt, args) == -1 || logmsg == NULL) {
2063       if (logmsg)
2064         free(logmsg);
2065       va_end(args);
2066       return;
2067     }
2068     va_end(args);
2069 
2070     log->Printf("%*sth%d/fr%u %s", m_frame_number < 100 ? m_frame_number : 100,
2071                 "", m_thread.GetIndexID(), m_frame_number, logmsg);
2072     free(logmsg);
2073   }
2074 }
2075 
2076 void RegisterContextLLDB::UnwindLogMsgVerbose(const char *fmt, ...) {
2077   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_UNWIND));
2078   if (log && log->GetVerbose()) {
2079     va_list args;
2080     va_start(args, fmt);
2081 
2082     char *logmsg;
2083     if (vasprintf(&logmsg, fmt, args) == -1 || logmsg == NULL) {
2084       if (logmsg)
2085         free(logmsg);
2086       va_end(args);
2087       return;
2088     }
2089     va_end(args);
2090 
2091     log->Printf("%*sth%d/fr%u %s", m_frame_number < 100 ? m_frame_number : 100,
2092                 "", m_thread.GetIndexID(), m_frame_number, logmsg);
2093     free(logmsg);
2094   }
2095 }
2096