Move the non-trivial implementation of AsanShadowRangeIsAvailable to asan_mac.cc
to avoid crashes on Linux and Win.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@150398 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/asan/asan_internal.h b/lib/asan/asan_internal.h
index 0223885..67ed869 100644
--- a/lib/asan/asan_internal.h
+++ b/lib/asan/asan_internal.h
@@ -125,8 +125,9 @@
void OutOfMemoryMessageAndDie(const char *mem_type, size_t size);
-// asan_linux.cc / asan_mac.cc
+// asan_linux.cc / asan_mac.cc / asan_win.cc
void *AsanDoesNotSupportStaticLinkage();
+bool AsanShadowRangeIsAvailable();
int AsanOpenReadonly(const char* filename);
const char *AsanGetEnv(const char *name);
diff --git a/lib/asan/asan_linux.cc b/lib/asan/asan_linux.cc
index b2339e4..14fc3e5 100644
--- a/lib/asan/asan_linux.cc
+++ b/lib/asan/asan_linux.cc
@@ -43,6 +43,11 @@
return &_DYNAMIC; // defined in link.h
}
+bool AsanShadowRangeIsAvailable() {
+ // FIXME: shall we need anything here on Linux?
+ return true;
+}
+
void GetPcSpBp(void *context, uintptr_t *pc, uintptr_t *sp, uintptr_t *bp) {
#ifdef ANDROID
*pc = *sp = *bp = 0;
diff --git a/lib/asan/asan_mac.cc b/lib/asan/asan_mac.cc
index 8943a4a..2d91c43 100644
--- a/lib/asan/asan_mac.cc
+++ b/lib/asan/asan_mac.cc
@@ -76,6 +76,42 @@
return NULL;
}
+inline bool IntervalsAreSeparate(uintptr_t start1, uintptr_t end1,
+ uintptr_t start2, uintptr_t end2) {
+ CHECK(start1 <= end1);
+ CHECK(start2 <= end2);
+ if (start1 == start2) {
+ return false;
+ } else {
+ if (start1 < start2) {
+ return (end1 < start2);
+ } else {
+ return (end2 < start1);
+ }
+ }
+ return false;
+}
+
+// FIXME: this is thread-unsafe, but should not cause problems most of the time.
+// When the shadow is mapped only a single thread usually exists (plus maybe
+// several worker threads on Mac, which aren't expected to map big chunks of
+// memory).
+bool AsanShadowRangeIsAvailable() {
+ AsanProcMaps procmaps;
+ uintptr_t start, end;
+ bool available = true;
+ while (procmaps.Next(&start, &end,
+ /*offset*/NULL, /*filename*/NULL, /*size*/NULL)) {
+ if (!IntervalsAreSeparate(start, end,
+ kLowShadowBeg - kMmapGranularity,
+ kHighShadowEnd)) {
+ available = false;
+ break;
+ }
+ }
+ return available;
+}
+
bool AsanInterceptsSignal(int signum) {
return (signum == SIGSEGV || signum == SIGBUS) && FLAG_handle_segv;
}
diff --git a/lib/asan/asan_rtl.cc b/lib/asan/asan_rtl.cc
index 568a79f..715edb0 100644
--- a/lib/asan/asan_rtl.cc
+++ b/lib/asan/asan_rtl.cc
@@ -118,42 +118,6 @@
CHECK(res == (void*)beg && "ReserveShadowMemoryRange failed");
}
-inline bool IntervalsAreSeparate(uintptr_t start1, uintptr_t end1,
- uintptr_t start2, uintptr_t end2) {
- CHECK(start1 <= end1);
- CHECK(start2 <= end2);
- if (start1 == start2) {
- return false;
- } else {
- if (start1 < start2) {
- return (end1 < start2);
- } else {
- return (end2 < start1);
- }
- }
- return false;
-}
-
-// FIXME: this is thread-unsafe, but should not cause problems most of the time.
-// When the shadow is mapped only a single thread usually exists (plus maybe
-// several worker threads on Mac, which aren't expected to map big chunks of
-// memory.
-bool AsanShadowRangeIsAvailable() {
- AsanProcMaps procmaps;
- uintptr_t start, end;
- bool available = true;
- while (procmaps.Next(&start, &end,
- /*offset*/NULL, /*filename*/NULL, /*size*/NULL)) {
- if (!IntervalsAreSeparate(start, end,
- kLowShadowBeg - kMmapGranularity,
- kHighShadowEnd)) {
- available = false;
- break;
- }
- }
- return available;
-}
-
// ---------------------- LowLevelAllocator ------------- {{{1
void *LowLevelAllocator::Allocate(size_t size) {
CHECK((size & (size - 1)) == 0 && "size must be a power of two");
diff --git a/lib/asan/asan_win.cc b/lib/asan/asan_win.cc
index b3aa93d..7de5d58 100644
--- a/lib/asan/asan_win.cc
+++ b/lib/asan/asan_win.cc
@@ -223,6 +223,11 @@
return NULL;
}
+bool AsanShadowRangeIsAvailable() {
+ // FIXME: shall we do anything here on Windows?
+ return true;
+}
+
int AtomicInc(int *a) {
return InterlockedExchangeAdd((LONG*)a, 1) + 1;
}