Commit 73637ad6 authored by Simon Marlow's avatar Simon Marlow

+RTS -xbXXXXX sets the "heap base" to 0xXXXXXX

When debugging the GC and storage manager we often want repeated runs
of the program to allocate memory at the same addresses, so that we
can set watch points.  Unfortunately the OS doesn't always give us
memory at predictable addresses.  This flag gives the OS a hint as to
where we would like our memory allocated.  Previously I did this by
changing the HEAP_BASE setting in MBlock.h and recompiling, this patch
just adds a flag so I don't have to recompile.
parent e1ddf51a
......@@ -43,6 +43,8 @@ struct GC_FLAGS {
rtsBool frontpanel;
int idleGCDelayTime; /* in milliseconds */
StgWord heapBase; /* address to ask the OS for memory */
};
struct DEBUG_FLAGS {
......
......@@ -150,6 +150,18 @@ void initRtsFlagsDefaults(void)
#endif
RtsFlags.GcFlags.idleGCDelayTime = 300; /* millisecs */
#if osf3_HOST_OS
/* ToDo: Perhaps by adjusting this value we can make linking without
* -static work (i.e., not generate a core-dumping executable)? */
# if SIZEOF_VOID_P == 8
RtsFlags.GcFlags.heapBase = 0x180000000L;
# else
# error I have no idea where to begin the heap on a non-64-bit osf3 machine.
# endif
#else
RtsFlags.GcFlags.heapBase = 0; /* means don't care */
#endif
#ifdef DEBUG
RtsFlags.DebugFlags.scheduler = rtsFalse;
RtsFlags.DebugFlags.interpreter = rtsFalse;
......@@ -1192,6 +1204,16 @@ error = rtsTrue;
error = rtsTrue;
break;
case 'b': /* heapBase in hex; undocumented */
if (rts_argv[arg][3] != '\0') {
RtsFlags.GcFlags.heapBase
= strtol(rts_argv[arg]+3, (char **) NULL, 16);
} else {
errorBelch("-xb: requires argument");
error = rtsTrue;
}
break;
case 'c': /* Debugging tool: show current cost centre on an exception */
PROFILING_BUILD_ONLY(
RtsFlags.ProfFlags.showCCSOnException = rtsTrue;
......
......@@ -49,6 +49,18 @@
lnat mblocks_allocated = 0;
#if !defined(mingw32_HOST_OS) && !defined(cygwin32_HOST_OS)
static caddr_t next_request = 0;
#endif
void
initMBlocks(void)
{
#if !defined(mingw32_HOST_OS) && !defined(cygwin32_HOST_OS)
next_request = (caddr_t)RtsFlags.GcFlags.heapBase;
#endif
}
/* -----------------------------------------------------------------------------
The MBlock Map: provides our implementation of HEAP_ALLOCED()
-------------------------------------------------------------------------- */
......@@ -258,7 +270,6 @@ gen_map_mblocks (lnat size)
void *
getMBlocks(nat n)
{
static caddr_t next_request = (caddr_t)HEAP_BASE;
caddr_t ret;
lnat size = MBLOCK_SIZE * n;
nat i;
......
......@@ -11,26 +11,11 @@
extern lnat RTS_VAR(mblocks_allocated);
extern void initMBlocks(void);
extern void * getMBlock(void);
extern void * getMBlocks(nat n);
extern void freeAllMBlocks(void);
#if osf3_HOST_OS
/* ToDo: Perhaps by adjusting this value we can make linking without
* -static work (i.e., not generate a core-dumping executable)? */
#if SIZEOF_VOID_P == 8
#define HEAP_BASE 0x180000000L
#else
#error I have no idea where to begin the heap on a non-64-bit osf3 machine.
#endif
#else
// we're using the generic method
#define HEAP_BASE 0
#endif
/* -----------------------------------------------------------------------------
The HEAP_ALLOCED() test.
......
......@@ -115,6 +115,8 @@ initStorage( void )
return;
}
initMBlocks();
/* Sanity check to make sure the LOOKS_LIKE_ macros appear to be
* doing something reasonable.
*/
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment