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