/* ----------------------------------------------------------------------------
- * $Id: Constants.h,v 1.18 2001/10/03 13:57:42 simonmar Exp $
+ * $Id: Constants.h,v 1.28 2005/02/10 13:02:03 simonmar Exp $
*
- * (c) The GHC Team, 1998-1999
+ * (c) The GHC Team, 1998-2002
*
* Constants
*
/* -----------------------------------------------------------------------------
Minimum closure sizes
- Here We define the minimum size for updatable closures. This must be at
- least 2, to allow for cons cells and linked indirections. All updates
+ Here we define the minimum size for updatable closures. All updates
will be performed on closures of this size. For non-updatable closures
the minimum size is 1 to allow for a forwarding pointer.
- Linked indirections are UPD_OLDGEN things: see Closures.h
+ When we used to keep the mutable list threaded through closures on
+ the heap, MIN_UPD_SIZE used to be 2. Now it's 1.
o MIN_UPD_SIZE doesn't apply to stack closures, static closures
or non-updateable objects like PAPs or CONSTRs
o EVACUATED
-------------------------------------------------------------------------- */
-#define MIN_UPD_SIZE 2
+#define MIN_UPD_SIZE 1
#define MIN_NONUPD_SIZE 1
/* -----------------------------------------------------------------------------
Constants to do with specialised closure types.
-------------------------------------------------------------------------- */
-/* We have some pre-compiled selector thunks defined in
- * StgSelectors.hc in the runtime system. This constant defines the
- * highest selectee index that we can replace with a reference to the
- * pre-compiled code.
+/* We have some pre-compiled selector thunks defined in rts/StgStdThunks.hc.
+ * This constant defines the highest selectee index that we can replace with a
+ * reference to the pre-compiled code.
*/
#define MAX_SPEC_SELECTEE_SIZE 15
* space.
*/
-#define MAX_SPEC_AP_SIZE 8
+#define MAX_SPEC_AP_SIZE 7
/* Specialised FUN/THUNK/CONSTR closure types */
#define MAX_SPEC_FUN_SIZE 2
#define MAX_SPEC_CONSTR_SIZE 2
+/* Range of built-in table of static small int-like and char-like closures.
+ *
+ * NB. This corresponds with the number of actual INTLIKE/CHARLIKE
+ * closures defined in rts/StgMiscClosures.cmm.
+ */
+#define MAX_INTLIKE 16
+#define MIN_INTLIKE (-16)
+
+#define MAX_CHARLIKE 255
+#define MIN_CHARLIKE 0
+
/* -----------------------------------------------------------------------------
STG Registers.
#define MAX_VANILLA_REG 8
#define MAX_FLOAT_REG 4
#define MAX_DOUBLE_REG 2
-/* register is only used for returning (unboxed) 64-bit vals */
#define MAX_LONG_REG 1
-/*---- Maximum number of constructors in a data type for direct-returns. */
+/* -----------------------------------------------------------------------------
+ * Maximum number of constructors in a data type for direct-returns.
+ *
+ * NB. There are various places that assume the value of this
+ * constant, such as the polymorphic return frames for updates
+ * (stg_upd_frame_info) and catch frames (stg_catch_frame_info).
+ * -------------------------------------------------------------------------- */
#define MAX_VECTORED_RTN 8
-/*---- Range of built-in table of static small int-like and char-like closures. */
-
-#define MAX_INTLIKE 16
-#define MIN_INTLIKE (-16)
-
-#define MAX_CHARLIKE 255
-#define MIN_CHARLIKE 0
-
-/* You can change these constants (I hope) but be sure to modify
- rts/StgMiscClosures.hs accordingly. */
-
-/*---- Minimum number of words left in heap after GC to carry on */
-
-#define HEAP_HWM_WORDS 1024
-
/* -----------------------------------------------------------------------------
Semi-Tagging constants
/* -----------------------------------------------------------------------------
How much C stack to reserve for local temporaries when in the STG
- world. Used in StgRun.S and StgCRun.c.
+ world. Used in StgCRun.c.
-------------------------------------------------------------------------- */
#define RESERVED_C_STACK_BYTES (2048 * SIZEOF_LONG)
This must be large enough to accomodate the largest stack frame
pushed in one of the heap check fragments in HeapStackCheck.hc
- (ie. currently the generic heap checks - 19 words).
+ (ie. currently the generic heap checks - 3 words for StgRetDyn,
+ 18 words for the saved registers, see StgMacros.h).
+
+ In the event of an unboxed tuple or let-no-escape stack/heap check
+ failure, there will be other words on the stack which are covered
+ by the RET_DYN frame. These will have been accounted for by stack
+ checks however, so we don't need to allow for them here.
-------------------------------------------------------------------------- */
-#define RESERVED_STACK_WORDS 19
+#define RESERVED_STACK_WORDS 21
/* -----------------------------------------------------------------------------
Storage manager constants
/* The size of a megablock (2^MBLOCK_SHIFT bytes) */
#define MBLOCK_SHIFT 20
-/* the largest size an object can be before we give it a block of its
- * own and treat it as an immovable object during GC, expressed as a
- * fraction of BLOCK_SIZE.
+/* -----------------------------------------------------------------------------
+ Bitmap/size fields (used in info tables)
+ -------------------------------------------------------------------------- */
+
+/* In a 32-bit bitmap field, we use 5 bits for the size, and 27 bits
+ * for the bitmap. If the bitmap requires more than 27 bits, then we
+ * store it in a separate array, and leave a pointer in the bitmap
+ * field. On a 64-bit machine, the sizes are extended accordingly.
*/
-#define LARGE_OBJECT_THRESHOLD ((nat)(BLOCK_SIZE * 8 / 10))
+#if SIZEOF_VOID_P == 4
+#define BITMAP_SIZE_MASK 0x1f
+#define BITMAP_BITS_SHIFT 5
+#elif SIZEOF_VOID_P == 8
+#define BITMAP_SIZE_MASK 0x3f
+#define BITMAP_BITS_SHIFT 6
+#else
+#error unknown SIZEOF_VOID_P
+#endif
-#endif /* CONSTANTS_H */
+/* -----------------------------------------------------------------------------
+ Lag/Drag/Void constants
+ -------------------------------------------------------------------------- */
+
+/*
+ An LDV word is divided into 3 parts: state bits (LDV_STATE_MASK), creation
+ time bits (LDV_CREATE_MASK), and last use time bits (LDV_LAST_MASK).
+ */
+#if SIZEOF_VOID_P == 8
+#define LDV_SHIFT 30
+#define LDV_STATE_MASK 0x1000000000000000
+#define LDV_CREATE_MASK 0x0FFFFFFFC0000000
+#define LDV_LAST_MASK 0x000000003FFFFFFF
+#define LDV_STATE_CREATE 0x0000000000000000
+#define LDV_STATE_USE 0x1000000000000000
+#else
+#define LDV_SHIFT 15
+#define LDV_STATE_MASK 0x40000000
+#define LDV_CREATE_MASK 0x3FFF8000
+#define LDV_LAST_MASK 0x00007FFF
+#define LDV_STATE_CREATE 0x00000000
+#define LDV_STATE_USE 0x40000000
+#endif // SIZEOF_VOID_P
+
+/* -----------------------------------------------------------------------------
+ TSO related constants
+ -------------------------------------------------------------------------- */
+
+/*
+ * Constants for the what_next field of a TSO, which indicates how it
+ * is to be run.
+ */
+#define ThreadRunGHC 1 /* return to address on top of stack */
+#define ThreadInterpret 2 /* interpret this thread */
+#define ThreadKilled 3 /* thread has died, don't run it */
+#define ThreadRelocated 4 /* thread has moved, link points to new locn */
+#define ThreadComplete 5 /* thread has finished */
+
+/*
+ * Constants for the why_blocked field of a TSO
+ */
+#define NotBlocked 0
+#define BlockedOnMVar 1
+#define BlockedOnBlackHole 2
+#define BlockedOnException 3
+#define BlockedOnRead 4
+#define BlockedOnWrite 5
+#define BlockedOnDelay 6
+#define BlockedOnSTM 7
+
+/* Win32 only: */
+#define BlockedOnDoProc 8
+
+/* Only relevant for PAR: */
+ /* blocked on a remote closure represented by a Global Address: */
+#define BlockedOnGA 9
+ /* same as above but without sending a Fetch message */
+#define BlockedOnGA_NoSend 10
+/* Only relevant for RTS_SUPPORTS_THREADS: */
+#define BlockedOnCCall 11
+#define BlockedOnCCall_NoUnblockExc 12
+ /* same as above but don't unblock async exceptions in resumeThread() */
+
+/*
+ * These constants are returned to the scheduler by a thread that has
+ * stopped for one reason or another. See typedef StgThreadReturnCode
+ * in TSO.h.
+ */
+#define HeapOverflow 1 /* might also be StackOverflow */
+#define StackOverflow 2
+#define ThreadYielding 3
+#define ThreadBlocked 4
+#define ThreadFinished 5
+
+/* -----------------------------------------------------------------------------
+ RET_DYN stack frames
+ -------------------------------------------------------------------------- */
+/* VERY MAGIC CONSTANTS!
+ * must agree with code in HeapStackCheck.c, stg_gen_chk, and
+ * RESERVED_STACK_WORDS in Constants.h.
+ */
+#define RET_DYN_BITMAP_SIZE 8
+#define RET_DYN_NONPTR_REGS_SIZE 10
+
+/* Sanity check that RESERVED_STACK_WORDS is reasonable. We can't
+ * just derive RESERVED_STACK_WORDS because it's used in Haskell code
+ * too.
+ */
+#if RESERVED_STACK_WORDS != (3 + RET_DYN_BITMAP_SIZE + RET_DYN_NONPTR_REGS_SIZE)
+#error RESERVED_STACK_WORDS may be wrong!
+#endif
+
+#endif /* CONSTANTS_H */