From: matthewc Date: Fri, 22 Nov 2002 06:54:05 +0000 (+0000) Subject: [project @ 2002-11-22 06:54:05 by matthewc] X-Git-Tag: Approx_11550_changesets_converted~1403 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=338be3e67180ff09030e665cb98f748317f46ce6;p=ghc-hetmet.git [project @ 2002-11-22 06:54:05 by matthewc] Update HEAP_ALLOCED implementation for IA64. --- diff --git a/ghc/rts/MBlock.c b/ghc/rts/MBlock.c index 57d113a..590c556 100644 --- a/ghc/rts/MBlock.c +++ b/ghc/rts/MBlock.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: MBlock.c,v 1.38 2002/11/07 14:42:25 simonmar Exp $ + * $Id: MBlock.c,v 1.39 2002/11/22 06:54:05 matthewc Exp $ * * (c) The GHC Team 1998-1999 * @@ -50,13 +50,9 @@ lnat mblocks_allocated = 0; The MBlock Map: provides our implementation of HEAP_ALLOCED() -------------------------------------------------------------------------- */ -StgWord8 mblock_map[4096]; // initially all zeros - -static void -mblockIsHeap (void *p) -{ - mblock_map[((StgWord)p & ~MBLOCK_MASK) >> MBLOCK_SHIFT] = 1; -} +#ifdef MBLOCK_MAP_SIZE +StgWord8 mblock_map[MBLOCK_MAP_SIZE]; // initially all zeros +#endif /* ----------------------------------------------------------------------------- Allocate new mblock(s) @@ -213,7 +209,7 @@ getMBlocks(nat n) // fill in the table for (i = 0; i < n; i++) { - mblockIsHeap( ret + i * MBLOCK_SIZE ); + MARK_HEAP_ALLOCED( ret + i * MBLOCK_SIZE ); } mblocks_allocated += n; diff --git a/ghc/rts/MBlock.h b/ghc/rts/MBlock.h index 3845ca4..c369416 100644 --- a/ghc/rts/MBlock.h +++ b/ghc/rts/MBlock.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: MBlock.h,v 1.15 2002/10/21 11:38:54 simonmar Exp $ + * $Id: MBlock.h,v 1.16 2002/11/22 06:54:05 matthewc Exp $ * * (c) The GHC Team, 1998-1999 * @@ -49,26 +49,34 @@ extern void * getMBlocks(nat n); constant comparison). -------------------------------------------------------------------------- */ -#if SIZEOF_VOID_P == 4 - -// This is the table. Each byte is non-zero if the appropriate MBlock -// in the address space contains heap. extern StgWord8 mblock_map[]; -#define HEAP_ALLOCED(p) \ - ((int)(mblock_map[((StgWord)(p) & ~MBLOCK_MASK) >> MBLOCK_SHIFT])) - -#else // SIZEOF_VOID_P != 4 - -// on a 64-bit machine, we need to extend the above scheme to use a -// 2-level mapping. (ToDo) +#if SIZEOF_VOID_P == 4 +/* On a 32-bit machine a 4KB table is always sufficient */ +# define MBLOCK_MAP_SIZE 4096 +# define MBLOCK_MAP_ENTRY(p) ((StgWord)(p) >> MBLOCK_SHIFT) +# define HEAP_ALLOCED(p) mblock_map[MBLOCK_MAP_ENTRY(p)] +# define MARK_HEAP_ALLOCED(p) (mblock_map[MBLOCK_MAP_ENTRY(p)] = 1) + +#elif defined(ia64_TARGET_ARCH) +/* Instead of trying to cover the whole 64-bit address space (which would + * require a better data structure), we assume that mmap allocates mappings + * from the bottom of region 1, and track some portion of address space from + * there upwards (currently 4GB). */ +# define MBLOCK_MAP_SIZE 4096 +# define MBLOCK_MAP_ENTRY(p) (((StgWord)(p) - (1UL << 61)) >> MBLOCK_SHIFT) +# define HEAP_ALLOCED(p) ((MBLOCK_MAP_ENTRY(p) < MBLOCK_MAP_SIZE) \ + && mblock_map[MBLOCK_MAP_ENTRY(p)]) +# define MARK_HEAP_ALLOCED(p) ((MBLOCK_MAP_ENTRY(p) < MBLOCK_MAP_SIZE) \ + && (mblock_map[MBLOCK_MAP_ENTRY(p)] = 1)) + +#elif defined(TEXT_BEFORE_HEAP) +/* Fall back to old method - assume heap above HEAP_BASE */ +# define HEAP_ALLOCED(p) ((StgPtr)(p) >= (StgPtr)(HEAP_BASE)) +# define MARK_HEAP_ALLOCED(p) do {} while(0) -#ifdef TEXT_BEFORE_HEAP -# define HEAP_ALLOCED(x) ((StgPtr)(x) >= (StgPtr)(HEAP_BASE)) #else -#error HEAP_ALLOCED not defined +# error HEAP_ALLOCED not defined #endif -#endif // SIZEOF_VOID_P != 4 - #endif // __MBLOCK_H__