| 
14 | 14 | #include <sys/utsname.h>  | 
15 | 15 | #endif  | 
16 | 16 | 
 
  | 
17 |  | -#include "Plugins/Process/Utility/LinuxSignals.h"  | 
18 | 17 | #include "Utility/ARM64_DWARF_Registers.h"  | 
19 | 18 | #include "lldb/Core/Debugger.h"  | 
20 | 19 | #include "lldb/Core/PluginManager.h"  | 
@@ -481,107 +480,3 @@ CompilerType PlatformLinux::GetSiginfoType(const llvm::Triple &triple) {  | 
481 | 480 |   ast->CompleteTagDeclarationDefinition(siginfo_type);  | 
482 | 481 |   return siginfo_type;  | 
483 | 482 | }  | 
484 |  | - | 
485 |  | -static std::string GetDescriptionFromSiginfo(lldb::ValueObjectSP siginfo_sp) {  | 
486 |  | -  if (!siginfo_sp)  | 
487 |  | -    return "";  | 
488 |  | - | 
489 |  | -  lldb_private::LinuxSignals linux_signals;  | 
490 |  | -  int code = siginfo_sp->GetChildMemberWithName("si_code")->GetValueAsSigned(0);  | 
491 |  | -  int signo =  | 
492 |  | -      siginfo_sp->GetChildMemberWithName("si_signo")->GetValueAsSigned(-1);  | 
493 |  | - | 
494 |  | -  auto sifields = siginfo_sp->GetChildMemberWithName("_sifields");  | 
495 |  | -  if (!sifields)  | 
496 |  | -    return linux_signals.GetSignalDescription(signo, code);  | 
497 |  | - | 
498 |  | -  // declare everything that we can populate later.  | 
499 |  | -  std::optional<lldb::addr_t> addr;  | 
500 |  | -  std::optional<lldb::addr_t> upper;  | 
501 |  | -  std::optional<lldb::addr_t> lower;  | 
502 |  | -  std::optional<uint32_t> pid;  | 
503 |  | -  std::optional<uint32_t> uid;  | 
504 |  | - | 
505 |  | -  // The negative si_codes are special and mean this signal was sent from user  | 
506 |  | -  // space not the kernel. These take precedence because they break some of the  | 
507 |  | -  // invariants around kernel sent signals. Such as SIGSEGV won't have an  | 
508 |  | -  // address.  | 
509 |  | -  if (code < 0) {  | 
510 |  | -    auto sikill = sifields->GetChildMemberWithName("_kill");  | 
511 |  | -    if (sikill) {  | 
512 |  | -      auto pid_sp = sikill->GetChildMemberWithName("si_pid");  | 
513 |  | -      if (pid_sp)  | 
514 |  | -        pid = pid_sp->GetValueAsUnsigned(-1);  | 
515 |  | -      auto uid_sp = sikill->GetChildMemberWithName("si_uid");  | 
516 |  | -      if (uid_sp)  | 
517 |  | -        uid = uid_sp->GetValueAsUnsigned(-1);  | 
518 |  | -    }  | 
519 |  | -  } else {  | 
520 |  | - | 
521 |  | -    switch (signo) {  | 
522 |  | -    case SIGILL:  | 
523 |  | -    case SIGFPE:  | 
524 |  | -    case SIGBUS: {  | 
525 |  | -      auto sigfault = sifields->GetChildMemberWithName("_sigfault");  | 
526 |  | -      if (!sigfault)  | 
527 |  | -        break;  | 
528 |  | - | 
529 |  | -      auto addr_sp = sigfault->GetChildMemberWithName("si_addr");  | 
530 |  | -      if (addr_sp)  | 
531 |  | -        addr = addr_sp->GetValueAsUnsigned(-1);  | 
532 |  | -      break;  | 
533 |  | -    }  | 
534 |  | -    case SIGSEGV: {  | 
535 |  | -      auto sigfault = sifields->GetChildMemberWithName("_sigfault");  | 
536 |  | -      if (!sigfault)  | 
537 |  | -        break;  | 
538 |  | - | 
539 |  | -      auto addr_sp = sigfault->GetChildMemberWithName("si_addr");  | 
540 |  | -      if (addr_sp)  | 
541 |  | -        addr = addr_sp->GetValueAsUnsigned(-1);  | 
542 |  | - | 
543 |  | -      auto bounds_sp = sigfault->GetChildMemberWithName("_bounds");  | 
544 |  | -      if (!bounds_sp)  | 
545 |  | -        break;  | 
546 |  | - | 
547 |  | -      auto addr_bnds_sp = bounds_sp->GetChildMemberWithName("_addr_bnd");  | 
548 |  | -      if (!addr_bnds_sp)  | 
549 |  | -        break;  | 
550 |  | - | 
551 |  | -      auto lower_sp = addr_bnds_sp->GetChildMemberWithName("_lower");  | 
552 |  | -      if (lower_sp)  | 
553 |  | -        lower = lower_sp->GetValueAsUnsigned(-1);  | 
554 |  | - | 
555 |  | -      auto upper_sp = addr_bnds_sp->GetChildMemberWithName("_upper");  | 
556 |  | -      if (upper_sp)  | 
557 |  | -        upper = upper_sp->GetValueAsUnsigned(-1);  | 
558 |  | - | 
559 |  | -      break;  | 
560 |  | -    }  | 
561 |  | -    default:  | 
562 |  | -      break;  | 
563 |  | -    }  | 
564 |  | -  }  | 
565 |  | - | 
566 |  | -  return linux_signals.GetSignalDescription(signo, code, addr, lower, upper,  | 
567 |  | -                                            uid, pid);  | 
568 |  | -}  | 
569 |  | - | 
570 |  | -lldb::StopInfoSP PlatformLinux::GetStopInfoFromSiginfo(Thread &thread) {  | 
571 |  | -  ValueObjectSP siginfo_sp = thread.GetSiginfoValue();  | 
572 |  | -  if (!siginfo_sp)  | 
573 |  | -    return {};  | 
574 |  | -  auto signo_sp = siginfo_sp->GetChildMemberWithName("si_signo");  | 
575 |  | -  auto sicode_sp = siginfo_sp->GetChildMemberWithName("si_code");  | 
576 |  | -  if (!signo_sp || !sicode_sp)  | 
577 |  | -    return {};  | 
578 |  | - | 
579 |  | -  std::string siginfo_description = GetDescriptionFromSiginfo(siginfo_sp);  | 
580 |  | -  if (siginfo_description.empty())  | 
581 |  | -    return StopInfo::CreateStopReasonWithSignal(  | 
582 |  | -        thread, signo_sp->GetValueAsUnsigned(-1));  | 
583 |  | - | 
584 |  | -  return StopInfo::CreateStopReasonWithSignal(  | 
585 |  | -      thread, signo_sp->GetValueAsUnsigned(-1), siginfo_description.c_str(),  | 
586 |  | -      sicode_sp->GetValueAsUnsigned(0));  | 
587 |  | -}  | 
0 commit comments