Skip to content

Commit

Permalink
[LSAN][Fuchsia] Added ForEachExtraThreadStackRange to support Fuchsia…
Browse files Browse the repository at this point in the history
… code.

Reviewed By: vitalybuka

Differential Revision: https://reviews.llvm.org/D141724
  • Loading branch information
kstoimenov authored and vitalybuka committed Jan 14, 2023
1 parent a1fe1f5 commit af210ee
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 22 deletions.
21 changes: 18 additions & 3 deletions compiler-rt/lib/asan/asan_thread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -507,15 +507,30 @@ bool GetThreadRangesLocked(tid_t os_id, uptr *stack_begin, uptr *stack_end,

void GetAllThreadAllocatorCachesLocked(InternalMmapVector<uptr> *caches) {}

void ForEachExtraStackRange(tid_t os_id, RangeIteratorCallback callback,
void *arg) {
void GetThreadExtraStackRangesLocked(tid_t os_id,
InternalMmapVector<Range> *ranges) {
__asan::AsanThread *t = __asan::GetAsanThreadByOsIDLocked(os_id);
if (!t)
return;
__asan::FakeStack *fake_stack = t->get_fake_stack();
if (!fake_stack)
return;
fake_stack->ForEachFakeFrame(callback, arg);

fake_stack->ForEachFakeFrame(
[](uptr begin, uptr end, void *arg) {
reinterpret_cast<InternalMmapVector<Range> *>(arg)->push_back(
{begin : begin, end : end});
},
ranges);
}

void GetThreadExtraStackRangesLocked(InternalMmapVector<Range> *ranges) {
GetAsanThreadRegistryLocked()->RunCallbackForEachThreadLocked(
[](ThreadContextBase *tctx, void *arg) {
GetThreadExtraStackRangesLocked(
tctx->os_id, reinterpret_cast<InternalMmapVector<Range> *>(arg));
},
ranges);
}

void GetAdditionalThreadContextPtrsLocked(InternalMmapVector<uptr> *ptrs) {
Expand Down
5 changes: 3 additions & 2 deletions compiler-rt/lib/hwasan/hwasan_thread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -194,8 +194,9 @@ bool GetThreadRangesLocked(tid_t os_id, uptr *stack_begin, uptr *stack_end,

void GetAllThreadAllocatorCachesLocked(InternalMmapVector<uptr> *caches) {}

void ForEachExtraStackRange(tid_t os_id, RangeIteratorCallback callback,
void *arg) {}
void GetThreadExtraStackRangesLocked(tid_t os_id,
InternalMmapVector<Range> *ranges) {}
void GetThreadExtraStackRangesLocked(InternalMmapVector<Range> *ranges) {}

void GetAdditionalThreadContextPtrsLocked(InternalMmapVector<uptr> *ptrs) {}
void GetRunningThreadsLocked(InternalMmapVector<tid_t> *threads) {}
Expand Down
14 changes: 10 additions & 4 deletions compiler-rt/lib/lsan/lsan_common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -353,9 +353,12 @@ void ScanGlobalRange(uptr begin, uptr end, Frontier *frontier) {
}
}

void ForEachExtraStackRangeCb(uptr begin, uptr end, void *arg) {
Frontier *frontier = reinterpret_cast<Frontier *>(arg);
ScanRangeForPointers(begin, end, frontier, "FAKE STACK", kReachable);
void ScanExtraStackRanges(const InternalMmapVector<Range> &ranges,
Frontier *frontier) {
for (uptr i = 0; i < ranges.size(); i++) {
ScanRangeForPointers(ranges[i].begin, ranges[i].end, frontier, "FAKE STACK",
kReachable);
}
}

# if SANITIZER_FUCHSIA
Expand Down Expand Up @@ -397,6 +400,7 @@ static void ProcessThreads(SuspendedThreadsList const &suspended_threads,
Frontier *frontier, tid_t caller_tid,
uptr caller_sp) {
InternalMmapVector<uptr> registers;
InternalMmapVector<Range> extra_ranges;
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 %llu.\n", os_id);
Expand Down Expand Up @@ -457,7 +461,9 @@ static void ProcessThreads(SuspendedThreadsList const &suspended_threads,
}
ScanRangeForPointers(stack_begin, stack_end, frontier, "STACK",
kReachable);
ForEachExtraStackRange(os_id, ForEachExtraStackRangeCb, frontier);
extra_ranges.clear();
GetThreadExtraStackRangesLocked(os_id, &extra_ranges);
ScanExtraStackRanges(extra_ranges, frontier);
}

if (flags()->use_tls) {
Expand Down
12 changes: 9 additions & 3 deletions compiler-rt/lib/lsan/lsan_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,11 @@ enum IgnoreObjectResult {
kIgnoreObjectInvalid
};

struct Range {
uptr begin;
uptr end;
};

//// --------------------------------------------------------------------------
//// Poisoning prototypes.
//// --------------------------------------------------------------------------
Expand All @@ -105,8 +110,9 @@ bool GetThreadRangesLocked(tid_t os_id, uptr *stack_begin, uptr *stack_end,
uptr *tls_begin, uptr *tls_end, uptr *cache_begin,
uptr *cache_end, DTLS **dtls);
void GetAllThreadAllocatorCachesLocked(InternalMmapVector<uptr> *caches);
void ForEachExtraStackRange(tid_t os_id, RangeIteratorCallback callback,
void *arg);
void GetThreadExtraStackRangesLocked(InternalMmapVector<Range> *ranges);
void GetThreadExtraStackRangesLocked(tid_t os_id,
InternalMmapVector<Range> *ranges);
void GetAdditionalThreadContextPtrsLocked(InternalMmapVector<uptr> *ptrs);
void GetRunningThreadsLocked(InternalMmapVector<tid_t> *threads);

Expand Down Expand Up @@ -250,7 +256,6 @@ struct CheckForLeaksParam {
InternalMmapVectorNoCtor<RootRegion> const *GetRootRegions();
void ScanRootRegion(Frontier *frontier, RootRegion const &region,
uptr region_begin, uptr region_end, bool is_readable);
void ForEachExtraStackRangeCb(uptr begin, uptr end, void *arg);
// Run stoptheworld while holding any platform-specific locks, as well as the
// allocator and thread registry locks.
void LockStuffAndStopTheWorld(StopTheWorldCallback callback,
Expand All @@ -260,6 +265,7 @@ void ScanRangeForPointers(uptr begin, uptr end,
Frontier *frontier,
const char *region_type, ChunkTag tag);
void ScanGlobalRange(uptr begin, uptr end, Frontier *frontier);
void ScanExtraStackRanges(tid_t os_id, Frontier *frontier);

// Functions called from the parent tool.
const char *MaybeCallLsanDefaultOptions();
Expand Down
12 changes: 4 additions & 8 deletions compiler-rt/lib/lsan/lsan_common_fuchsia.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -144,17 +144,13 @@ void LockStuffAndStopTheWorld(StopTheWorldCallback callback,

// We don't use the thread registry at all for enumerating the threads
// and their stacks, registers, and TLS regions. So use it separately
// just for the allocator cache, and to call ForEachExtraStackRange,
// just for the allocator cache, and to call ScanExtraStackRanges,
// which ASan needs.
if (flags()->use_stacks) {
GetLsanThreadRegistryLocked()->RunCallbackForEachThreadLocked(
[](ThreadContextBase *tctx, void *arg) {
ForEachExtraStackRange(tctx->os_id, ForEachExtraStackRangeCb,
arg);
},
&params->argument->frontier);
InternalMmapVector<Range> ranges;
GetThreadExtraStackRangesLocked(&ranges);
ScanExtraStackRanges(ranges, &params->argument->frontier);
}

params->callback(SuspendedThreadsListFuchsia(), params->argument);
},
&params);
Expand Down
5 changes: 3 additions & 2 deletions compiler-rt/lib/lsan/lsan_thread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,9 @@ void EnsureMainThreadIDIsCorrect() {

///// Interface to the common LSan module. /////

void ForEachExtraStackRange(tid_t os_id, RangeIteratorCallback callback,
void *arg) {}
void GetThreadExtraStackRangesLocked(tid_t os_id,
InternalMmapVector<Range> *ranges) {}
void GetThreadExtraStackRangesLocked(InternalMmapVector<Range> *ranges) {}

void LockThreadRegistry() { thread_registry->Lock(); }

Expand Down

0 comments on commit af210ee

Please sign in to comment.