X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Fmain%2FConstants.lhs;h=ac6bddc1ac7a4c4ce1d65a78c1ae3af1d226beff;hb=db35b90546b47fcd7193a83531d65ef38f1706f5;hp=eca728d3c3fa24dfb548c56bbc5ef7fc58da404e;hpb=449deb80dde91031b86b9cb4fb183696e0139bae;p=ghc-hetmet.git diff --git a/ghc/compiler/main/Constants.lhs b/ghc/compiler/main/Constants.lhs index eca728d..ac6bddc 100644 --- a/ghc/compiler/main/Constants.lhs +++ b/ghc/compiler/main/Constants.lhs @@ -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}