[project @ 2004-11-10 01:56:00 by wolfgang]
[ghc-hetmet.git] / ghc / compiler / main / Constants.lhs
index eca728d..ac6bddc 100644 (file)
@@ -4,76 +4,7 @@
 \section[Constants]{Info about this compilation}
 
 \begin{code}
-module Constants (
-       uNFOLDING_USE_THRESHOLD,
-       uNFOLDING_CREATION_THRESHOLD,
-       iNTERFACE_UNFOLD_THRESHOLD,
-       lIBERATE_CASE_THRESHOLD,
-       uNFOLDING_CHEAP_OP_COST,
-       uNFOLDING_DEAR_OP_COST,
-       uNFOLDING_NOREP_LIT_COST,
-       uNFOLDING_CON_DISCOUNT_WEIGHT,
-       uNFOLDING_KEENESS_FACTOR,
-
-       mAX_CONTEXT_REDUCTION_DEPTH,
-       mAX_TUPLE_SIZE,
-
-       mAX_SPEC_THUNK_SIZE,
-       mAX_SPEC_FUN_SIZE,
-       mAX_SPEC_CONSTR_SIZE,
-       mAX_SPEC_SELECTEE_SIZE,
-       mAX_SPEC_AP_SIZE,
-
-       tARGET_MIN_INT, tARGET_MAX_INT,
-
-       mIN_UPD_SIZE,
-       mIN_SIZE_NonUpdHeapObject,
-
-       sTD_HDR_SIZE,
-       pROF_HDR_SIZE,
-       gRAN_HDR_SIZE,
-       tICKY_HDR_SIZE,
-       aRR_HDR_SIZE,
-
-       sTD_ITBL_SIZE,
-       pROF_ITBL_SIZE,
-       gRAN_ITBL_SIZE,
-       tICKY_ITBL_SIZE,
-
-       mAX_FAMILY_SIZE_FOR_VEC_RETURNS,
-
-       uF_SIZE,
-       sCC_UF_SIZE,
-       uF_RET,
-       uF_SU,
-       uF_UPDATEE,
-       uF_CCS,
-
-       sEQ_FRAME_SIZE,
-
-       mAX_Vanilla_REG,
-       mAX_Float_REG,
-       mAX_Double_REG,
-       mAX_Long_REG,
-
-       mAX_Real_Vanilla_REG,
-       mAX_Real_Float_REG,
-       mAX_Real_Double_REG,
-       mAX_Real_Long_REG,
-
-       oTHER_TAG,
-
-       mAX_INTLIKE, mIN_INTLIKE,
-
-       spRelToInt,
-
-       dOUBLE_SIZE,
-       iNT64_SIZE,
-       wORD64_SIZE,
-       
-       interfaceFileFormatVersion
-
-    ) where
+module Constants (module Constants) where
 
 -- This magical #include brings in all the everybody-knows-these magic
 -- constants unfortunately, we need to be *explicit* about which one
