#endif
#include "Stg.h"
+// Turn off inlining when debugging - it obfuscates things
+#ifdef DEBUG
+# undef STATIC_INLINE
+# define STATIC_INLINE static
+#endif
+
#include "RtsTypes.h"
#if __GNUC__ >= 3
#define ASSERT(predicate) /* nothing */
#else
-extern void _assertFail (char *, unsigned int);
+extern void _assertFail (const char *, unsigned int);
#define ASSERT(predicate) \
if (predicate) \
#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
+
+/*
+ * 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
-------------------------------------------------------------------------- */
#include "OSThreads.h"
#include "SMP.h"
-/* STG/Optimised-C related stuff */
-#include "Block.h"
-
/* GNU mp library */
+#if defined(HAVE_FRAMEWORK_GMP)
+#include <GMP/gmp.h>
+#else
#include "gmp.h"
+#endif
/* Macros for STG/C code */
+#include "Block.h"
#include "ClosureMacros.h"
-#include "StgTicky.h"
-#include "Stable.h"
+
+ /* Ticky-ticky counters */
+#include "TickyCounters.h"
/* Runtime-system hooks */
#include "Hooks.h"
#include "RtsMessages.h"
+/* for StablePtr/getStablePtr/deRefStablePtr */
+#include "Storage.h"
+#include "Stable.h"
+
#include "ieee-flpt.h"
#include "Signals.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
}
#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 */