X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FStorage.h;h=6a7c738de72cf3595d861c563bd08d0750ea4f07;hb=6942766ac64f71b57c85a4069900b383495e2bdb;hp=b6c3731dd953c51e640c8b448b8e187b46de659f;hpb=4acbbe8a286a8c040c335aec7518bb142fd22505;p=ghc-hetmet.git diff --git a/ghc/rts/Storage.h b/ghc/rts/Storage.h index b6c3731..6a7c738 100644 --- a/ghc/rts/Storage.h +++ b/ghc/rts/Storage.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Storage.h,v 1.41 2002/02/14 17:21:50 sof Exp $ + * $Id: Storage.h,v 1.45 2002/10/21 11:38:54 simonmar Exp $ * * (c) The GHC Team, 1998-1999 * @@ -412,34 +412,32 @@ void printMutableList(generation *gen); #undef TEXT_BEFORE_HEAP -#ifndef mingw32_TARGET_OS +#if !defined(mingw32_TARGET_OS) && !defined(cygwin32_TARGET_OS) #define TEXT_BEFORE_HEAP 1 #endif extern void* TEXT_SECTION_END_MARKER_DECL; extern void* DATA_SECTION_END_MARKER_DECL; +#ifdef darwin_TARGET_OS +extern unsigned long macho_etext; +extern unsigned long macho_edata; +#define IS_CODE_PTR(p) ( ((P_)(p) < (P_)macho_etext) \ + || is_dynamically_loaded_code_or_rodata_ptr((char *)p) ) +#define IS_DATA_PTR(p) ( ((P_)(p) >= (P_)macho_etext && \ + (P_)(p) < (P_)macho_edata) \ + || is_dynamically_loaded_rwdata_ptr((char *)p) ) +#define IS_USER_PTR(p) ( ((P_)(p) >= (P_)macho_edata) \ + && is_not_dynamically_loaded_ptr((char *)p) ) +#else /* Take into account code sections in dynamically loaded object files. */ #define IS_DATA_PTR(p) ( ((P_)(p) >= (P_)&TEXT_SECTION_END_MARKER && \ (P_)(p) < (P_)&DATA_SECTION_END_MARKER) \ || is_dynamically_loaded_rwdata_ptr((char *)p) ) #define IS_USER_PTR(p) ( ((P_)(p) >= (P_)&DATA_SECTION_END_MARKER) \ && is_not_dynamically_loaded_ptr((char *)p) ) - -/* The HEAP_ALLOCED test below is called FOR EVERY SINGLE CLOSURE - * during GC. It needs to be FAST. - * - * BEWARE: when we're dynamically loading code (for GHCi), make sure - * that we don't load any code above HEAP_BASE, or this test won't work. - */ -#ifdef TEXT_BEFORE_HEAP -# define HEAP_ALLOCED(x) ((StgPtr)(x) >= (StgPtr)(HEAP_BASE)) -#else -/* mingw, really */ -# define HEAP_ALLOCED(x) (is_heap_alloced(x)) #endif - /* -------------------------------------------------------------------------- Macros for distinguishing data pointers from code pointers -------------------------------------------------------------------------- @@ -539,9 +537,17 @@ extern void* DATA_SECTION_END_MARKER_DECL; (MAX_INTLIKE-MIN_INTLIKE) * sizeof(StgIntCharlikeClosure)) ) #define LOOKS_LIKE_STATIC_CLOSURE(r) (((*(((unsigned long *)(r))-1)) == 0) || IS_CHARLIKE_CLOSURE(r) || IS_INTLIKE_CLOSURE(r)) + +#elif defined(darwin_TARGET_OS) && !defined(TABLES_NEXT_TO_CODE) + +#define LOOKS_LIKE_STATIC(r) (!(HEAP_ALLOCED(r))) +#define LOOKS_LIKE_STATIC_CLOSURE(r) (IS_DATA_PTR(r) && !LOOKS_LIKE_GHC_INFO(r)) + #else + #define LOOKS_LIKE_STATIC(r) IS_DATA_PTR(r) #define LOOKS_LIKE_STATIC_CLOSURE(r) IS_DATA_PTR(r) + #endif @@ -561,8 +567,13 @@ extern void* DATA_SECTION_END_MARKER_DECL; /* LOOKS_LIKE_GHC_INFO is called moderately often during GC, but * Certainly not as often as HEAP_ALLOCED. */ +#if defined(darwin_TARGET_OS) && !defined(TABLES_NEXT_TO_CODE) + /* Plan C, see above */ +#define LOOKS_LIKE_GHC_INFO(info) IS_CODE_PTR(((StgInfoTable *)info).entry) +#else #define LOOKS_LIKE_GHC_INFO(info) (!HEAP_ALLOCED(info) \ && !LOOKS_LIKE_STATIC_CLOSURE(info)) +#endif /* ----------------------------------------------------------------------------- Macros for calculating how big a closure will be (used during allocation)