@@ -81,9 +12,11 @@ module Constants (
 -- be in trouble.
 
 #include "HsVersions.h"
-#include "../includes/config.h"
+#include "../includes/ghcconfig.h"
 #include "../includes/MachRegs.h"
 #include "../includes/Constants.h"
+#include "../includes/MachDeps.h"
+#include "../includes/DerivedConstants.h"
 
 -- import Util
 \end{code}
@@ -91,25 +24,13 @@ module Constants (
 All pretty arbitrary:
 
 \begin{code}
-mAX_TUPLE_SIZE = (37 :: Int)
+mAX_TUPLE_SIZE = (62 :: Int)   -- Should really match the number
+                               -- of decls in Data.Tuple
 mAX_CONTEXT_REDUCTION_DEPTH = (20 :: Int)
 \end{code}
 
-\begin{code}
-uNFOLDING_USE_THRESHOLD              = ( 8 :: Int)
-uNFOLDING_CREATION_THRESHOLD  = (30 :: Int)    -- Discounts can be big
-iNTERFACE_UNFOLD_THRESHOLD    = (30 :: Int)
-lIBERATE_CASE_THRESHOLD              = (10 :: Int)
-
-uNFOLDING_CHEAP_OP_COST       = ( 1 :: Int)
-uNFOLDING_DEAR_OP_COST        = ( 4 :: Int)
-uNFOLDING_NOREP_LIT_COST      = ( 20 :: Int)   -- Strings can be pretty big
-uNFOLDING_CON_DISCOUNT_WEIGHT = ( 3 :: Int)
-uNFOLDING_KEENESS_FACTOR      = ( 2.0 :: Float)
-\end{code}
 
 \begin{code}
-
 -- specialised fun/thunk/constr closure types
 mAX_SPEC_THUNK_SIZE   = (MAX_SPEC_THUNK_SIZE :: Int)
 mAX_SPEC_FUN_SIZE     = (MAX_SPEC_FUN_SIZE :: Int)
@@ -124,47 +45,14 @@ mIN_UPD_SIZE                       = (MIN_UPD_SIZE::Int)
 mIN_SIZE_NonUpdHeapObject      = (MIN_NONUPD_SIZE::Int)
 \end{code}
 
-If we're compiling with GHC (and we're not cross-compiling), then we
-know that minBound and maxBound :: Int are the right values for the
-target architecture.  Otherwise, we assume -2^31 and 2^31-1
-respectively (which will be wrong on a 64-bit machine).
-
-\begin{code}
-tARGET_MIN_INT, tARGET_MAX_INT :: Integer
-#if __GLASGOW_HASKELL__
-tARGET_MIN_INT = toInteger (minBound :: Int)
-tARGET_MAX_INT = toInteger (maxBound :: Int)
-#else
-tARGET_MIN_INT = -2147483648
-tARGET_MAX_INT =  2147483647
-#endif
-\end{code}
-Constants for semi-tagging; the tags associated with the data
-constructors will start at 0 and go up.
-
-\begin{code}
-oTHER_TAG = (INFO_OTHER_TAG :: Integer)        -- (-1) unevaluated, probably
-\end{code}
-
 \begin{code}
-mIN_INTLIKE, mAX_INTLIKE :: Integer    -- Only used to compare with (MachInt Integer)
+mIN_INTLIKE, mAX_INTLIKE :: Int        
 mIN_INTLIKE = MIN_INTLIKE
 mAX_INTLIKE = MAX_INTLIKE
-\end{code}
-
-A little function that abstracts the stack direction.  Note that most
-of the code generator is dependent on the stack direction anyway, so
-changing this on its own spells certain doom.  ToDo: remove?
-
-\begin{code}
--- THIS IS DIRECTION SENSITIVE!
-
--- stack grows down, positive virtual offsets correspond to negative
--- additions to the stack pointer.
 
-spRelToInt :: Int{-VirtualSpOffset-} -> Int{-VirtualSpOffset-} -> Int
-spRelToInt sp off = sp - off
+mIN_CHARLIKE, mAX_CHARLIKE :: Int
+mIN_CHARLIKE = MIN_CHARLIKE
+mAX_CHARLIKE = MAX_CHARLIKE
 \end{code}
 
 A section of code-generator-related MAGIC CONSTANTS.
@@ -172,22 +60,6 @@ A section of code-generator-related MAGIC CONSTANTS.
 \begin{code}
 mAX_FAMILY_SIZE_FOR_VEC_RETURNS = (MAX_VECTORED_RTN::Int)  -- pretty arbitrary
 -- If you change this, you may need to change runtimes/standard/Update.lhc
-
--- The update frame sizes
-uF_SIZE        = (NOSCC_UF_SIZE::Int)
-
--- Same again, with profiling
-sCC_UF_SIZE = (SCC_UF_SIZE::Int)
-
--- Offsets in an update frame.  They don't change with profiling!
-uF_RET         = (UF_RET::Int)
-uF_SU          = (UF_SU::Int)
-uF_UPDATEE     = (UF_UPDATEE::Int)
-uF_CCS         = (UF_CCS::Int)
-\end{code}
-
-\begin{code}
-sEQ_FRAME_SIZE = (SEQ_FRAME_SIZE::Int)
 \end{code}
 
 \begin{code}
@@ -209,17 +81,16 @@ mAX_Real_Long_REG       = (0::Int)
 Closure header sizes.
 
 \begin{code}
-sTD_HDR_SIZE   = (STD_HDR_SIZE   :: Int)
-pROF_HDR_SIZE  = (PROF_HDR_SIZE  :: Int)
-gRAN_HDR_SIZE  = (GRAN_HDR_SIZE  :: Int)
-tICKY_HDR_SIZE = (TICKY_HDR_SIZE :: Int)
-aRR_HDR_SIZE   = (ARR_HDR_SIZE   :: Int)
+sTD_HDR_SIZE       = (STD_HDR_SIZE       :: Int)
+pROF_HDR_SIZE      = (PROF_HDR_SIZE      :: Int)
+gRAN_HDR_SIZE      = (GRAN_HDR_SIZE      :: Int)
 \end{code}
 
 Info Table sizes.
 
 \begin{code}
 sTD_ITBL_SIZE   = (STD_ITBL_SIZE   :: Int)
+rET_ITBL_SIZE   = (RET_ITBL_SIZE   :: Int)
 pROF_ITBL_SIZE  = (PROF_ITBL_SIZE  :: Int)
 gRAN_ITBL_SIZE  = (GRAN_ITBL_SIZE  :: Int)
 tICKY_ITBL_SIZE = (TICKY_ITBL_SIZE :: Int)
@@ -228,15 +99,54 @@ tICKY_ITBL_SIZE = (TICKY_ITBL_SIZE :: Int)
 Size of a double in StgWords.
 
 \begin{code}
-dOUBLE_SIZE    = (DOUBLE_SIZE   :: Int)
-wORD64_SIZE    = (WORD64_SIZE   :: Int)
-iNT64_SIZE     = (INT64_SIZE   :: Int)
+dOUBLE_SIZE     = SIZEOF_DOUBLE :: Int
+wORD64_SIZE     = 8 :: Int
+iNT64_SIZE      = wORD64_SIZE
+\end{code}
+
+This tells the native code generator the size of the spill
+area is has available.
+
+\begin{code}
+rESERVED_C_STACK_BYTES = (RESERVED_C_STACK_BYTES :: Int)
+\end{code}
+
+The amount of (Haskell) stack to leave free for saving registers when
+returning to the scheduler.
+
+\begin{code}
+rESERVED_STACK_WORDS = (RESERVED_STACK_WORDS :: Int)
+\end{code}
+
+Size of a word, in bytes
+
+\begin{code}
+wORD_SIZE = (SIZEOF_HSWORD :: Int)
+wORD_SIZE_IN_BITS = wORD_SIZE * 8 :: Int
+\end{code}
+
+Size of a C int, in bytes. May be smaller than wORD_SIZE.
+
+\begin{code}
+cINT_SIZE = (SIZEOF_INT :: Int)
+\end{code}
+
+Size of a storage manager block (in bytes).
+
+\begin{code}
+bLOCK_SIZE = (BLOCK_SIZE :: Int)
+bLOCK_SIZE_W = (bLOCK_SIZE `quot` wORD_SIZE :: Int)
+\end{code}
+
+Number of bits to shift a bitfield left by in an info table.
+
+\begin{code}
+bITMAP_BITS_SHIFT = (BITMAP_BITS_SHIFT :: Int)
 \end{code}
 
-The version of the interface file format we're
-using:
+Constants derived from headers in ghc/includes, generated by the program
+../includes/mkDerivedConstants.c.
 
 \begin{code}
-interfaceFileFormatVersion :: Int
-interfaceFileFormatVersion = HscIfaceFileVersion
+#include "../includes/GHCConstants.h"
 \end{code}