X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=includes%2FRts.h;h=df8cb469009d5a521b1edb3f8004aa318d75104b;hb=7ea43827e739555c23f2b802a6a5eaf2a65570ae;hp=59edc09e83ab5b8df996b45621f5db0f8090bc23;hpb=5ddee764beb312933256096d03df7c3ec47ac452;p=ghc-hetmet.git diff --git a/includes/Rts.h b/includes/Rts.h index 59edc09..df8cb46 100644 --- a/includes/Rts.h +++ b/includes/Rts.h @@ -107,6 +107,29 @@ extern void _assertFail (const char *, unsigned int); #define FMT_Int64 "lld" #endif +/* + * Macros for untagging and retagging closure pointers + * For more information look at the comments in Cmm.h + */ + +static inline StgWord +GET_CLOSURE_TAG(StgClosure * p) +{ + return (StgWord)p & TAG_MASK; +} + +static inline StgClosure * +UNTAG_CLOSURE(StgClosure * p) +{ + return (StgClosure*)((StgWord)p & ~TAG_MASK); +} + +static inline StgClosure * +TAG_CLOSURE(StgWord tag,StgClosure * p) +{ + return (StgClosure*)((StgWord)p | tag); +} + /* ----------------------------------------------------------------------------- Include everything STG-ish -------------------------------------------------------------------------- */ @@ -145,7 +168,11 @@ extern void _assertFail (const char *, unsigned int); #include "SMP.h" /* GNU mp library */ +#if defined(HAVE_FRAMEWORK_GMP) +#include +#else #include "gmp.h" +#endif /* Macros for STG/C code */ #include "Block.h" @@ -203,6 +230,23 @@ extern void stg_exit(int n) GNU_ATTRIBUTE(__noreturn__); /* declarations for runtime flags/values */ #define MAX_RTS_ARGS 32 +#ifdef DEBUG +#define TICK_VAR(arity) \ + extern StgInt SLOW_CALLS_##arity; \ + extern StgInt RIGHT_ARITY_##arity; \ + extern StgInt TAGGED_PTR_##arity; + +#define TICK_VAR_INI(arity) \ + StgInt SLOW_CALLS_##arity = 1; \ + StgInt RIGHT_ARITY_##arity = 1; \ + StgInt TAGGED_PTR_##arity = 0; + +extern StgInt TOTAL_CALLS; + +TICK_VAR(1) +TICK_VAR(2) +#endif + /* ----------------------------------------------------------------------------- Assertions and Debuggery -------------------------------------------------------------------------- */ @@ -214,7 +258,11 @@ extern void stg_exit(int n) GNU_ATTRIBUTE(__noreturn__); -------------------------------------------------------------------------- */ #ifdef DEBUG +#if IN_STG_CODE +#define IF_DEBUG(c,s) if (RtsFlags[0].DebugFlags.c) { s; } +#else #define IF_DEBUG(c,s) if (RtsFlags.DebugFlags.c) { s; } +#endif #else #define IF_DEBUG(c,s) doNothing() #endif @@ -270,11 +318,11 @@ extern void stg_exit(int n) GNU_ATTRIBUTE(__noreturn__); -------------------------------------------------------------------------- */ typedef struct _StgEntCounter { - /* krc: StgWord32, not StgWord16, in order to match the code - generator, which doesn't generate anything of that type. */ - StgWord32 registeredp; /* 0 == no, 1 == yes */ - StgWord32 arity; /* arity (static info) */ - StgWord32 stk_args; /* # of args off stack */ + /* Using StgWord for everything, becuase both the C and asm code + generators make trouble if you try to pack things tighter */ + StgWord registeredp; /* 0 == no, 1 == yes */ + StgInt arity; /* arity (static info) */ + StgInt stk_args; /* # of args off stack */ /* (rest of args are in registers) */ char *str; /* name of the thing */ char *arg_kinds; /* info about the args types */