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