* 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
#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(mingw32_HOST_OS)
+#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
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 */
/*
#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
#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"
#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 */