X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Fparser%2Fhschooks.c;h=17c11faeb80c9e84156fb9fda243d33d9f6437a1;hb=845db8182942e006a9164e41e9839adb39f24268;hp=27008397128d230be19684d972a572110c6dcfe6;hpb=6c381e873e222417d9a67aeec77b9555eca7b7a8;p=ghc-hetmet.git diff --git a/ghc/compiler/parser/hschooks.c b/ghc/compiler/parser/hschooks.c index 2700839..17c11fa 100644 --- a/ghc/compiler/parser/hschooks.c +++ b/ghc/compiler/parser/hschooks.c @@ -3,64 +3,89 @@ These routines customise the error messages for various bits of the RTS. They are linked in instead of the defaults. */ -#include -#define W_ unsigned long int -#define I_ long int +#include + +/* For GHC 4.08, we are relying on the fact that RtsFlags has + * compatibile layout with the current version, because we're + * #including the current version of RtsFlags.h below. 4.08 didn't + * ship with its own RtsFlags.h, unfortunately. For later GHC + * versions, we #include the correct RtsFlags.h. + */ +#if __GLASGOW_HASKELL__ < 502 +#include "../includes/Rts.h" +#include "../includes/RtsFlags.h" +#else +#include "Rts.h" +#include "RtsFlags.h" +#endif + +#include "HsFFI.h" + +#ifdef HAVE_UNISTD_H +#include +#endif void -ErrorHdrHook (where) - FILE *where; +defaultsHook (void) { - fprintf(where, "\n"); /* no "Fail: " */ + RtsFlags.GcFlags.heapSizeSuggestion = 6*1024*1024 / BLOCK_SIZE; + RtsFlags.GcFlags.maxStkSize = 8*1024*1024 / sizeof(W_); +#if __GLASGOW_HASKELL__ >= 411 + /* GHC < 4.11 didn't have these */ + RtsFlags.GcFlags.giveStats = COLLECT_GC_STATS; + RtsFlags.GcFlags.statsFile = stderr; +#endif } - void -OutOfHeapHook (request_size, heap_size) - W_ request_size; /* in bytes */ - W_ heap_size; /* in bytes */ +enableTimingStats( void ) /* called from the driver */ { - fprintf(stderr, "GHC's heap exhausted;\nwhile trying to allocate %lu bytes in a %lu-byte heap;\nuse the `-H' option to increase the total heap size.\n", - request_size, - heap_size); +#if __GLASGOW_HASKELL__ >= 411 + RtsFlags.GcFlags.giveStats = ONELINE_GC_STATS; +#endif + /* ignored when bootstrapping with an older GHC */ } void -StackOverflowHook (stack_size) - I_ stack_size; /* in bytes */ +setHeapSize( HsInt size ) { - fprintf(stderr, "GHC stack-space overflow: current size %ld bytes.\nUse the `-K' option to increase it.\n", stack_size); + RtsFlags.GcFlags.heapSizeSuggestion = size / BLOCK_SIZE; + if (RtsFlags.GcFlags.maxHeapSize != 0 && + RtsFlags.GcFlags.heapSizeSuggestion > RtsFlags.GcFlags.maxHeapSize) { + RtsFlags.GcFlags.maxHeapSize = RtsFlags.GcFlags.heapSizeSuggestion; + } } -#if 0 -/* nothing to add here, really */ void -MallocFailHook (request_size, msg) - I_ request_size; /* in bytes */ - char *msg; +OutOfHeapHook (unsigned long request_size/* always zero these days */, + unsigned long heap_size) + /* both in bytes */ { - fprintf(stderr, "malloc: failed on request for %lu bytes\n", request_size); + fprintf(stderr, "GHC's heap exhausted: current limit is %lu bytes;\nUse the `-H' option to increase the total heap size.\n", + heap_size); } -#endif /* 0 */ void -PatErrorHdrHook (where) - FILE *where; +StackOverflowHook (unsigned long stack_size) /* in bytes */ { - fprintf(where, "\n*** Pattern-matching error within GHC!\n\nThis is a compiler bug; please report it to glasgow-haskell-bugs@dcs.glasgow.ac.uk.\n\nFail: "); + fprintf(stderr, "GHC stack-space overflow: current limit is %ld bytes.\nUse the `-K' option to increase it.\n", stack_size); } -void -PreTraceHook (where) - FILE *where; +HsInt +ghc_strlen( HsAddr a ) { - fprintf(where, "\n"); /* not "Trace On" */ + return (strlen((char *)a)); } -void -PostTraceHook (where) - FILE *where; +HsInt +ghc_memcmp( HsAddr a1, HsAddr a2, HsInt len ) +{ + return (memcmp((char *)a1, a2, len)); +} + +HsInt +ghc_memcmp_off( HsAddr a1, HsInt i, HsAddr a2, HsInt len ) { - fprintf(where, "\n"); /* not "Trace Off" */ + return (memcmp((char *)a1 + i, a2, len)); }