Move the non-trivial implementation of AsanShadowRangeIsAvailable to asan_mac.cc

to avoid crashes on Linux and Win.

llvm-svn: 150398
This commit is contained in:
Alexander Potapenko 2012-02-13 17:09:40 +00:00
parent 31ae8b62ea
commit 720aaefb8d
5 changed files with 48 additions and 37 deletions

View File

@ -125,8 +125,9 @@ void ReplaceSystemMalloc();
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);

View File

@ -43,6 +43,11 @@ void *AsanDoesNotSupportStaticLinkage() {
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;

View File

@ -76,6 +76,42 @@ void *AsanDoesNotSupportStaticLinkage() {
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;
}

View File

@ -118,42 +118,6 @@ static void ReserveShadowMemoryRange(uintptr_t beg, uintptr_t end) {
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");

View File

@ -223,6 +223,11 @@ void *AsanDoesNotSupportStaticLinkage() {
return NULL;
}
bool AsanShadowRangeIsAvailable() {
// FIXME: shall we do anything here on Windows?
return true;
}
int AtomicInc(int *a) {
return InterlockedExchangeAdd((LONG*)a, 1) + 1;
}