Merge remote branch 'origin/master'
[ghc-hetmet.git] / includes / Rts.h
index 1bfb37a..3a6c6f2 100644 (file)
@@ -51,21 +51,13 @@ extern "C" {
 // Symbols that are extern, but private to the RTS, are declared
 // with visibility "hidden" to hide them outside the RTS shared
 // library.
-#if !defined(mingw32_HOST_OS)
+#if defined(HAS_VISIBILITY_HIDDEN)
 #define RTS_PRIVATE  GNUC3_ATTRIBUTE(visibility("hidden"))
 #else
 #define RTS_PRIVATE  /* disabled: RTS_PRIVATE */
 #endif
 
-#if __GNUC__ > 4
-#define BEGIN_RTS_PRIVATE #pragma GCC visibility push(hidden)
-#define END_RTS_PRIVATE   #pragma GCC visibility pop
-#else
-#define BEGIN_RTS_PRIVATE /* disabled: BEGIN_RTS_PRIVATE */
-#define END_RTS_PRIVATE   /* disabled: END_RTS_PRIVATE */
-#endif
-
-#if __GNUC__ > 4
+#if __GNUC__ >= 4
 #define RTS_UNLIKELY(p) __builtin_expect((p),0)
 #else
 #define RTS_UNLIKELY(p) p
@@ -106,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 */
 
 /* 
@@ -143,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
@@ -212,6 +219,12 @@ 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__);