forked from OSchip/llvm-project
[NFC][LSAN] Change SuspendedThreadsList interface
Remove RegisterCount and let GetRegistersAndSP to resize buffer as needed. Reviewed By: morehouse Differential Revision: https://reviews.llvm.org/D87747
This commit is contained in:
parent
a45cdb311f
commit
cd13476ab5
|
@ -218,10 +218,7 @@ static void ProcessThreads(SuspendedThreadsList const &, Frontier *) {}
|
|||
// Scans thread data (stacks and TLS) for heap pointers.
|
||||
static void ProcessThreads(SuspendedThreadsList const &suspended_threads,
|
||||
Frontier *frontier) {
|
||||
InternalMmapVector<uptr> registers(suspended_threads.RegisterCount());
|
||||
uptr registers_begin = reinterpret_cast<uptr>(registers.data());
|
||||
uptr registers_end =
|
||||
reinterpret_cast<uptr>(registers.data() + registers.size());
|
||||
InternalMmapVector<uptr> registers;
|
||||
for (uptr i = 0; i < suspended_threads.ThreadCount(); i++) {
|
||||
tid_t os_id = static_cast<tid_t>(suspended_threads.GetThreadID(i));
|
||||
LOG_THREADS("Processing thread %d.\n", os_id);
|
||||
|
@ -238,7 +235,7 @@ static void ProcessThreads(SuspendedThreadsList const &suspended_threads,
|
|||
}
|
||||
uptr sp;
|
||||
PtraceRegistersStatus have_registers =
|
||||
suspended_threads.GetRegistersAndSP(i, registers.data(), &sp);
|
||||
suspended_threads.GetRegistersAndSP(i, ®isters, &sp);
|
||||
if (have_registers != REGISTERS_AVAILABLE) {
|
||||
Report("Unable to get registers from thread %d.\n", os_id);
|
||||
// If unable to get SP, consider the entire stack to be reachable unless
|
||||
|
@ -247,9 +244,13 @@ static void ProcessThreads(SuspendedThreadsList const &suspended_threads,
|
|||
sp = stack_begin;
|
||||
}
|
||||
|
||||
if (flags()->use_registers && have_registers)
|
||||
if (flags()->use_registers && have_registers) {
|
||||
uptr registers_begin = reinterpret_cast<uptr>(registers.data());
|
||||
uptr registers_end =
|
||||
reinterpret_cast<uptr>(registers.data() + registers.size());
|
||||
ScanRangeForPointers(registers_begin, registers_end, frontier,
|
||||
"REGISTERS", kReachable);
|
||||
}
|
||||
|
||||
if (flags()->use_stacks) {
|
||||
LOG_THREADS("Stack at %p-%p (SP = %p).\n", stack_begin, stack_end, sp);
|
||||
|
|
|
@ -32,13 +32,11 @@ class SuspendedThreadsList {
|
|||
|
||||
// Can't declare pure virtual functions in sanitizer runtimes:
|
||||
// __cxa_pure_virtual might be unavailable. Use UNIMPLEMENTED() instead.
|
||||
virtual PtraceRegistersStatus GetRegistersAndSP(uptr index, uptr *buffer,
|
||||
uptr *sp) const {
|
||||
virtual PtraceRegistersStatus GetRegistersAndSP(
|
||||
uptr index, InternalMmapVector<uptr> *buffer, uptr *sp) const {
|
||||
UNIMPLEMENTED();
|
||||
}
|
||||
|
||||
// The buffer in GetRegistersAndSP should be at least this big.
|
||||
virtual uptr RegisterCount() const { UNIMPLEMENTED(); }
|
||||
virtual uptr ThreadCount() const { UNIMPLEMENTED(); }
|
||||
virtual tid_t GetThreadID(uptr index) const { UNIMPLEMENTED(); }
|
||||
|
||||
|
|
|
@ -94,9 +94,9 @@ class SuspendedThreadsListLinux : public SuspendedThreadsList {
|
|||
bool ContainsTid(tid_t thread_id) const;
|
||||
void Append(tid_t tid);
|
||||
|
||||
PtraceRegistersStatus GetRegistersAndSP(uptr index, uptr *buffer,
|
||||
PtraceRegistersStatus GetRegistersAndSP(uptr index,
|
||||
InternalMmapVector<uptr> *buffer,
|
||||
uptr *sp) const override;
|
||||
uptr RegisterCount() const override;
|
||||
|
||||
private:
|
||||
InternalMmapVector<tid_t> thread_ids_;
|
||||
|
@ -533,7 +533,7 @@ void SuspendedThreadsListLinux::Append(tid_t tid) {
|
|||
}
|
||||
|
||||
PtraceRegistersStatus SuspendedThreadsListLinux::GetRegistersAndSP(
|
||||
uptr index, uptr *buffer, uptr *sp) const {
|
||||
uptr index, InternalMmapVector<uptr> *buffer, uptr *sp) const {
|
||||
pid_t tid = GetThreadID(index);
|
||||
regs_struct regs;
|
||||
int pterrno;
|
||||
|
@ -559,13 +559,11 @@ PtraceRegistersStatus SuspendedThreadsListLinux::GetRegistersAndSP(
|
|||
}
|
||||
|
||||
*sp = regs.REG_SP;
|
||||
internal_memcpy(buffer, ®s, sizeof(regs));
|
||||
buffer->resize(RoundUpTo(sizeof(regs), sizeof(uptr)) / sizeof(uptr));
|
||||
internal_memcpy(buffer->data(), ®s, sizeof(regs));
|
||||
return REGISTERS_AVAILABLE;
|
||||
}
|
||||
|
||||
uptr SuspendedThreadsListLinux::RegisterCount() const {
|
||||
return sizeof(regs_struct) / sizeof(uptr);
|
||||
}
|
||||
} // namespace __sanitizer
|
||||
|
||||
#endif // SANITIZER_LINUX && (defined(__x86_64__) || defined(__mips__)
|
||||
|
|
|
@ -37,9 +37,9 @@ class SuspendedThreadsListMac : public SuspendedThreadsList {
|
|||
bool ContainsThread(thread_t thread) const;
|
||||
void Append(thread_t thread);
|
||||
|
||||
PtraceRegistersStatus GetRegistersAndSP(uptr index, uptr *buffer,
|
||||
PtraceRegistersStatus GetRegistersAndSP(uptr index,
|
||||
InternalMmapVector<uptr> *buffer,
|
||||
uptr *sp) const override;
|
||||
uptr RegisterCount() const override;
|
||||
|
||||
private:
|
||||
InternalMmapVector<SuspendedThreadInfo> threads_;
|
||||
|
@ -142,7 +142,7 @@ void SuspendedThreadsListMac::Append(thread_t thread) {
|
|||
}
|
||||
|
||||
PtraceRegistersStatus SuspendedThreadsListMac::GetRegistersAndSP(
|
||||
uptr index, uptr *buffer, uptr *sp) const {
|
||||
uptr index, InternalMmapVector<uptr> *buffer, uptr *sp) const {
|
||||
thread_t thread = GetThread(index);
|
||||
regs_struct regs;
|
||||
int err;
|
||||
|
@ -159,7 +159,8 @@ PtraceRegistersStatus SuspendedThreadsListMac::GetRegistersAndSP(
|
|||
: REGISTERS_UNAVAILABLE;
|
||||
}
|
||||
|
||||
internal_memcpy(buffer, ®s, sizeof(regs));
|
||||
buffer->resize(RoundUpTo(sizeof(regs), sizeof(uptr)) / sizeof(uptr));
|
||||
internal_memcpy(buffer->data(), ®s, sizeof(regs));
|
||||
#if defined(__aarch64__) && defined(arm_thread_state64_get_sp)
|
||||
*sp = arm_thread_state64_get_sp(regs);
|
||||
#else
|
||||
|
@ -173,9 +174,6 @@ PtraceRegistersStatus SuspendedThreadsListMac::GetRegistersAndSP(
|
|||
return REGISTERS_AVAILABLE;
|
||||
}
|
||||
|
||||
uptr SuspendedThreadsListMac::RegisterCount() const {
|
||||
return MACHINE_THREAD_STATE_COUNT;
|
||||
}
|
||||
} // namespace __sanitizer
|
||||
|
||||
#endif // SANITIZER_MAC && (defined(__x86_64__) || defined(__aarch64__)) ||
|
||||
|
|
|
@ -57,9 +57,9 @@ class SuspendedThreadsListNetBSD : public SuspendedThreadsList {
|
|||
bool ContainsTid(tid_t thread_id) const;
|
||||
void Append(tid_t tid);
|
||||
|
||||
PtraceRegistersStatus GetRegistersAndSP(uptr index, uptr *buffer,
|
||||
PtraceRegistersStatus GetRegistersAndSP(uptr index,
|
||||
InternalMmapVector<uptr> *buffer,
|
||||
uptr *sp) const;
|
||||
uptr RegisterCount() const;
|
||||
|
||||
private:
|
||||
InternalMmapVector<tid_t> thread_ids_;
|
||||
|
@ -335,7 +335,7 @@ void SuspendedThreadsListNetBSD::Append(tid_t tid) {
|
|||
}
|
||||
|
||||
PtraceRegistersStatus SuspendedThreadsListNetBSD::GetRegistersAndSP(
|
||||
uptr index, uptr *buffer, uptr *sp) const {
|
||||
uptr index, InternalMmapVector<uptr> *buffer, uptr *sp) const {
|
||||
lwpid_t tid = GetThreadID(index);
|
||||
pid_t ppid = internal_getppid();
|
||||
struct reg regs;
|
||||
|
@ -351,14 +351,12 @@ PtraceRegistersStatus SuspendedThreadsListNetBSD::GetRegistersAndSP(
|
|||
}
|
||||
|
||||
*sp = PTRACE_REG_SP(®s);
|
||||
internal_memcpy(buffer, ®s, sizeof(regs));
|
||||
buffer->resize(RoundUpTo(sizeof(regs), sizeof(uptr)) / sizeof(uptr));
|
||||
internal_memcpy(buffer->data(), ®s, sizeof(regs));
|
||||
|
||||
return REGISTERS_AVAILABLE;
|
||||
}
|
||||
|
||||
uptr SuspendedThreadsListNetBSD::RegisterCount() const {
|
||||
return sizeof(struct reg) / sizeof(uptr);
|
||||
}
|
||||
} // namespace __sanitizer
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue