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
11 #include "lldb/lldb-private.h"
12 #include "lldb/Core/Address.h"
13 #include "lldb/Core/AddressRange.h"
14 #include "lldb/Core/DataBufferHeap.h"
15 #include "lldb/Core/Log.h"
16 #include "lldb/Core/Module.h"
17 #include "lldb/Core/RegisterValue.h"
18 #include "lldb/Core/Value.h"
19 #include "lldb/Expression/DWARFExpression.h"
20 #include "lldb/Symbol/DWARFCallFrameInfo.h"
21 #include "lldb/Symbol/FuncUnwinders.h"
22 #include "lldb/Symbol/Function.h"
23 #include "lldb/Symbol/ObjectFile.h"
24 #include "lldb/Symbol/SymbolContext.h"
25 #include "lldb/Symbol/Symbol.h"
26 #include "lldb/Target/ABI.h"
27 #include "lldb/Target/ExecutionContext.h"
28 #include "lldb/Target/Process.h"
29 #include "lldb/Target/StackFrame.h"
30 #include "lldb/Target/Target.h"
31 #include "lldb/Target/Thread.h"
32 #include "lldb/Target/DynamicLoader.h"
33
34 #include "RegisterContextLLDB.h"
35
36 using namespace lldb;
37 using namespace lldb_private;
38
RegisterContextLLDB(Thread & thread,const SharedPtr & next_frame,SymbolContext & sym_ctx,uint32_t frame_number,UnwindLLDB & unwind_lldb)39 RegisterContextLLDB::RegisterContextLLDB
40 (
41 Thread& thread,
42 const SharedPtr &next_frame,
43 SymbolContext& sym_ctx,
44 uint32_t frame_number,
45 UnwindLLDB& unwind_lldb
46 ) :
47 RegisterContext (thread, frame_number),
48 m_thread(thread),
49 m_fast_unwind_plan_sp (),
50 m_full_unwind_plan_sp (),
51 m_all_registers_available(false),
52 m_frame_type (-1),
53 m_cfa (LLDB_INVALID_ADDRESS),
54 m_start_pc (),
55 m_current_pc (),
56 m_current_offset (0),
57 m_current_offset_backed_up_one (0),
58 m_sym_ctx(sym_ctx),
59 m_sym_ctx_valid (false),
60 m_frame_number (frame_number),
61 m_registers(),
62 m_parent_unwind (unwind_lldb)
63 {
64 m_sym_ctx.Clear(false);
65 m_sym_ctx_valid = false;
66
67 if (IsFrameZero ())
68 {
69 InitializeZerothFrame ();
70 }
71 else
72 {
73 InitializeNonZerothFrame ();
74 }
75
76 // This same code exists over in the GetFullUnwindPlanForFrame() but it may not have been executed yet
77 if (IsFrameZero()
78 || next_frame->m_frame_type == eSigtrampFrame
79 || next_frame->m_frame_type == eDebuggerFrame)
80 {
81 m_all_registers_available = true;
82 }
83 }
84
85 // Initialize a RegisterContextLLDB which is the first frame of a stack -- the zeroth frame or currently
86 // executing frame.
87
88 void
InitializeZerothFrame()89 RegisterContextLLDB::InitializeZerothFrame()
90 {
91 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_UNWIND));
92 ExecutionContext exe_ctx(m_thread.shared_from_this());
93 RegisterContextSP reg_ctx_sp = m_thread.GetRegisterContext();
94
95 if (reg_ctx_sp.get() == NULL)
96 {
97 m_frame_type = eNotAValidFrame;
98 return;
99 }
100
101 addr_t current_pc = reg_ctx_sp->GetPC();
102
103 if (current_pc == LLDB_INVALID_ADDRESS)
104 {
105 m_frame_type = eNotAValidFrame;
106 return;
107 }
108
109 Process *process = exe_ctx.GetProcessPtr();
110
111 // Let ABIs fixup code addresses to make sure they are valid. In ARM ABIs
112 // this will strip bit zero in case we read a PC from memory or from the LR.
113 // (which would be a no-op in frame 0 where we get it from the register set,
114 // but still a good idea to make the call here for other ABIs that may exist.)
115 ABI *abi = process->GetABI().get();
116 if (abi)
117 current_pc = abi->FixCodeAddress(current_pc);
118
119 // Initialize m_current_pc, an Address object, based on current_pc, an addr_t.
120 process->GetTarget().GetSectionLoadList().ResolveLoadAddress (current_pc, m_current_pc);
121
122 // If we don't have a Module for some reason, we're not going to find symbol/function information - just
123 // stick in some reasonable defaults and hope we can unwind past this frame.
124 ModuleSP pc_module_sp (m_current_pc.GetModule());
125 if (!m_current_pc.IsValid() || !pc_module_sp)
126 {
127 UnwindLogMsg ("using architectural default unwind method");
128 }
129
130 // We require that eSymbolContextSymbol be successfully filled in or this context is of no use to us.
131 if (pc_module_sp.get()
132 && (pc_module_sp->ResolveSymbolContextForAddress (m_current_pc, eSymbolContextFunction| eSymbolContextSymbol, m_sym_ctx) & eSymbolContextSymbol) == eSymbolContextSymbol)
133 {
134 m_sym_ctx_valid = true;
135 }
136
137 AddressRange addr_range;
138 m_sym_ctx.GetAddressRange (eSymbolContextFunction | eSymbolContextSymbol, 0, false, addr_range);
139
140 static ConstString g_sigtramp_name ("_sigtramp");
141 if ((m_sym_ctx.function && m_sym_ctx.function->GetName() == g_sigtramp_name) ||
142 (m_sym_ctx.symbol && m_sym_ctx.symbol->GetName() == g_sigtramp_name))
143 {
144 m_frame_type = eSigtrampFrame;
145 }
146 else
147 {
148 // FIXME: Detect eDebuggerFrame here.
149 m_frame_type = eNormalFrame;
150 }
151
152 // If we were able to find a symbol/function, set addr_range to the bounds of that symbol/function.
153 // else treat the current pc value as the start_pc and record no offset.
154 if (addr_range.GetBaseAddress().IsValid())
155 {
156 m_start_pc = addr_range.GetBaseAddress();
157 if (m_current_pc.GetSection() == m_start_pc.GetSection())
158 {
159 m_current_offset = m_current_pc.GetOffset() - m_start_pc.GetOffset();
160 }
161 else if (m_current_pc.GetModule() == m_start_pc.GetModule())
162 {
163 // This means that whatever symbol we kicked up isn't really correct
164 // --- we should not cross section boundaries ... We really should NULL out
165 // the function/symbol in this case unless there is a bad assumption
166 // here due to inlined functions?
167 m_current_offset = m_current_pc.GetFileAddress() - m_start_pc.GetFileAddress();
168 }
169 m_current_offset_backed_up_one = m_current_offset;
170 }
171 else
172 {
173 m_start_pc = m_current_pc;
174 m_current_offset = -1;
175 m_current_offset_backed_up_one = -1;
176 }
177
178 // We've set m_frame_type and m_sym_ctx before these calls.
179
180 m_fast_unwind_plan_sp = GetFastUnwindPlanForFrame ();
181 m_full_unwind_plan_sp = GetFullUnwindPlanForFrame ();
182
183 UnwindPlan::RowSP active_row;
184 int cfa_offset = 0;
185 int row_register_kind = -1;
186 if (m_full_unwind_plan_sp && m_full_unwind_plan_sp->PlanValidAtAddress (m_current_pc))
187 {
188 active_row = m_full_unwind_plan_sp->GetRowForFunctionOffset (m_current_offset);
189 row_register_kind = m_full_unwind_plan_sp->GetRegisterKind ();
190 if (active_row.get() && log)
191 {
192 StreamString active_row_strm;
193 active_row->Dump(active_row_strm, m_full_unwind_plan_sp.get(), &m_thread, m_start_pc.GetLoadAddress(exe_ctx.GetTargetPtr()));
194 UnwindLogMsg ("%s", active_row_strm.GetString().c_str());
195 }
196 }
197
198 if (!active_row.get())
199 {
200 m_frame_type = eNotAValidFrame;
201 return;
202 }
203
204
205 addr_t cfa_regval = LLDB_INVALID_ADDRESS;
206 if (!ReadGPRValue (row_register_kind, active_row->GetCFARegister(), cfa_regval))
207 {
208 m_frame_type = eNotAValidFrame;
209 return;
210 }
211
212 cfa_offset = active_row->GetCFAOffset ();
213 m_cfa = cfa_regval + cfa_offset;
214
215 UnwindLogMsg ("cfa_regval = 0x%16.16" PRIx64 " (cfa_regval = 0x%16.16" PRIx64 ", cfa_offset = %i)", m_cfa, cfa_regval, cfa_offset);
216 UnwindLogMsg ("initialized frame current pc is 0x%" PRIx64 " cfa is 0x%" PRIx64 " using %s UnwindPlan",
217 (uint64_t) m_current_pc.GetLoadAddress (exe_ctx.GetTargetPtr()),
218 (uint64_t) m_cfa,
219 m_full_unwind_plan_sp->GetSourceName().GetCString());
220 }
221
222 // Initialize a RegisterContextLLDB for the non-zeroth frame -- rely on the RegisterContextLLDB "below" it
223 // to provide things like its current pc value.
224
225 void
InitializeNonZerothFrame()226 RegisterContextLLDB::InitializeNonZerothFrame()
227 {
228 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_UNWIND));
229 if (IsFrameZero ())
230 {
231 m_frame_type = eNotAValidFrame;
232 return;
233 }
234
235 if (!GetNextFrame().get() || !GetNextFrame()->IsValid())
236 {
237 m_frame_type = eNotAValidFrame;
238 return;
239 }
240 if (!m_thread.GetRegisterContext())
241 {
242 m_frame_type = eNotAValidFrame;
243 return;
244 }
245
246 addr_t pc;
247 if (!ReadGPRValue (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, pc))
248 {
249 UnwindLogMsg ("could not get pc value");
250 m_frame_type = eNotAValidFrame;
251 return;
252 }
253
254 if (log)
255 {
256 UnwindLogMsg ("pc = 0x%16.16" PRIx64, pc);
257 addr_t reg_val;
258 if (ReadGPRValue (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FP, reg_val))
259 UnwindLogMsg ("fp = 0x%16.16" PRIx64, reg_val);
260 if (ReadGPRValue (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, reg_val))
261 UnwindLogMsg ("sp = 0x%16.16" PRIx64, reg_val);
262 }
263
264 // A pc of 0x0 means it's the end of the stack crawl
265 if (pc == 0)
266 {
267 m_frame_type = eNotAValidFrame;
268 return;
269 }
270
271 ExecutionContext exe_ctx(m_thread.shared_from_this());
272 Process *process = exe_ctx.GetProcessPtr();
273 // Let ABIs fixup code addresses to make sure they are valid. In ARM ABIs
274 // this will strip bit zero in case we read a PC from memory or from the LR.
275 ABI *abi = process->GetABI().get();
276 if (abi)
277 pc = abi->FixCodeAddress(pc);
278
279 process->GetTarget().GetSectionLoadList().ResolveLoadAddress (pc, m_current_pc);
280
281 // If we don't have a Module for some reason, we're not going to find symbol/function information - just
282 // stick in some reasonable defaults and hope we can unwind past this frame.
283 ModuleSP pc_module_sp (m_current_pc.GetModule());
284 if (!m_current_pc.IsValid() || !pc_module_sp)
285 {
286 UnwindLogMsg ("using architectural default unwind method");
287
288 // Test the pc value to see if we know it's in an unmapped/non-executable region of memory.
289 uint32_t permissions;
290 if (process->GetLoadAddressPermissions(pc, permissions)
291 && (permissions & ePermissionsExecutable) == 0)
292 {
293 // If this is the second frame off the stack, we may have unwound the first frame
294 // incorrectly. But using the architecture default unwind plan may get us back on
295 // track -- albeit possibly skipping a real frame. Give this frame a clearly-invalid
296 // pc and see if we can get any further.
297 if (GetNextFrame().get() && GetNextFrame()->IsValid() && GetNextFrame()->IsFrameZero())
298 {
299 UnwindLogMsg ("had a pc of 0x%" PRIx64 " which is not in executable memory but on frame 1 -- allowing it once.",
300 (uint64_t) pc);
301 m_frame_type = eSkipFrame;
302 }
303 else
304 {
305 // anywhere other than the second frame, a non-executable pc means we're off in the weeds -- stop now.
306 m_frame_type = eNotAValidFrame;
307 return;
308 }
309 }
310
311 if (abi)
312 {
313 m_fast_unwind_plan_sp.reset ();
314 m_full_unwind_plan_sp.reset (new UnwindPlan (lldb::eRegisterKindGeneric));
315 abi->CreateDefaultUnwindPlan(*m_full_unwind_plan_sp);
316 if (m_frame_type != eSkipFrame) // don't override eSkipFrame
317 {
318 m_frame_type = eNormalFrame;
319 }
320 m_all_registers_available = false;
321 m_current_offset = -1;
322 m_current_offset_backed_up_one = -1;
323 addr_t cfa_regval = LLDB_INVALID_ADDRESS;
324 int row_register_kind = m_full_unwind_plan_sp->GetRegisterKind ();
325 UnwindPlan::RowSP row = m_full_unwind_plan_sp->GetRowForFunctionOffset(0);
326 if (row.get())
327 {
328 uint32_t cfa_regnum = row->GetCFARegister();
329 int cfa_offset = row->GetCFAOffset();
330 if (!ReadGPRValue (row_register_kind, cfa_regnum, cfa_regval))
331 {
332 UnwindLogMsg ("failed to get cfa value");
333 if (m_frame_type != eSkipFrame) // don't override eSkipFrame
334 {
335 m_frame_type = eNormalFrame;
336 }
337 return;
338 }
339 m_cfa = cfa_regval + cfa_offset;
340
341 // A couple of sanity checks..
342 if (cfa_regval == LLDB_INVALID_ADDRESS || cfa_regval == 0 || cfa_regval == 1)
343 {
344 UnwindLogMsg ("could not find a valid cfa address");
345 m_frame_type = eNotAValidFrame;
346 return;
347 }
348
349 // cfa_regval should point into the stack memory; if we can query memory region permissions,
350 // see if the memory is allocated & readable.
351 if (process->GetLoadAddressPermissions(cfa_regval, permissions)
352 && (permissions & ePermissionsReadable) == 0)
353 {
354 m_frame_type = eNotAValidFrame;
355 return;
356 }
357 }
358 else
359 {
360 UnwindLogMsg ("could not find a row for function offset zero");
361 m_frame_type = eNotAValidFrame;
362 return;
363 }
364
365 UnwindLogMsg ("initialized frame cfa is 0x%" PRIx64, (uint64_t) m_cfa);
366 return;
367 }
368 m_frame_type = eNotAValidFrame;
369 return;
370 }
371
372 // We require that eSymbolContextSymbol be successfully filled in or this context is of no use to us.
373 if ((pc_module_sp->ResolveSymbolContextForAddress (m_current_pc, eSymbolContextFunction| eSymbolContextSymbol, m_sym_ctx) & eSymbolContextSymbol) == eSymbolContextSymbol)
374 {
375 m_sym_ctx_valid = true;
376 }
377
378 AddressRange addr_range;
379 if (!m_sym_ctx.GetAddressRange (eSymbolContextFunction | eSymbolContextSymbol, 0, false, addr_range))
380 {
381 m_sym_ctx_valid = false;
382 }
383
384 bool decr_pc_and_recompute_addr_range = false;
385
386 // If the symbol lookup failed...
387 if (m_sym_ctx_valid == false)
388 decr_pc_and_recompute_addr_range = true;
389
390 // Or if we're in the middle of the stack (and not "above" an asynchronous event like sigtramp),
391 // and our "current" pc is the start of a function...
392 if (m_sym_ctx_valid
393 && GetNextFrame()->m_frame_type != eSigtrampFrame
394 && GetNextFrame()->m_frame_type != eDebuggerFrame
395 && addr_range.GetBaseAddress().IsValid()
396 && addr_range.GetBaseAddress().GetSection() == m_current_pc.GetSection()
397 && addr_range.GetBaseAddress().GetOffset() == m_current_pc.GetOffset())
398 {
399 decr_pc_and_recompute_addr_range = true;
400 }
401
402 // We need to back up the pc by 1 byte and re-search for the Symbol to handle the case where the "saved pc"
403 // value is pointing to the next function, e.g. if a function ends with a CALL instruction.
404 // FIXME this may need to be an architectural-dependent behavior; if so we'll need to add a member function
405 // to the ABI plugin and consult that.
406 if (decr_pc_and_recompute_addr_range)
407 {
408 Address temporary_pc(m_current_pc);
409 temporary_pc.SetOffset(m_current_pc.GetOffset() - 1);
410 m_sym_ctx.Clear(false);
411 m_sym_ctx_valid = false;
412 if ((pc_module_sp->ResolveSymbolContextForAddress (temporary_pc, eSymbolContextFunction| eSymbolContextSymbol, m_sym_ctx) & eSymbolContextSymbol) == eSymbolContextSymbol)
413 {
414 m_sym_ctx_valid = true;
415 }
416 if (!m_sym_ctx.GetAddressRange (eSymbolContextFunction | eSymbolContextSymbol, 0, false, addr_range))
417 {
418 m_sym_ctx_valid = false;
419 }
420 }
421
422 // If we were able to find a symbol/function, set addr_range_ptr to the bounds of that symbol/function.
423 // else treat the current pc value as the start_pc and record no offset.
424 if (addr_range.GetBaseAddress().IsValid())
425 {
426 m_start_pc = addr_range.GetBaseAddress();
427 m_current_offset = m_current_pc.GetOffset() - m_start_pc.GetOffset();
428 m_current_offset_backed_up_one = m_current_offset;
429 if (decr_pc_and_recompute_addr_range && m_current_offset_backed_up_one > 0)
430 {
431 m_current_offset_backed_up_one--;
432 if (m_sym_ctx_valid)
433 m_current_pc.SetOffset(m_current_pc.GetOffset() - 1);
434 }
435 }
436 else
437 {
438 m_start_pc = m_current_pc;
439 m_current_offset = -1;
440 m_current_offset_backed_up_one = -1;
441 }
442
443 static ConstString sigtramp_name ("_sigtramp");
444 if ((m_sym_ctx.function && m_sym_ctx.function->GetMangled().GetMangledName() == sigtramp_name)
445 || (m_sym_ctx.symbol && m_sym_ctx.symbol->GetMangled().GetMangledName() == sigtramp_name))
446 {
447 m_frame_type = eSigtrampFrame;
448 }
449 else
450 {
451 // FIXME: Detect eDebuggerFrame here.
452 if (m_frame_type != eSkipFrame) // don't override eSkipFrame
453 {
454 m_frame_type = eNormalFrame;
455 }
456 }
457
458 // We've set m_frame_type and m_sym_ctx before this call.
459 m_fast_unwind_plan_sp = GetFastUnwindPlanForFrame ();
460
461 UnwindPlan::RowSP active_row;
462 int cfa_offset = 0;
463 int row_register_kind = -1;
464
465 // Try to get by with just the fast UnwindPlan if possible - the full UnwindPlan may be expensive to get
466 // (e.g. if we have to parse the entire eh_frame section of an ObjectFile for the first time.)
467
468 if (m_fast_unwind_plan_sp && m_fast_unwind_plan_sp->PlanValidAtAddress (m_current_pc))
469 {
470 active_row = m_fast_unwind_plan_sp->GetRowForFunctionOffset (m_current_offset);
471 row_register_kind = m_fast_unwind_plan_sp->GetRegisterKind ();
472 if (active_row.get() && log)
473 {
474 StreamString active_row_strm;
475 active_row->Dump(active_row_strm, m_fast_unwind_plan_sp.get(), &m_thread, m_start_pc.GetLoadAddress(exe_ctx.GetTargetPtr()));
476 UnwindLogMsg ("active row: %s", active_row_strm.GetString().c_str());
477 }
478 }
479 else
480 {
481 m_full_unwind_plan_sp = GetFullUnwindPlanForFrame ();
482 if (m_full_unwind_plan_sp && m_full_unwind_plan_sp->PlanValidAtAddress (m_current_pc))
483 {
484 active_row = m_full_unwind_plan_sp->GetRowForFunctionOffset (m_current_offset);
485 row_register_kind = m_full_unwind_plan_sp->GetRegisterKind ();
486 if (active_row.get() && log)
487 {
488 StreamString active_row_strm;
489 active_row->Dump(active_row_strm, m_full_unwind_plan_sp.get(), &m_thread, m_start_pc.GetLoadAddress(exe_ctx.GetTargetPtr()));
490 UnwindLogMsg ("active row: %s", active_row_strm.GetString().c_str());
491 }
492 }
493 }
494
495 if (!active_row.get())
496 {
497 m_frame_type = eNotAValidFrame;
498 return;
499 }
500
501 addr_t cfa_regval = LLDB_INVALID_ADDRESS;
502 if (!ReadGPRValue (row_register_kind, active_row->GetCFARegister(), cfa_regval))
503 {
504 UnwindLogMsg ("failed to get cfa reg %d/%d", row_register_kind, active_row->GetCFARegister());
505 m_frame_type = eNotAValidFrame;
506 return;
507 }
508
509 cfa_offset = active_row->GetCFAOffset ();
510 m_cfa = cfa_regval + cfa_offset;
511
512 UnwindLogMsg ("cfa_regval = 0x%16.16" PRIx64 " (cfa_regval = 0x%16.16" PRIx64 ", cfa_offset = %i)", m_cfa, cfa_regval, cfa_offset);
513
514 // A couple of sanity checks..
515 if (cfa_regval == LLDB_INVALID_ADDRESS || cfa_regval == 0 || cfa_regval == 1)
516 {
517 UnwindLogMsg ("could not find a valid cfa address");
518 m_frame_type = eNotAValidFrame;
519 return;
520 }
521
522 // If we have a bad stack setup, we can get the same CFA value multiple times -- or even
523 // more devious, we can actually oscillate between two CFA values. Detect that here and
524 // break out to avoid a possible infinite loop in lldb trying to unwind the stack.
525 addr_t next_frame_cfa;
526 addr_t next_next_frame_cfa = LLDB_INVALID_ADDRESS;
527 if (GetNextFrame().get() && GetNextFrame()->GetCFA(next_frame_cfa))
528 {
529 bool repeating_frames = false;
530 if (next_frame_cfa == m_cfa)
531 {
532 repeating_frames = true;
533 }
534 else
535 {
536 if (GetNextFrame()->GetNextFrame() && GetNextFrame()->GetNextFrame()->GetCFA(next_next_frame_cfa)
537 && next_next_frame_cfa == m_cfa)
538 {
539 repeating_frames = true;
540 }
541 }
542 if (repeating_frames && abi->FunctionCallsChangeCFA())
543 {
544 UnwindLogMsg ("same CFA address as next frame, assuming the unwind is looping - stopping");
545 m_frame_type = eNotAValidFrame;
546 return;
547 }
548 }
549
550 UnwindLogMsg ("initialized frame current pc is 0x%" PRIx64 " cfa is 0x%" PRIx64,
551 (uint64_t) m_current_pc.GetLoadAddress (exe_ctx.GetTargetPtr()), (uint64_t) m_cfa);
552 }
553
554
555 bool
IsFrameZero() const556 RegisterContextLLDB::IsFrameZero () const
557 {
558 return m_frame_number == 0;
559 }
560
561
562 // Find a fast unwind plan for this frame, if possible.
563 //
564 // On entry to this method,
565 //
566 // 1. m_frame_type should already be set to eSigtrampFrame/eDebuggerFrame if either of those are correct,
567 // 2. m_sym_ctx should already be filled in, and
568 // 3. m_current_pc should have the current pc value for this frame
569 // 4. m_current_offset_backed_up_one should have the current byte offset into the function, maybe backed up by 1, -1 if unknown
570
571 UnwindPlanSP
GetFastUnwindPlanForFrame()572 RegisterContextLLDB::GetFastUnwindPlanForFrame ()
573 {
574 UnwindPlanSP unwind_plan_sp;
575 ModuleSP pc_module_sp (m_current_pc.GetModule());
576
577 if (!m_current_pc.IsValid() || !pc_module_sp || pc_module_sp->GetObjectFile() == NULL)
578 return unwind_plan_sp;
579
580 if (IsFrameZero ())
581 return unwind_plan_sp;
582
583 FuncUnwindersSP func_unwinders_sp (pc_module_sp->GetObjectFile()->GetUnwindTable().GetFuncUnwindersContainingAddress (m_current_pc, m_sym_ctx));
584 if (!func_unwinders_sp)
585 return unwind_plan_sp;
586
587 // If we're in _sigtramp(), unwinding past this frame requires special knowledge.
588 if (m_frame_type == eSigtrampFrame || m_frame_type == eDebuggerFrame)
589 return unwind_plan_sp;
590
591 unwind_plan_sp = func_unwinders_sp->GetUnwindPlanFastUnwind (m_thread);
592 if (unwind_plan_sp)
593 {
594 if (unwind_plan_sp->PlanValidAtAddress (m_current_pc))
595 {
596 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_UNWIND));
597 if (log && log->GetVerbose())
598 {
599 if (m_fast_unwind_plan_sp)
600 UnwindLogMsgVerbose ("frame, and has a fast UnwindPlan");
601 else
602 UnwindLogMsgVerbose ("frame");
603 }
604 m_frame_type = eNormalFrame;
605 return unwind_plan_sp;
606 }
607 else
608 {
609 unwind_plan_sp.reset();
610 }
611 }
612 return unwind_plan_sp;
613 }
614
615 // On entry to this method,
616 //
617 // 1. m_frame_type should already be set to eSigtrampFrame/eDebuggerFrame if either of those are correct,
618 // 2. m_sym_ctx should already be filled in, and
619 // 3. m_current_pc should have the current pc value for this frame
620 // 4. m_current_offset_backed_up_one should have the current byte offset into the function, maybe backed up by 1, -1 if unknown
621
622 UnwindPlanSP
GetFullUnwindPlanForFrame()623 RegisterContextLLDB::GetFullUnwindPlanForFrame ()
624 {
625 UnwindPlanSP unwind_plan_sp;
626 UnwindPlanSP arch_default_unwind_plan_sp;
627 ExecutionContext exe_ctx(m_thread.shared_from_this());
628 Process *process = exe_ctx.GetProcessPtr();
629 ABI *abi = process ? process->GetABI().get() : NULL;
630 if (abi)
631 {
632 arch_default_unwind_plan_sp.reset (new UnwindPlan (lldb::eRegisterKindGeneric));
633 abi->CreateDefaultUnwindPlan(*arch_default_unwind_plan_sp);
634 }
635
636 bool behaves_like_zeroth_frame = false;
637 if (IsFrameZero ()
638 || GetNextFrame()->m_frame_type == eSigtrampFrame
639 || GetNextFrame()->m_frame_type == eDebuggerFrame)
640 {
641 behaves_like_zeroth_frame = true;
642 // If this frame behaves like a 0th frame (currently executing or
643 // interrupted asynchronously), all registers can be retrieved.
644 m_all_registers_available = true;
645 }
646
647 // If we've done a jmp 0x0 / bl 0x0 (called through a null function pointer) so the pc is 0x0
648 // in the zeroth frame, we need to use the "unwind at first instruction" arch default UnwindPlan
649 // Also, if this Process can report on memory region attributes, any non-executable region means
650 // we jumped through a bad function pointer - handle the same way as 0x0.
651 // Note, if the symbol context has a function for the symbol, then we don't need to do this check.
652
653 if ((!m_sym_ctx_valid || m_sym_ctx.function == NULL) && behaves_like_zeroth_frame && m_current_pc.IsValid())
654 {
655 uint32_t permissions;
656 addr_t current_pc_addr = m_current_pc.GetLoadAddress (exe_ctx.GetTargetPtr());
657 if (current_pc_addr == 0
658 || (process->GetLoadAddressPermissions(current_pc_addr, permissions)
659 && (permissions & ePermissionsExecutable) == 0))
660 {
661 unwind_plan_sp.reset (new UnwindPlan (lldb::eRegisterKindGeneric));
662 abi->CreateFunctionEntryUnwindPlan(*unwind_plan_sp);
663 m_frame_type = eNormalFrame;
664 return unwind_plan_sp;
665 }
666 }
667
668 // No Module for the current pc, try using the architecture default unwind.
669 ModuleSP pc_module_sp (m_current_pc.GetModule());
670 if (!m_current_pc.IsValid() || !pc_module_sp || pc_module_sp->GetObjectFile() == NULL)
671 {
672 m_frame_type = eNormalFrame;
673 return arch_default_unwind_plan_sp;
674 }
675
676 FuncUnwindersSP func_unwinders_sp;
677 if (m_sym_ctx_valid)
678 {
679 func_unwinders_sp = pc_module_sp->GetObjectFile()->GetUnwindTable().GetFuncUnwindersContainingAddress (m_current_pc, m_sym_ctx);
680 }
681
682 // No FuncUnwinders available for this pc (i.e. a stripped function symbol and -fomit-frame-pointer).
683 // Try using the eh_frame information relative to the current PC,
684 // and finally fall back on the architectural default unwind.
685 if (!func_unwinders_sp)
686 {
687 DWARFCallFrameInfo *eh_frame = pc_module_sp && pc_module_sp->GetObjectFile() ?
688 pc_module_sp->GetObjectFile()->GetUnwindTable().GetEHFrameInfo() : nullptr;
689
690 m_frame_type = eNormalFrame;
691 if (eh_frame && m_current_pc.IsValid())
692 {
693 unwind_plan_sp.reset (new UnwindPlan (lldb::eRegisterKindGeneric));
694 // Even with -fomit-frame-pointer, we can try eh_frame to get back on track.
695 if (eh_frame->GetUnwindPlan (m_current_pc, *unwind_plan_sp))
696 return unwind_plan_sp;
697 else
698 unwind_plan_sp.reset();
699 }
700 return arch_default_unwind_plan_sp;
701 }
702
703 // If we're in _sigtramp(), unwinding past this frame requires special knowledge. On Mac OS X this knowledge
704 // is properly encoded in the eh_frame section, so prefer that if available.
705 // On other platforms we may need to provide a platform-specific UnwindPlan which encodes the details of
706 // how to unwind out of sigtramp.
707 if (m_frame_type == eSigtrampFrame)
708 {
709 m_fast_unwind_plan_sp.reset();
710 unwind_plan_sp = func_unwinders_sp->GetUnwindPlanAtCallSite (m_current_offset_backed_up_one);
711 if (unwind_plan_sp && unwind_plan_sp->PlanValidAtAddress (m_current_pc))
712 return unwind_plan_sp;
713 }
714
715 // Ask the DynamicLoader if the eh_frame CFI should be trusted in this frame even when it's frame zero
716 // This comes up if we have hand-written functions in a Module and hand-written eh_frame. The assembly
717 // instruction inspection may fail and the eh_frame CFI were probably written with some care to do the
718 // right thing. It'd be nice if there was a way to ask the eh_frame directly if it is asynchronous
719 // (can be trusted at every instruction point) or synchronous (the normal case - only at call sites).
720 // But there is not.
721 if (process && process->GetDynamicLoader() && process->GetDynamicLoader()->AlwaysRelyOnEHUnwindInfo (m_sym_ctx))
722 {
723 unwind_plan_sp = func_unwinders_sp->GetUnwindPlanAtCallSite (m_current_offset_backed_up_one);
724 if (unwind_plan_sp && unwind_plan_sp->PlanValidAtAddress (m_current_pc))
725 {
726 UnwindLogMsgVerbose ("frame uses %s for full UnwindPlan because the DynamicLoader suggested we prefer it",
727 unwind_plan_sp->GetSourceName().GetCString());
728 return unwind_plan_sp;
729 }
730 }
731
732 // Typically the NonCallSite UnwindPlan is the unwind created by inspecting the assembly language instructions
733 if (behaves_like_zeroth_frame)
734 {
735 unwind_plan_sp = func_unwinders_sp->GetUnwindPlanAtNonCallSite (m_thread);
736 if (unwind_plan_sp && unwind_plan_sp->PlanValidAtAddress (m_current_pc))
737 {
738 UnwindLogMsgVerbose ("frame uses %s for full UnwindPlan", unwind_plan_sp->GetSourceName().GetCString());
739 return unwind_plan_sp;
740 }
741 }
742
743 // Typically this is unwind info from an eh_frame section intended for exception handling; only valid at call sites
744 unwind_plan_sp = func_unwinders_sp->GetUnwindPlanAtCallSite (m_current_offset_backed_up_one);
745 if (unwind_plan_sp && unwind_plan_sp->PlanValidAtAddress (m_current_pc))
746 {
747 UnwindLogMsgVerbose ("frame uses %s for full UnwindPlan", unwind_plan_sp->GetSourceName().GetCString());
748 return unwind_plan_sp;
749 }
750
751 // We'd prefer to use an UnwindPlan intended for call sites when we're at a call site but if we've
752 // struck out on that, fall back to using the non-call-site assembly inspection UnwindPlan if possible.
753 unwind_plan_sp = func_unwinders_sp->GetUnwindPlanAtNonCallSite (m_thread);
754 if (unwind_plan_sp && unwind_plan_sp->PlanValidAtAddress (m_current_pc))
755 {
756 UnwindLogMsgVerbose ("frame uses %s for full UnwindPlan", unwind_plan_sp->GetSourceName().GetCString());
757 return unwind_plan_sp;
758 }
759
760 // If nothing else, use the architectural default UnwindPlan and hope that does the job.
761 UnwindLogMsgVerbose ("frame uses %s for full UnwindPlan", arch_default_unwind_plan_sp->GetSourceName().GetCString());
762 return arch_default_unwind_plan_sp;
763 }
764
765
766 void
InvalidateAllRegisters()767 RegisterContextLLDB::InvalidateAllRegisters ()
768 {
769 m_frame_type = eNotAValidFrame;
770 }
771
772 size_t
GetRegisterCount()773 RegisterContextLLDB::GetRegisterCount ()
774 {
775 return m_thread.GetRegisterContext()->GetRegisterCount();
776 }
777
778 const RegisterInfo *
GetRegisterInfoAtIndex(size_t reg)779 RegisterContextLLDB::GetRegisterInfoAtIndex (size_t reg)
780 {
781 return m_thread.GetRegisterContext()->GetRegisterInfoAtIndex (reg);
782 }
783
784 size_t
GetRegisterSetCount()785 RegisterContextLLDB::GetRegisterSetCount ()
786 {
787 return m_thread.GetRegisterContext()->GetRegisterSetCount ();
788 }
789
790 const RegisterSet *
GetRegisterSet(size_t reg_set)791 RegisterContextLLDB::GetRegisterSet (size_t reg_set)
792 {
793 return m_thread.GetRegisterContext()->GetRegisterSet (reg_set);
794 }
795
796 uint32_t
ConvertRegisterKindToRegisterNumber(uint32_t kind,uint32_t num)797 RegisterContextLLDB::ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num)
798 {
799 return m_thread.GetRegisterContext()->ConvertRegisterKindToRegisterNumber (kind, num);
800 }
801
802 bool
ReadRegisterValueFromRegisterLocation(lldb_private::UnwindLLDB::RegisterLocation regloc,const RegisterInfo * reg_info,RegisterValue & value)803 RegisterContextLLDB::ReadRegisterValueFromRegisterLocation (lldb_private::UnwindLLDB::RegisterLocation regloc,
804 const RegisterInfo *reg_info,
805 RegisterValue &value)
806 {
807 if (!IsValid())
808 return false;
809 bool success = false;
810
811 switch (regloc.type)
812 {
813 case UnwindLLDB::RegisterLocation::eRegisterInRegister:
814 {
815 const RegisterInfo *other_reg_info = GetRegisterInfoAtIndex(regloc.location.register_number);
816
817 if (!other_reg_info)
818 return false;
819
820 if (IsFrameZero ())
821 {
822 success = m_thread.GetRegisterContext()->ReadRegister (other_reg_info, value);
823 }
824 else
825 {
826 success = GetNextFrame()->ReadRegister (other_reg_info, value);
827 }
828 }
829 break;
830 case UnwindLLDB::RegisterLocation::eRegisterValueInferred:
831 success = value.SetUInt (regloc.location.inferred_value, reg_info->byte_size);
832 break;
833
834 case UnwindLLDB::RegisterLocation::eRegisterNotSaved:
835 break;
836 case UnwindLLDB::RegisterLocation::eRegisterSavedAtHostMemoryLocation:
837 assert ("FIXME debugger inferior function call unwind");
838 break;
839 case UnwindLLDB::RegisterLocation::eRegisterSavedAtMemoryLocation:
840 {
841 Error error (ReadRegisterValueFromMemory(reg_info,
842 regloc.location.target_memory_location,
843 reg_info->byte_size,
844 value));
845 success = error.Success();
846 }
847 break;
848 default:
849 assert ("Unknown RegisterLocation type.");
850 break;
851 }
852 return success;
853 }
854
855 bool
WriteRegisterValueToRegisterLocation(lldb_private::UnwindLLDB::RegisterLocation regloc,const RegisterInfo * reg_info,const RegisterValue & value)856 RegisterContextLLDB::WriteRegisterValueToRegisterLocation (lldb_private::UnwindLLDB::RegisterLocation regloc,
857 const RegisterInfo *reg_info,
858 const RegisterValue &value)
859 {
860 if (!IsValid())
861 return false;
862
863 bool success = false;
864
865 switch (regloc.type)
866 {
867 case UnwindLLDB::RegisterLocation::eRegisterInRegister:
868 {
869 const RegisterInfo *other_reg_info = GetRegisterInfoAtIndex(regloc.location.register_number);
870 if (IsFrameZero ())
871 {
872 success = m_thread.GetRegisterContext()->WriteRegister (other_reg_info, value);
873 }
874 else
875 {
876 success = GetNextFrame()->WriteRegister (other_reg_info, value);
877 }
878 }
879 break;
880 case UnwindLLDB::RegisterLocation::eRegisterValueInferred:
881 case UnwindLLDB::RegisterLocation::eRegisterNotSaved:
882 break;
883 case UnwindLLDB::RegisterLocation::eRegisterSavedAtHostMemoryLocation:
884 assert ("FIXME debugger inferior function call unwind");
885 break;
886 case UnwindLLDB::RegisterLocation::eRegisterSavedAtMemoryLocation:
887 {
888 Error error (WriteRegisterValueToMemory (reg_info,
889 regloc.location.target_memory_location,
890 reg_info->byte_size,
891 value));
892 success = error.Success();
893 }
894 break;
895 default:
896 assert ("Unknown RegisterLocation type.");
897 break;
898 }
899 return success;
900 }
901
902
903 bool
IsValid() const904 RegisterContextLLDB::IsValid () const
905 {
906 return m_frame_type != eNotAValidFrame;
907 }
908
909 // A skip frame is a bogus frame on the stack -- but one where we're likely to find a real frame farther
910 // up the stack if we keep looking. It's always the second frame in an unwind (i.e. the first frame after
911 // frame zero) where unwinding can be the trickiest. Ideally we'll mark up this frame in some way so the
912 // user knows we're displaying bad data and we may have skipped one frame of their real program in the
913 // process of getting back on track.
914
915 bool
IsSkipFrame() const916 RegisterContextLLDB::IsSkipFrame () const
917 {
918 return m_frame_type == eSkipFrame;
919 }
920
921 // Answer the question: Where did THIS frame save the CALLER frame ("previous" frame)'s register value?
922
923 enum UnwindLLDB::RegisterSearchResult
SavedLocationForRegister(uint32_t lldb_regnum,lldb_private::UnwindLLDB::RegisterLocation & regloc)924 RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, lldb_private::UnwindLLDB::RegisterLocation ®loc)
925 {
926 // Have we already found this register location?
927 if (!m_registers.empty())
928 {
929 std::map<uint32_t, lldb_private::UnwindLLDB::RegisterLocation>::const_iterator iterator;
930 iterator = m_registers.find (lldb_regnum);
931 if (iterator != m_registers.end())
932 {
933 regloc = iterator->second;
934 UnwindLogMsg ("supplying caller's saved reg %d's location, cached", lldb_regnum);
935 return UnwindLLDB::RegisterSearchResult::eRegisterFound;
936 }
937 }
938
939 uint32_t sp_regnum = LLDB_INVALID_REGNUM;
940 uint32_t pc_regnum = LLDB_INVALID_REGNUM;
941 m_thread.GetRegisterContext()->ConvertBetweenRegisterKinds (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, eRegisterKindLLDB, sp_regnum);
942 m_thread.GetRegisterContext()->ConvertBetweenRegisterKinds (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, eRegisterKindLLDB, pc_regnum);
943
944 // Are we looking for the CALLER's stack pointer? The stack pointer is defined to be the same as THIS frame's
945 // CFA so just return the CFA value. This is true on x86-32/x86-64 at least.
946 if (sp_regnum != LLDB_INVALID_REGNUM && sp_regnum == lldb_regnum)
947 {
948 // make sure we won't lose precision copying an addr_t (m_cfa) into a uint64_t (.inferred_value)
949 assert (sizeof (addr_t) <= sizeof (uint64_t));
950 regloc.type = UnwindLLDB::RegisterLocation::eRegisterValueInferred;
951 regloc.location.inferred_value = m_cfa;
952 m_registers[lldb_regnum] = regloc;
953 UnwindLogMsg ("supplying caller's stack pointer (%d) value, computed from CFA", lldb_regnum);
954 return UnwindLLDB::RegisterSearchResult::eRegisterFound;
955 }
956
957 // Look through the available UnwindPlans for the register location.
958
959 UnwindPlan::Row::RegisterLocation unwindplan_regloc;
960 bool have_unwindplan_regloc = false;
961 RegisterKind unwindplan_registerkind = (RegisterKind)-1;
962
963 if (m_fast_unwind_plan_sp)
964 {
965 UnwindPlan::RowSP active_row = m_fast_unwind_plan_sp->GetRowForFunctionOffset (m_current_offset);
966 unwindplan_registerkind = m_fast_unwind_plan_sp->GetRegisterKind ();
967 uint32_t row_regnum;
968 if (!m_thread.GetRegisterContext()->ConvertBetweenRegisterKinds (eRegisterKindLLDB, lldb_regnum, unwindplan_registerkind, row_regnum))
969 {
970 UnwindLogMsg ("could not convert lldb regnum %d into %d RegisterKind reg numbering scheme",
971 lldb_regnum, (int) unwindplan_registerkind);
972 return UnwindLLDB::RegisterSearchResult::eRegisterNotFound;
973 }
974 if (active_row->GetRegisterInfo (row_regnum, unwindplan_regloc))
975 {
976 UnwindLogMsg ("supplying caller's saved reg %d's location using FastUnwindPlan", lldb_regnum);
977 have_unwindplan_regloc = true;
978 }
979 }
980
981 if (!have_unwindplan_regloc)
982 {
983 // m_full_unwind_plan_sp being NULL means that we haven't tried to find a full UnwindPlan yet
984 if (!m_full_unwind_plan_sp)
985 m_full_unwind_plan_sp = GetFullUnwindPlanForFrame ();
986
987 if (m_full_unwind_plan_sp)
988 {
989 UnwindPlan::RowSP active_row = m_full_unwind_plan_sp->GetRowForFunctionOffset (m_current_offset);
990 unwindplan_registerkind = m_full_unwind_plan_sp->GetRegisterKind ();
991 uint32_t row_regnum;
992 bool row_register_rewritten_to_return_address_reg = false;
993
994 // If we're fetching the saved pc and this UnwindPlan defines a ReturnAddress register (e.g. lr on arm),
995 // look for the return address register number in the UnwindPlan's row.
996 if (lldb_regnum == pc_regnum && m_full_unwind_plan_sp->GetReturnAddressRegister() != LLDB_INVALID_REGNUM)
997 {
998 row_regnum = m_full_unwind_plan_sp->GetReturnAddressRegister();
999 row_register_rewritten_to_return_address_reg = true;
1000 UnwindLogMsg ("requested caller's saved PC but this UnwindPlan uses a RA reg; getting reg %d instead",
1001 row_regnum);
1002 }
1003 else
1004 {
1005 if (!m_thread.GetRegisterContext()->ConvertBetweenRegisterKinds (eRegisterKindLLDB, lldb_regnum, unwindplan_registerkind, row_regnum))
1006 {
1007 if (unwindplan_registerkind == eRegisterKindGeneric)
1008 UnwindLogMsg ("could not convert lldb regnum %d into eRegisterKindGeneric reg numbering scheme", lldb_regnum);
1009 else
1010 UnwindLogMsg ("could not convert lldb regnum %d into %d RegisterKind reg numbering scheme",
1011 lldb_regnum, (int) unwindplan_registerkind);
1012 return UnwindLLDB::RegisterSearchResult::eRegisterNotFound;
1013 }
1014 }
1015
1016 if (active_row->GetRegisterInfo (row_regnum, unwindplan_regloc))
1017 {
1018 have_unwindplan_regloc = true;
1019 UnwindLogMsg ("supplying caller's saved reg %d's location using %s UnwindPlan", lldb_regnum,
1020 m_full_unwind_plan_sp->GetSourceName().GetCString());
1021 }
1022
1023 // This is frame 0 and we're retrieving the PC and it's saved in a Return Address register and
1024 // it hasn't been saved anywhere yet -- that is, it's still live in the actual register.
1025 // Handle this specially.
1026
1027 if (have_unwindplan_regloc == false
1028 && row_register_rewritten_to_return_address_reg == true
1029 && IsFrameZero()
1030 && row_regnum != LLDB_INVALID_REGNUM)
1031 {
1032 uint32_t ra_regnum_in_lldb_reg_numbering;
1033 if (m_thread.GetRegisterContext()->ConvertBetweenRegisterKinds (unwindplan_registerkind, row_regnum, eRegisterKindLLDB, ra_regnum_in_lldb_reg_numbering))
1034 {
1035 lldb_private::UnwindLLDB::RegisterLocation new_regloc;
1036 new_regloc.type = UnwindLLDB::RegisterLocation::eRegisterInRegister;
1037 new_regloc.location.register_number = ra_regnum_in_lldb_reg_numbering;
1038 m_registers[lldb_regnum] = new_regloc;
1039 regloc = new_regloc;
1040 UnwindLogMsg ("supplying caller's register %d from the live RegisterContext at frame 0, saved in %d", lldb_regnum, ra_regnum_in_lldb_reg_numbering);
1041 return UnwindLLDB::RegisterSearchResult::eRegisterFound;
1042 }
1043 }
1044
1045 // If this architecture stores the return address in a register (it defines a Return Address register)
1046 // and we're on a non-zero stack frame and the Full UnwindPlan says that the pc is stored in the
1047 // RA registers (e.g. lr on arm), then we know that the full unwindplan is not trustworthy -- this
1048 // is an impossible situation and the instruction emulation code has likely been misled.
1049 // If this stack frame meets those criteria, we need to throw away the Full UnwindPlan that the
1050 // instruction emulation came up with and fall back to the architecture's Default UnwindPlan so
1051 // the stack walk can get past this point.
1052
1053 // Special note: If the Full UnwindPlan was generated from the compiler, don't second-guess it
1054 // when we're at a call site location.
1055
1056 // arch_default_ra_regnum is the return address register # in the Full UnwindPlan register numbering
1057 uint32_t arch_default_ra_regnum = LLDB_INVALID_REGNUM;
1058 if (m_thread.GetRegisterContext()->ConvertBetweenRegisterKinds (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_RA, unwindplan_registerkind, arch_default_ra_regnum)
1059 && arch_default_ra_regnum != LLDB_INVALID_REGNUM
1060 && pc_regnum != LLDB_INVALID_REGNUM
1061 && pc_regnum == lldb_regnum
1062 && unwindplan_regloc.IsInOtherRegister()
1063 && unwindplan_regloc.GetRegisterNumber() == arch_default_ra_regnum
1064 && m_full_unwind_plan_sp->GetSourcedFromCompiler() != eLazyBoolYes
1065 && !m_all_registers_available)
1066 {
1067 UnwindLogMsg ("%s UnwindPlan tried to restore the pc from the link register but this is a non-zero frame",
1068 m_full_unwind_plan_sp->GetSourceName().GetCString());
1069
1070 // Throw away the full unwindplan; install the arch default unwindplan
1071 InvalidateFullUnwindPlan();
1072
1073 // Now re-fetch the pc value we're searching for
1074 uint32_t arch_default_pc_reg = LLDB_INVALID_REGNUM;
1075 UnwindPlan::RowSP active_row = m_full_unwind_plan_sp->GetRowForFunctionOffset (m_current_offset);
1076 if (m_thread.GetRegisterContext()->ConvertBetweenRegisterKinds (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, m_full_unwind_plan_sp->GetRegisterKind(), arch_default_pc_reg)
1077 && arch_default_pc_reg != LLDB_INVALID_REGNUM
1078 && active_row
1079 && active_row->GetRegisterInfo (arch_default_pc_reg, unwindplan_regloc))
1080 {
1081 have_unwindplan_regloc = true;
1082 }
1083 else
1084 {
1085 have_unwindplan_regloc = false;
1086 }
1087 }
1088 }
1089 }
1090
1091
1092 ExecutionContext exe_ctx(m_thread.shared_from_this());
1093 Process *process = exe_ctx.GetProcessPtr();
1094 if (have_unwindplan_regloc == false)
1095 {
1096 // If a volatile register is being requested, we don't want to forward the next frame's register contents
1097 // up the stack -- the register is not retrievable at this frame.
1098 ABI *abi = process ? process->GetABI().get() : NULL;
1099 if (abi)
1100 {
1101 const RegisterInfo *reg_info = GetRegisterInfoAtIndex(lldb_regnum);
1102 if (reg_info && abi->RegisterIsVolatile (reg_info))
1103 {
1104 UnwindLogMsg ("did not supply reg location for %d because it is volatile", lldb_regnum);
1105 return UnwindLLDB::RegisterSearchResult::eRegisterIsVolatile;
1106 }
1107 }
1108
1109 if (IsFrameZero ())
1110 {
1111 // This is frame 0 - we should return the actual live register context value
1112 lldb_private::UnwindLLDB::RegisterLocation new_regloc;
1113 new_regloc.type = UnwindLLDB::RegisterLocation::eRegisterInRegister;
1114 new_regloc.location.register_number = lldb_regnum;
1115 m_registers[lldb_regnum] = new_regloc;
1116 regloc = new_regloc;
1117 UnwindLogMsg ("supplying caller's register %d from the live RegisterContext at frame 0", lldb_regnum);
1118 return UnwindLLDB::RegisterSearchResult::eRegisterFound;
1119 }
1120 else
1121 UnwindLogMsg ("could not supply caller's reg %d location", lldb_regnum);
1122 return UnwindLLDB::RegisterSearchResult::eRegisterNotFound;
1123 }
1124
1125 // unwindplan_regloc has valid contents about where to retrieve the register
1126 if (unwindplan_regloc.IsUnspecified())
1127 {
1128 lldb_private::UnwindLLDB::RegisterLocation new_regloc;
1129 new_regloc.type = UnwindLLDB::RegisterLocation::eRegisterNotSaved;
1130 m_registers[lldb_regnum] = new_regloc;
1131 UnwindLogMsg ("could not supply caller's reg %d location", lldb_regnum);
1132 return UnwindLLDB::RegisterSearchResult::eRegisterNotFound;
1133 }
1134
1135 if (unwindplan_regloc.IsSame())
1136 {
1137 if (IsFrameZero ())
1138 {
1139 UnwindLogMsg ("could not supply caller's reg %d location", lldb_regnum);
1140 return UnwindLLDB::RegisterSearchResult::eRegisterNotFound;
1141 }
1142 else
1143 {
1144 return UnwindLLDB::RegisterSearchResult::eRegisterNotFound;
1145 }
1146 }
1147
1148 if (unwindplan_regloc.IsCFAPlusOffset())
1149 {
1150 int offset = unwindplan_regloc.GetOffset();
1151 regloc.type = UnwindLLDB::RegisterLocation::eRegisterValueInferred;
1152 regloc.location.inferred_value = m_cfa + offset;
1153 m_registers[lldb_regnum] = regloc;
1154 UnwindLogMsg ("supplying caller's register %d, value is CFA plus offset", lldb_regnum);
1155 return UnwindLLDB::RegisterSearchResult::eRegisterFound;
1156 }
1157
1158 if (unwindplan_regloc.IsAtCFAPlusOffset())
1159 {
1160 int offset = unwindplan_regloc.GetOffset();
1161 regloc.type = UnwindLLDB::RegisterLocation::eRegisterSavedAtMemoryLocation;
1162 regloc.location.target_memory_location = m_cfa + offset;
1163 m_registers[lldb_regnum] = regloc;
1164 UnwindLogMsg ("supplying caller's register %d from the stack, saved at CFA plus offset", lldb_regnum);
1165 return UnwindLLDB::RegisterSearchResult::eRegisterFound;
1166 }
1167
1168 if (unwindplan_regloc.IsInOtherRegister())
1169 {
1170 uint32_t unwindplan_regnum = unwindplan_regloc.GetRegisterNumber();
1171 uint32_t row_regnum_in_lldb;
1172 if (!m_thread.GetRegisterContext()->ConvertBetweenRegisterKinds (unwindplan_registerkind, unwindplan_regnum, eRegisterKindLLDB, row_regnum_in_lldb))
1173 {
1174 UnwindLogMsg ("could not supply caller's reg %d location", lldb_regnum);
1175 return UnwindLLDB::RegisterSearchResult::eRegisterNotFound;
1176 }
1177 regloc.type = UnwindLLDB::RegisterLocation::eRegisterInRegister;
1178 regloc.location.register_number = row_regnum_in_lldb;
1179 m_registers[lldb_regnum] = regloc;
1180 UnwindLogMsg ("supplying caller's register %d, saved in register %d", lldb_regnum, row_regnum_in_lldb);
1181 return UnwindLLDB::RegisterSearchResult::eRegisterFound;
1182 }
1183
1184 if (unwindplan_regloc.IsDWARFExpression() || unwindplan_regloc.IsAtDWARFExpression())
1185 {
1186 DataExtractor dwarfdata (unwindplan_regloc.GetDWARFExpressionBytes(),
1187 unwindplan_regloc.GetDWARFExpressionLength(),
1188 process->GetByteOrder(), process->GetAddressByteSize());
1189 DWARFExpression dwarfexpr (dwarfdata, 0, unwindplan_regloc.GetDWARFExpressionLength());
1190 dwarfexpr.SetRegisterKind (unwindplan_registerkind);
1191 Value result;
1192 Error error;
1193 if (dwarfexpr.Evaluate (&exe_ctx, NULL, NULL, this, 0, NULL, result, &error))
1194 {
1195 addr_t val;
1196 val = result.GetScalar().ULongLong();
1197 if (unwindplan_regloc.IsDWARFExpression())
1198 {
1199 regloc.type = UnwindLLDB::RegisterLocation::eRegisterValueInferred;
1200 regloc.location.inferred_value = val;
1201 m_registers[lldb_regnum] = regloc;
1202 UnwindLogMsg ("supplying caller's register %d via DWARF expression (IsDWARFExpression)", lldb_regnum);
1203 return UnwindLLDB::RegisterSearchResult::eRegisterFound;
1204 }
1205 else
1206 {
1207 regloc.type = UnwindLLDB::RegisterLocation::eRegisterSavedAtMemoryLocation;
1208 regloc.location.target_memory_location = val;
1209 m_registers[lldb_regnum] = regloc;
1210 UnwindLogMsg ("supplying caller's register %d via DWARF expression (IsAtDWARFExpression)", lldb_regnum);
1211 return UnwindLLDB::RegisterSearchResult::eRegisterFound;
1212 }
1213 }
1214 UnwindLogMsg ("tried to use IsDWARFExpression or IsAtDWARFExpression for reg %d but failed", lldb_regnum);
1215 return UnwindLLDB::RegisterSearchResult::eRegisterNotFound;
1216 }
1217
1218 UnwindLogMsg ("could not supply caller's reg %d location", lldb_regnum);
1219
1220 // FIXME UnwindPlan::Row types atDWARFExpression and isDWARFExpression are unsupported.
1221
1222 return UnwindLLDB::RegisterSearchResult::eRegisterNotFound;
1223 }
1224
1225 // If the Full unwindplan has been determined to be incorrect, this method will
1226 // replace it with the architecture's default unwindplna, if one is defined.
1227 // It will also find the FuncUnwinders object for this function and replace the
1228 // Full unwind method for the function there so we don't use the errant Full unwindplan
1229 // again in the future of this debug session.
1230 // We're most likely doing this because the Full unwindplan was generated by assembly
1231 // instruction profiling and the profiler got something wrong.
1232
1233 void
InvalidateFullUnwindPlan()1234 RegisterContextLLDB::InvalidateFullUnwindPlan ()
1235 {
1236 UnwindPlan::Row::RegisterLocation unwindplan_regloc;
1237 ExecutionContext exe_ctx (m_thread.shared_from_this());
1238 Process *process = exe_ctx.GetProcessPtr();
1239 ABI *abi = process ? process->GetABI().get() : NULL;
1240 if (abi)
1241 {
1242 UnwindPlanSP original_full_unwind_plan_sp = m_full_unwind_plan_sp;
1243 UnwindPlanSP arch_default_unwind_plan_sp;
1244 arch_default_unwind_plan_sp.reset (new UnwindPlan (lldb::eRegisterKindGeneric));
1245 abi->CreateDefaultUnwindPlan(*arch_default_unwind_plan_sp);
1246 if (arch_default_unwind_plan_sp)
1247 {
1248 UnwindPlan::RowSP active_row = arch_default_unwind_plan_sp->GetRowForFunctionOffset (m_current_offset);
1249
1250 if (active_row && active_row->GetCFARegister() != LLDB_INVALID_REGNUM)
1251 {
1252 FuncUnwindersSP func_unwinders_sp;
1253 if (m_sym_ctx_valid && m_current_pc.IsValid() && m_current_pc.GetModule())
1254 {
1255 func_unwinders_sp = m_current_pc.GetModule()->GetObjectFile()->GetUnwindTable().GetFuncUnwindersContainingAddress (m_current_pc, m_sym_ctx);
1256 if (func_unwinders_sp)
1257 {
1258 func_unwinders_sp->InvalidateNonCallSiteUnwindPlan (m_thread);
1259 }
1260 }
1261 m_registers.clear();
1262 m_full_unwind_plan_sp = arch_default_unwind_plan_sp;
1263 addr_t cfa_regval = LLDB_INVALID_ADDRESS;
1264 if (ReadGPRValue (arch_default_unwind_plan_sp->GetRegisterKind(), active_row->GetCFARegister(), cfa_regval))
1265 {
1266 m_cfa = cfa_regval + active_row->GetCFAOffset ();
1267 }
1268
1269 UnwindLogMsg ("full unwind plan '%s' has been replaced by architecture default unwind plan '%s' for this function from now on.",
1270 original_full_unwind_plan_sp->GetSourceName().GetCString(), arch_default_unwind_plan_sp->GetSourceName().GetCString());
1271 }
1272 }
1273 }
1274 }
1275
1276 // Retrieve a general purpose register value for THIS frame, as saved by the NEXT frame, i.e. the frame that
1277 // this frame called. e.g.
1278 //
1279 // foo () { }
1280 // bar () { foo (); }
1281 // main () { bar (); }
1282 //
1283 // stopped in foo() so
1284 // frame 0 - foo
1285 // frame 1 - bar
1286 // frame 2 - main
1287 // and this RegisterContext is for frame 1 (bar) - if we want to get the pc value for frame 1, we need to ask
1288 // where frame 0 (the "next" frame) saved that and retrieve the value.
1289
1290 bool
ReadGPRValue(int register_kind,uint32_t regnum,addr_t & value)1291 RegisterContextLLDB::ReadGPRValue (int register_kind, uint32_t regnum, addr_t &value)
1292 {
1293 if (!IsValid())
1294 return false;
1295
1296 uint32_t lldb_regnum;
1297 if (register_kind == eRegisterKindLLDB)
1298 {
1299 lldb_regnum = regnum;
1300 }
1301 else if (!m_thread.GetRegisterContext()->ConvertBetweenRegisterKinds (register_kind, regnum, eRegisterKindLLDB, lldb_regnum))
1302 {
1303 return false;
1304 }
1305
1306 const RegisterInfo *reg_info = GetRegisterInfoAtIndex(lldb_regnum);
1307 RegisterValue reg_value;
1308 // if this is frame 0 (currently executing frame), get the requested reg contents from the actual thread registers
1309 if (IsFrameZero ())
1310 {
1311 if (m_thread.GetRegisterContext()->ReadRegister (reg_info, reg_value))
1312 {
1313 value = reg_value.GetAsUInt64();
1314 return true;
1315 }
1316 return false;
1317 }
1318
1319 bool pc_register = false;
1320 uint32_t generic_regnum;
1321 if (register_kind == eRegisterKindGeneric && regnum == LLDB_REGNUM_GENERIC_PC)
1322 {
1323 pc_register = true;
1324 }
1325 else if (m_thread.GetRegisterContext()->ConvertBetweenRegisterKinds (register_kind, regnum, eRegisterKindGeneric, generic_regnum)
1326 && generic_regnum == LLDB_REGNUM_GENERIC_PC)
1327 {
1328 pc_register = true;
1329 }
1330
1331 lldb_private::UnwindLLDB::RegisterLocation regloc;
1332 if (!m_parent_unwind.SearchForSavedLocationForRegister (lldb_regnum, regloc, m_frame_number - 1, pc_register))
1333 {
1334 return false;
1335 }
1336 if (ReadRegisterValueFromRegisterLocation (regloc, reg_info, reg_value))
1337 {
1338 value = reg_value.GetAsUInt64();
1339 return true;
1340 }
1341 return false;
1342 }
1343
1344 // Find the value of a register in THIS frame
1345
1346 bool
ReadRegister(const RegisterInfo * reg_info,RegisterValue & value)1347 RegisterContextLLDB::ReadRegister (const RegisterInfo *reg_info, RegisterValue &value)
1348 {
1349 if (!IsValid())
1350 return false;
1351
1352 const uint32_t lldb_regnum = reg_info->kinds[eRegisterKindLLDB];
1353 UnwindLogMsgVerbose ("looking for register saved location for reg %d", lldb_regnum);
1354
1355 // If this is the 0th frame, hand this over to the live register context
1356 if (IsFrameZero ())
1357 {
1358 UnwindLogMsgVerbose ("passing along to the live register context for reg %d", lldb_regnum);
1359 return m_thread.GetRegisterContext()->ReadRegister (reg_info, value);
1360 }
1361
1362 lldb_private::UnwindLLDB::RegisterLocation regloc;
1363 // Find out where the NEXT frame saved THIS frame's register contents
1364 if (!m_parent_unwind.SearchForSavedLocationForRegister (lldb_regnum, regloc, m_frame_number - 1, false))
1365 return false;
1366
1367 return ReadRegisterValueFromRegisterLocation (regloc, reg_info, value);
1368 }
1369
1370 bool
WriteRegister(const RegisterInfo * reg_info,const RegisterValue & value)1371 RegisterContextLLDB::WriteRegister (const RegisterInfo *reg_info, const RegisterValue &value)
1372 {
1373 if (!IsValid())
1374 return false;
1375
1376 const uint32_t lldb_regnum = reg_info->kinds[eRegisterKindLLDB];
1377 UnwindLogMsgVerbose ("looking for register saved location for reg %d", lldb_regnum);
1378
1379 // If this is the 0th frame, hand this over to the live register context
1380 if (IsFrameZero ())
1381 {
1382 UnwindLogMsgVerbose ("passing along to the live register context for reg %d", lldb_regnum);
1383 return m_thread.GetRegisterContext()->WriteRegister (reg_info, value);
1384 }
1385
1386 lldb_private::UnwindLLDB::RegisterLocation regloc;
1387 // Find out where the NEXT frame saved THIS frame's register contents
1388 if (!m_parent_unwind.SearchForSavedLocationForRegister (lldb_regnum, regloc, m_frame_number - 1, false))
1389 return false;
1390
1391 return WriteRegisterValueToRegisterLocation (regloc, reg_info, value);
1392 }
1393
1394 // Don't need to implement this one
1395 bool
ReadAllRegisterValues(lldb::DataBufferSP & data_sp)1396 RegisterContextLLDB::ReadAllRegisterValues (lldb::DataBufferSP &data_sp)
1397 {
1398 return false;
1399 }
1400
1401 // Don't need to implement this one
1402 bool
WriteAllRegisterValues(const lldb::DataBufferSP & data_sp)1403 RegisterContextLLDB::WriteAllRegisterValues (const lldb::DataBufferSP& data_sp)
1404 {
1405 return false;
1406 }
1407
1408 // Retrieve the pc value for THIS from
1409
1410 bool
GetCFA(addr_t & cfa)1411 RegisterContextLLDB::GetCFA (addr_t& cfa)
1412 {
1413 if (!IsValid())
1414 {
1415 return false;
1416 }
1417 if (m_cfa == LLDB_INVALID_ADDRESS)
1418 {
1419 return false;
1420 }
1421 cfa = m_cfa;
1422 return true;
1423 }
1424
1425
1426 RegisterContextLLDB::SharedPtr
GetNextFrame() const1427 RegisterContextLLDB::GetNextFrame () const
1428 {
1429 RegisterContextLLDB::SharedPtr regctx;
1430 if (m_frame_number == 0)
1431 return regctx;
1432 return m_parent_unwind.GetRegisterContextForFrameNum (m_frame_number - 1);
1433 }
1434
1435 RegisterContextLLDB::SharedPtr
GetPrevFrame() const1436 RegisterContextLLDB::GetPrevFrame () const
1437 {
1438 RegisterContextLLDB::SharedPtr regctx;
1439 return m_parent_unwind.GetRegisterContextForFrameNum (m_frame_number + 1);
1440 }
1441
1442 // Retrieve the address of the start of the function of THIS frame
1443
1444 bool
GetStartPC(addr_t & start_pc)1445 RegisterContextLLDB::GetStartPC (addr_t& start_pc)
1446 {
1447 if (!IsValid())
1448 return false;
1449
1450 if (!m_start_pc.IsValid())
1451 {
1452 return ReadPC (start_pc);
1453 }
1454 start_pc = m_start_pc.GetLoadAddress (CalculateTarget().get());
1455 return true;
1456 }
1457
1458 // Retrieve the current pc value for THIS frame, as saved by the NEXT frame.
1459
1460 bool
ReadPC(addr_t & pc)1461 RegisterContextLLDB::ReadPC (addr_t& pc)
1462 {
1463 if (!IsValid())
1464 return false;
1465
1466 if (ReadGPRValue (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, pc))
1467 {
1468 // A pc value of 0 or 1 is impossible in the middle of the stack -- it indicates the end of a stack walk.
1469 // On the currently executing frame (or such a frame interrupted asynchronously by sigtramp et al) this may
1470 // occur if code has jumped through a NULL pointer -- we want to be able to unwind past that frame to help
1471 // find the bug.
1472
1473 if (m_all_registers_available == false
1474 && (pc == 0 || pc == 1))
1475 {
1476 return false;
1477 }
1478 else
1479 {
1480 return true;
1481 }
1482 }
1483 else
1484 {
1485 return false;
1486 }
1487 }
1488
1489
1490 void
UnwindLogMsg(const char * fmt,...)1491 RegisterContextLLDB::UnwindLogMsg (const char *fmt, ...)
1492 {
1493 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_UNWIND));
1494 if (log)
1495 {
1496 va_list args;
1497 va_start (args, fmt);
1498
1499 char *logmsg;
1500 if (vasprintf (&logmsg, fmt, args) == -1 || logmsg == NULL)
1501 {
1502 if (logmsg)
1503 free (logmsg);
1504 va_end (args);
1505 return;
1506 }
1507 va_end (args);
1508
1509 log->Printf ("%*sth%d/fr%u %s",
1510 m_frame_number < 100 ? m_frame_number : 100, "", m_thread.GetIndexID(), m_frame_number,
1511 logmsg);
1512 free (logmsg);
1513 }
1514 }
1515
1516 void
UnwindLogMsgVerbose(const char * fmt,...)1517 RegisterContextLLDB::UnwindLogMsgVerbose (const char *fmt, ...)
1518 {
1519 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_UNWIND));
1520 if (log && log->GetVerbose())
1521 {
1522 va_list args;
1523 va_start (args, fmt);
1524
1525 char *logmsg;
1526 if (vasprintf (&logmsg, fmt, args) == -1 || logmsg == NULL)
1527 {
1528 if (logmsg)
1529 free (logmsg);
1530 va_end (args);
1531 return;
1532 }
1533 va_end (args);
1534
1535 log->Printf ("%*sth%d/fr%u %s",
1536 m_frame_number < 100 ? m_frame_number : 100, "", m_thread.GetIndexID(), m_frame_number,
1537 logmsg);
1538 free (logmsg);
1539 }
1540 }
1541
1542