Merge remote branch 'origin/master'
[ghc-hetmet.git] / includes / Rts.h
index 7358c36..3a6c6f2 100644 (file)
@@ -5,6 +5,9 @@
  * RTS external APIs.  This file declares everything that the GHC RTS
  * exposes externally.
  *
+ * To understand the structure of the RTS headers, see the wiki:
+ *   http://hackage.haskell.org/trac/ghc/wiki/Commentary/SourceTree/Includes
+ *
  * ---------------------------------------------------------------------------*/
 
 #ifndef RTS_H
@@ -45,6 +48,21 @@ extern "C" {
 #define ATTRIBUTE_ALIGNED(n) /*nothing*/
 #endif
 
+// Symbols that are extern, but private to the RTS, are declared
+// with visibility "hidden" to hide them outside the RTS shared
+// library.
+#if defined(HAS_VISIBILITY_HIDDEN)
+#define RTS_PRIVATE  GNUC3_ATTRIBUTE(visibility("hidden"))
+#else
+#define RTS_PRIVATE  /* disabled: RTS_PRIVATE */
+#endif
+
+#if __GNUC__ >= 4
+#define RTS_UNLIKELY(p) __builtin_expect((p),0)
+#else
+#define RTS_UNLIKELY(p) p
+#endif
+
 /* Fix for mingw stat problem (done here so it's early enough) */
 #ifdef mingw32_HOST_OS
 #define __MSVCRT__ 1
@@ -80,10 +98,18 @@ void _assertFail(const char *filename, unsigned int linenum)
        else                                    \
            _assertFail(__FILE__, __LINE__)
 
+#define CHECKM(predicate, msg, ...)             \
+       if (predicate)                          \
+           /*null*/;                           \
+       else                                    \
+            barf(msg, ##__VA_ARGS__)
+
 #ifndef DEBUG
 #define ASSERT(predicate) /* nothing */
+#define ASSERTM(predicate,msg,...) /* nothing */
 #else
 #define ASSERT(predicate) CHECK(predicate)
+#define ASSERTM(predicate,msg,...) CHECKM(predicate,msg,##__VA_ARGS__)
 #endif /* DEBUG */
 
 /* 
@@ -117,9 +143,16 @@ void _assertFail(const char *filename, unsigned int linenum)
 #define FMT_Word64 "lu"
 #define FMT_Int64  "ld"
 #else
+#if defined(mingw32_HOST_OS)
+/* mingw doesn't understand %llu/%lld - it treats them as 32-bit
+   rather than 64-bit */
+#define FMT_Word64 "I64u"
+#define FMT_Int64  "I64d"
+#else
 #define FMT_Word64 "llu"
 #define FMT_Int64  "lld"
 #endif
+#endif
 
 /* -----------------------------------------------------------------------------
    Include everything STG-ish
@@ -165,6 +198,7 @@ void _assertFail(const char *filename, unsigned int linenum)
 #include "rts/Parallel.h"
 #include "rts/Hooks.h"
 #include "rts/Signals.h"
+#include "rts/BlockSignals.h"
 #include "rts/Hpc.h"
 #include "rts/Flags.h"
 #include "rts/Adjustor.h"
@@ -173,14 +207,24 @@ void _assertFail(const char *filename, unsigned int linenum)
 #include "rts/IOManager.h"
 #include "rts/Linker.h"
 #include "rts/Threads.h"
+#include "rts/Ticky.h"
 #include "rts/Timer.h"
 #include "rts/Stable.h"
+#include "rts/TTY.h"
+#include "rts/Utils.h"
+#include "rts/PrimFloat.h"
 
 /* Misc stuff without a home */
 DLL_IMPORT_RTS extern char **prog_argv;        /* so we can get at these from Haskell */
 DLL_IMPORT_RTS extern int    prog_argc;
 DLL_IMPORT_RTS extern char  *prog_name;
 
+#ifdef mingw32_HOST_OS
+// We need these two from Haskell too
+void getWin32ProgArgv(int *argc, wchar_t **argv[]);
+void setWin32ProgArgv(int argc, wchar_t *argv[]);
+#endif
+
 void stackOverflow(void);
 
 void stg_exit(int n) GNU_ATTRIBUTE(__noreturn__);
@@ -263,29 +307,4 @@ TICK_VAR(2)
 }
 #endif
 
-
-/* krc: I put this here because I don't think
-   it needs to be visible externally.
-   It used to be in StgTicky.h, but I got rid
-   of that. */
-
-/* -----------------------------------------------------------------------------
-   The StgEntCounter type - needed regardless of TICKY_TICKY
-   -------------------------------------------------------------------------- */
-
-typedef struct _StgEntCounter {
-  /* 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 */
-    StgInt     entry_count;    /* Trips to fast entry code */
-    StgInt      allocs;         /* number of allocations by this fun */
-    struct _StgEntCounter *link;/* link to chain them all together */
-} StgEntCounter;
-
-
 #endif /* RTS_H */