#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
#define FLEXIBLE_ARRAY 0
#endif
+#if __GNUC__ >= 3
+#define ATTRIBUTE_ALIGNED(n) __attribute__((aligned(n)))
+#else
+#define ATTRIBUTE_ALIGNED(n) /*nothing*/
+#endif
+
/* Fix for mingw stat problem (done here so it's early enough) */
#ifdef mingw32_HOST_OS
#define __MSVCRT__ 1
/* 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_))
+
+#define sizeofW(t) ROUNDUP_BYTES_TO_WDS(sizeof(t))
/*
* It's nice to be able to grep for casts
/* -----------------------------------------------------------------------------
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 (const char *, unsigned int);
-#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 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
-------------------------------------------------------------------------- */
/* Info tables, closures & code fragments defined in the RTS */
#include "StgMiscClosures.h"
-/* Simulated-parallel information */
-#include "GranSim.h"
-
/* Parallel information */
-#include "Parallel.h"
#include "OSThreads.h"
-#include "SMP.h"
-
-/* GNU mp library */
-#include "gmp.h"
+#include "SMPClosureOps.h"
+#include "SpinLock.h"
/* Macros for STG/C code */
#include "Block.h"
#include "ClosureMacros.h"
- /* Ticky-ticky counters */
-#include "TickyCounters.h"
-
/* Runtime-system hooks */
#include "Hooks.h"
#include "RtsMessages.h"
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_sign, W_ *man_high, W_ *man_low, I_ *exp, StgDouble dbl);
+extern void __decodeFloat_Int (I_ *man, I_ *exp, StgFloat flt);
#if defined(WANT_DOTNET_SUPPORT)
#include "DNInvoke.h"
/* 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
-------------------------------------------------------------------------- */
-------------------------------------------------------------------------- */
#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
-------------------------------------------------------------------------- */