Cope with libraries in libraries/foo/bar rather than just libraries/foo
[ghc-hetmet.git] / includes / Rts.h
index 59edc09..610cd70 100644 (file)
@@ -18,6 +18,9 @@ extern "C" {
 #endif
 #include "Stg.h"
 
+// ToDo: move RtsExternal stuff elsewhere
+#include "RtsExternal.h"
+
 // Turn off inlining when debugging - it obfuscates things
 #ifdef DEBUG
 # undef  STATIC_INLINE
@@ -107,6 +110,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
    -------------------------------------------------------------------------- */
@@ -142,10 +168,15 @@ extern void _assertFail (const char *, unsigned int);
 /* Parallel information */
 #include "Parallel.h"
 #include "OSThreads.h"
-#include "SMP.h"
+#include "SMPClosureOps.h"
+#include "SpinLock.h"
 
 /* GNU mp library */
+#if defined(HAVE_FRAMEWORK_GMP)
+#include <GMP/gmp.h>
+#else
 #include "gmp.h"
+#endif
 
 /* Macros for STG/C code */
 #include "Block.h"
@@ -175,6 +206,8 @@ extern void stackOverflow(void);
 
 extern void      __decodeDouble (MP_INT *man, I_ *_exp, StgDouble dbl);
 extern void      __decodeFloat  (MP_INT *man, I_ *_exp, StgFloat flt);
+extern void      __decodeDouble_2Int (I_ *man_high, I_ *man_low, I_ *exp, StgDouble dbl);
+extern void      __decodeFloat_Int (I_ *man, I_ *exp, StgFloat flt);
 
 #if defined(WANT_DOTNET_SUPPORT)
 #include "DNInvoke.h"
@@ -203,6 +236,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 +264,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 +324,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 */