/* -----------------------------------------------------------------------------
*
- * (c) The GHC Team, 1998-2004
+ * (c) The GHC Team, 1998-2009
*
- * Top-level include file for the RTS itself
+ * 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
*
* ---------------------------------------------------------------------------*/
#endif
#include "Stg.h"
-#include "RtsTypes.h"
+#include "HsFFI.h"
+#include "RtsAPI.h"
+
+// Turn off inlining when debugging - it obfuscates things
+#ifdef DEBUG
+# undef STATIC_INLINE
+# define STATIC_INLINE static
+#endif
+
+#include "rts/Types.h"
#if __GNUC__ >= 3
/* Assume that a flexible array member at the end of a struct
#define FLEXIBLE_ARRAY 0
#endif
+#if __GNUC__ >= 3
+#define ATTRIBUTE_ALIGNED(n) __attribute__((aligned(n)))
+#else
+#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 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
+#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
#endif
+/* Needed to get the macro version of errno on some OSs, and also to
+ get prototypes for the _r versions of C library functions. */
+#ifndef _REENTRANT
+#define _REENTRANT 1
+#endif
+
/*
* We often want to know the size of something in units of an
* StgWord... (rounded up, of course!)
*/
-#define sizeofW(t) ((sizeof(t)+sizeof(W_)-1)/sizeof(W_))
+#define ROUNDUP_BYTES_TO_WDS(n) (((n) + sizeof(W_) - 1) / sizeof(W_))
-/*
- * It's nice to be able to grep for casts
- */
-#define stgCast(ty,e) ((ty)(e))
+#define sizeofW(t) ROUNDUP_BYTES_TO_WDS(sizeof(t))
/* -----------------------------------------------------------------------------
Assertions and Debuggery
- -------------------------------------------------------------------------- */
-#ifndef DEBUG
-#define ASSERT(predicate) /* nothing */
-#else
+ CHECK(p) evaluates p and terminates with an error if p is false
+ ASSERT(p) like CHECK(p) if DEBUG is on, otherwise a no-op
+ -------------------------------------------------------------------------- */
-extern void _assertFail (char *, unsigned int);
+void _assertFail(const char *filename, unsigned int linenum)
+ GNUC3_ATTRIBUTE(__noreturn__);
-#define ASSERT(predicate) \
+#define CHECK(predicate) \
if (predicate) \
/*null*/; \
else \
_assertFail(__FILE__, __LINE__)
+
+#ifndef DEBUG
+#define ASSERT(predicate) /* nothing */
+#else
+#define ASSERT(predicate) CHECK(predicate)
#endif /* DEBUG */
/*
#define USED_IF_NOT_THREADS
#endif
+/*
+ * Getting printf formats right for platform-dependent typedefs
+ */
+#if SIZEOF_LONG == 8
+#define FMT_Word64 "lu"
+#define FMT_Int64 "ld"
+#else
+#define FMT_Word64 "llu"
+#define FMT_Int64 "lld"
+#endif
+
/* -----------------------------------------------------------------------------
Include everything STG-ish
-------------------------------------------------------------------------- */
*/
#include <stdlib.h>
+#include "rts/Config.h"
+
/* Global constaints */
-#include "Constants.h"
+#include "rts/Constants.h"
/* Profiling information */
-#include "StgProf.h"
-#include "StgLdvProf.h"
-
-/* Storage format definitions */
-#include "StgFun.h"
-#include "Closures.h"
-#include "Liveness.h"
-#include "ClosureTypes.h"
-#include "InfoTables.h"
-#include "TSO.h"
-
-/* Info tables, closures & code fragments defined in the RTS */
-#include "StgMiscClosures.h"
-
-/* Simulated-parallel information */
-#include "GranSim.h"
+#include "rts/prof/CCS.h"
+#include "rts/prof/LDV.h"
/* Parallel information */
-#include "Parallel.h"
-#include "OSThreads.h"
-#include "SMP.h"
+#include "rts/OSThreads.h"
+#include "rts/SpinLock.h"
-/* STG/Optimised-C related stuff */
-#include "Block.h"
+#include "rts/Messages.h"
-/* GNU mp library */
-#include "gmp.h"
-
-/* Macros for STG/C code */
-#include "ClosureMacros.h"
-#include "StgTicky.h"
-#include "Stable.h"
-
-/* Runtime-system hooks */
-#include "Hooks.h"
-#include "RtsMessages.h"
-
-#include "ieee-flpt.h"
-
-#include "Signals.h"
+/* Storage format definitions */
+#include "rts/storage/FunTypes.h"
+#include "rts/storage/InfoTables.h"
+#include "rts/storage/Closures.h"
+#include "rts/storage/Liveness.h"
+#include "rts/storage/ClosureTypes.h"
+#include "rts/storage/TSO.h"
+#include "stg/MiscClosures.h" /* InfoTables, closures etc. defined in the RTS */
+#include "rts/storage/SMPClosureOps.h"
+#include "rts/storage/Block.h"
+#include "rts/storage/ClosureMacros.h"
+#include "rts/storage/MBlock.h"
+#include "rts/storage/GC.h"
+
+/* Other RTS external APIs */
+#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/FileLock.h"
+#include "rts/Globals.h"
+#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;
-extern void stackOverflow(void);
+void stackOverflow(void);
-extern void __decodeDouble (MP_INT *man, I_ *_exp, StgDouble dbl);
-extern void __decodeFloat (MP_INT *man, I_ *_exp, StgFloat flt);
+void stg_exit(int n) GNU_ATTRIBUTE(__noreturn__);
-#if defined(WANT_DOTNET_SUPPORT)
-#include "DNInvoke.h"
+#ifndef mingw32_HOST_OS
+int stg_sig_install (int, int, void *);
#endif
-/* Initialising the whole adjustor thunk machinery. */
-extern void initAdjustor(void);
-
-extern void stg_exit(int n) GNU_ATTRIBUTE(__noreturn__);
-
/* -----------------------------------------------------------------------------
RTS Exit codes
-------------------------------------------------------------------------- */
/* declarations for runtime flags/values */
#define MAX_RTS_ARGS 32
-/* -----------------------------------------------------------------------------
- Assertions and Debuggery
- -------------------------------------------------------------------------- */
+#ifdef DEBUG
+#define TICK_VAR(arity) \
+ extern StgInt SLOW_CALLS_##arity; \
+ extern StgInt RIGHT_ARITY_##arity; \
+ extern StgInt TAGGED_PTR_##arity;
-#define IF_RTSFLAGS(c,s) if (RtsFlags.c) { s; }
+extern StgInt TOTAL_CALLS;
+
+TICK_VAR(1)
+TICK_VAR(2)
+#endif
/* -----------------------------------------------------------------------------
Assertions and Debuggery
-------------------------------------------------------------------------- */
+#define IF_RTSFLAGS(c,s) if (RtsFlags.c) { s; }
+
#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
#define DEBUG_ONLY(s) doNothing()
#endif
-#if defined(GRAN) && defined(DEBUG)
-#define IF_GRAN_DEBUG(c,s) if (RtsFlags.GranFlags.Debug.c) { s; }
-#else
-#define IF_GRAN_DEBUG(c,s) doNothing()
-#endif
-
-#if defined(PAR) && defined(DEBUG)
-#define IF_PAR_DEBUG(c,s) if (RtsFlags.ParFlags.Debug.c) { s; }
-#else
-#define IF_PAR_DEBUG(c,s) doNothing()
-#endif
-
/* -----------------------------------------------------------------------------
Useful macros and inline functions
-------------------------------------------------------------------------- */