X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FRtsUtils.c;h=8ef6c0d6f2f38dc1fb79c7e713f7e89cca40553c;hb=6cec61d14a324285dbb8ce73d4c7215f1f8d6766;hp=e9da59f54559c192276158a1a9829221b578bcbb;hpb=aecb51e1bbecef1872f9a3bb11856f39fa291f15;p=ghc-hetmet.git diff --git a/rts/RtsUtils.c b/rts/RtsUtils.c index e9da59f..8ef6c0d 100644 --- a/rts/RtsUtils.c +++ b/rts/RtsUtils.c @@ -52,139 +52,6 @@ extern char *ctime_r(const time_t *, char *); #endif /* ----------------------------------------------------------------------------- - Debugging allocator - -------------------------------------------------------------------------- */ - -#if defined(DEBUG) - -typedef struct Allocated_ { - void *addr; - size_t len; - struct Allocated_ *next; -} Allocated; - -static Allocated *allocs = NULL; - -#ifdef THREADED_RTS -static Mutex allocator_mutex; -#endif - -void -initAllocator(void) -{ - Allocated *a; - size_t alloc_size; - -#ifdef THREADED_RTS - initMutex(&allocator_mutex); -#endif - alloc_size = sizeof(Allocated); - if ((a = (Allocated *) malloc(alloc_size)) == NULL) { - /* don't fflush(stdout); WORKAROUND bug in Linux glibc */ - MallocFailHook((W_) alloc_size, "initialising debugging allocator"); - stg_exit(EXIT_INTERNAL_ERROR); - } - a->addr = NULL; - a->len = 0; - a->next = NULL; - allocs = a; -} - -void -shutdownAllocator(void) -{ - Allocated *prev, *a; - - if (allocs == NULL) { - barf("Allocator shutdown requested, but not initialised!"); - } - -#ifdef THREADED_RTS - closeMutex(&allocator_mutex); -#endif - - prev = allocs; - while (1) { - a = prev->next; - free(prev); - if (a == NULL) return; - IF_DEBUG(sanity, - debugBelch("Warning: %ld bytes at %p still allocated at shutdown\n", - (long)a->len, a->addr);) - prev = a; - } -} - -static void addAllocation(void *addr, size_t len) { - Allocated *a; - size_t alloc_size; - - if (allocs != NULL) { - alloc_size = sizeof(Allocated); - if ((a = (Allocated *) malloc(alloc_size)) == NULL) { - /* don't fflush(stdout); WORKAROUND bug in Linux glibc */ - MallocFailHook((W_) alloc_size, - "creating info for debugging allocator"); - stg_exit(EXIT_INTERNAL_ERROR); - } - a->addr = addr; - a->len = len; - ACQUIRE_LOCK(&allocator_mutex); - a->next = allocs->next; - allocs->next = a; - RELEASE_LOCK(&allocator_mutex); - } - else { - /* This doesn't actually help as we haven't looked at the flags - * at the time that it matters (while running constructors) */ - IF_DEBUG(sanity, - debugBelch("Ignoring allocation %p %d as allocs is NULL\n", - addr, (int)len);) - } -} - -static void removeAllocation(void *addr, int overwrite_with_aa) { - Allocated *prev, *a; - - if (addr == NULL) { - barf("Freeing NULL!"); - } - - if (allocs != NULL) { - ACQUIRE_LOCK(&allocator_mutex); - prev = allocs; - a = prev->next; - while (a != NULL) { - if (a->addr == addr) { - prev->next = a->next; - if (overwrite_with_aa) { - memset(addr, 0xaa, a->len); - } - free(a); - RELEASE_LOCK(&allocator_mutex); - return; - } - prev = a; - a = a->next; - } - /* We would like to barf here, but we can't as conc021 - * allocates some stuff in a constructor which then gets freed - * during hs_exit */ - /* barf("Freeing non-allocated memory at %p", addr); */ - IF_DEBUG(sanity, - debugBelch("Warning: Freeing non-allocated memory at %p\n", - addr);) - RELEASE_LOCK(&allocator_mutex); - } - else { - IF_DEBUG(sanity, - debugBelch("Ignoring free of %p as allocs is NULL\n", - addr);) - } -} -#endif - -/* ----------------------------------------------------------------------------- Result-checking malloc wrappers. -------------------------------------------------------------------------- */ @@ -200,9 +67,6 @@ stgMallocBytes (int n, char *msg) MallocFailHook((W_) n, msg); /*msg*/ stg_exit(EXIT_INTERNAL_ERROR); } -#if defined(DEBUG) - addAllocation(space, n2); -#endif return space; } @@ -218,10 +82,6 @@ stgReallocBytes (void *p, int n, char *msg) MallocFailHook((W_) n, msg); /*msg*/ stg_exit(EXIT_INTERNAL_ERROR); } -#if defined(DEBUG) - if (p != NULL) { removeAllocation(p, 0); } - addAllocation(space, n2); -#endif return space; } @@ -235,9 +95,6 @@ stgCallocBytes (int n, int m, char *msg) MallocFailHook((W_) n*m, msg); /*msg*/ stg_exit(EXIT_INTERNAL_ERROR); } -#if defined(DEBUG) - addAllocation(space, (size_t) n * (size_t) m); -#endif return space; } @@ -247,9 +104,6 @@ stgCallocBytes (int n, int m, char *msg) void stgFree(void* p) { -#if defined(DEBUG) - removeAllocation(p, 1); -#endif free(p); } @@ -469,3 +323,18 @@ int rts_isProfiled(void) return 0; #endif } + +// Used for detecting a non-empty FPU stack on x86 (see #4914) +void checkFPUStack(void) +{ +#ifdef x86_HOST_ARCH + static unsigned char buf[108]; + asm("FSAVE %0":"=m" (buf)); + + if(buf[8]!=255 || buf[9]!=255) { + errorBelch("NONEMPTY FPU Stack, TAG = %x %x\n",buf[8],buf[9]); + abort(); + } +#endif +} +