From: sebc Date: Thu, 21 Mar 2002 11:24:00 +0000 (+0000) Subject: [project @ 2002-03-21 11:23:59 by sebc] X-Git-Tag: Approx_11550_changesets_converted~2237 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=d182db3a49ecb720293666fb278c1acd54c5b31d;p=ghc-hetmet.git [project @ 2002-03-21 11:23:59 by sebc] Implement Plan C, with correct code to detect the data and text sections for MacOS X. Also add a sanity check in initStorage, to make sure we are able to make the distinction between closures and infotables. --- diff --git a/ghc/rts/Storage.c b/ghc/rts/Storage.c index f1120b0..caadd6f 100644 --- a/ghc/rts/Storage.c +++ b/ghc/rts/Storage.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Storage.c,v 1.59 2002/02/04 20:21:22 sof Exp $ + * $Id: Storage.c,v 1.60 2002/03/21 11:23:59 sebc Exp $ * * (c) The GHC Team, 1998-1999 * @@ -26,6 +26,43 @@ #include "RetainerProfile.h" // for counting memory blocks (memInventory) +#ifdef darwin_TARGET_OS +#include +#include +#include +#include +#include +#include +unsigned long macho_etext = 0; +unsigned long macho_edata = 0; +#define IN_RANGE(base,size,x) (((P_)base) <= ((P_)x) && ((P_)x) < ((P_)((unsigned long)base + size))) +static void macosx_get_memory_layout(void) +{ + vm_address_t address; + vm_size_t size; + struct vm_region_basic_info info; + mach_msg_type_number_t info_count; + mach_port_t object_name; + task_t task = mach_task_self(); + P_ in_text = ((P_*)(&stg_BLACKHOLE_info))[0]; + P_ in_data = (P_)&stg_dummy_ret_closure; + + address = 0; /* VM_MIN_ADDRESS */ + while (1) { + info_count = VM_REGION_BASIC_INFO_COUNT; + if (vm_region(task, &address, &size, VM_REGION_BASIC_INFO, + (vm_region_info_t)&info, &info_count, &object_name) + != KERN_SUCCESS) + break; + if (IN_RANGE(address, size, in_text)) + macho_etext = address + size; + if (IN_RANGE(address, size, in_data)) + macho_edata = address + size; + address += size; + } +} +#endif + StgClosure *caf_list = NULL; bdescr *small_alloc_list; /* allocate()d small objects */ @@ -66,6 +103,30 @@ initStorage( void ) step *stp; generation *gen; +#if defined(darwin_TARGET_OS) + macosx_get_memory_layout(); +#endif + + /* Sanity check to make sure we are able to make the distinction + * between closures and infotables + */ + if (!LOOKS_LIKE_GHC_INFO(&stg_BLACKHOLE_info)) { + barf("LOOKS_LIKE_GHC_INFO+ is incorrectly defined"); + exit(0); + } + if (LOOKS_LIKE_GHC_INFO(&stg_dummy_ret_closure)) { + barf("LOOKS_LIKE_GHC_INFO- is incorrectly defined"); + exit(0); + } + if (LOOKS_LIKE_STATIC_CLOSURE(&stg_BLACKHOLE_info)) { + barf("LOOKS_LIKE_STATIC_CLOSURE- is incorrectly defined"); + exit(0); + } + if (!LOOKS_LIKE_STATIC_CLOSURE(&stg_dummy_ret_closure)) { + barf("LOOKS_LIKE_STATIC_CLOSURE+ is incorrectly defined"); + exit(0); + } + if (RtsFlags.GcFlags.maxHeapSize != 0 && RtsFlags.GcFlags.heapSizeSuggestion > RtsFlags.GcFlags.maxHeapSize) { diff --git a/ghc/rts/Storage.h b/ghc/rts/Storage.h index b6c3731..adf4207 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.42 2002/03/21 11:24:00 sebc Exp $ * * (c) The GHC Team, 1998-1999 * @@ -419,12 +419,24 @@ void printMutableList(generation *gen); 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) ) +#endif /* The HEAP_ALLOCED test below is called FOR EVERY SINGLE CLOSURE * during GC. It needs to be FAST. @@ -539,6 +551,10 @@ 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(USE_MINIINTERPRETER) +#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) @@ -561,8 +577,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(USE_MINIINTERPRETER) + /* Plan C, see above */ +# define LOOKS_LIKE_GHC_INFO(info) IS_CODE_PTR(((P_*)(info))[0]) +#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)