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