From a1d8f7e9ead3ea284abf878ed3015a84eb5d67fb Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Sun, 9 Aug 2009 18:07:01 +0000 Subject: [PATCH] Make Constants shareable with the base package --- compiler/main/Constants.lhs | 191 +----------------------------------------- includes/HaskellConstants.hs | 170 +++++++++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+), 189 deletions(-) create mode 100644 includes/HaskellConstants.hs diff --git a/compiler/main/Constants.lhs b/compiler/main/Constants.lhs index 106c9a7..236f1f8 100644 --- a/compiler/main/Constants.lhs +++ b/compiler/main/Constants.lhs @@ -6,195 +6,8 @@ \begin{code} module Constants (module Constants) where -import Data.Bits (shiftL) +#include "ghc_boot_platform.h" --- This magical #include brings in all the everybody-knows-these magic --- constants unfortunately, we need to be *explicit* about which one --- we want; if we just hope a -I... will get the right one, we could --- be in trouble. +#include "../includes/HaskellConstants.hs" -#include "HsVersions.h" -#include "../includes/stg/MachRegs.h" -#include "../includes/rts/Constants.h" -#include "../includes/MachDeps.h" -#include "../includes/DerivedConstants.h" - --- import Util -\end{code} - -All pretty arbitrary: - -\begin{code} -mAX_TUPLE_SIZE :: Int -mAX_TUPLE_SIZE = 62 -- Should really match the number - -- of decls in Data.Tuple - -mAX_CONTEXT_REDUCTION_DEPTH :: Int -mAX_CONTEXT_REDUCTION_DEPTH = 20 -\end{code} - - -\begin{code} --- specialised fun/thunk/constr closure types -mAX_SPEC_THUNK_SIZE :: Int -mAX_SPEC_THUNK_SIZE = MAX_SPEC_THUNK_SIZE - -mAX_SPEC_FUN_SIZE :: Int -mAX_SPEC_FUN_SIZE = MAX_SPEC_FUN_SIZE - -mAX_SPEC_CONSTR_SIZE :: Int -mAX_SPEC_CONSTR_SIZE = MAX_SPEC_CONSTR_SIZE - --- pre-compiled thunk types -mAX_SPEC_SELECTEE_SIZE :: Int -mAX_SPEC_SELECTEE_SIZE = MAX_SPEC_SELECTEE_SIZE - -mAX_SPEC_AP_SIZE :: Int -mAX_SPEC_AP_SIZE = MAX_SPEC_AP_SIZE - --- closure sizes: these do NOT include the header (see below for header sizes) -mIN_PAYLOAD_SIZE ::Int -mIN_PAYLOAD_SIZE = MIN_PAYLOAD_SIZE -\end{code} - -\begin{code} -mIN_INTLIKE, mAX_INTLIKE :: Int -mIN_INTLIKE = MIN_INTLIKE -mAX_INTLIKE = MAX_INTLIKE - -mIN_CHARLIKE, mAX_CHARLIKE :: Int -mIN_CHARLIKE = MIN_CHARLIKE -mAX_CHARLIKE = MAX_CHARLIKE -\end{code} - -A section of code-generator-related MAGIC CONSTANTS. - -\begin{code} -mAX_Vanilla_REG :: Int -mAX_Vanilla_REG = MAX_VANILLA_REG - -mAX_Float_REG :: Int -mAX_Float_REG = MAX_FLOAT_REG - -mAX_Double_REG :: Int -mAX_Double_REG = MAX_DOUBLE_REG - -mAX_Long_REG :: Int -mAX_Long_REG = MAX_LONG_REG - -mAX_Real_Vanilla_REG :: Int -mAX_Real_Vanilla_REG = MAX_REAL_VANILLA_REG - -mAX_Real_Float_REG :: Int -mAX_Real_Float_REG = MAX_REAL_FLOAT_REG - -mAX_Real_Double_REG :: Int -mAX_Real_Double_REG = MAX_REAL_DOUBLE_REG - -mAX_Real_Long_REG :: Int -#ifdef MAX_REAL_LONG_REG -mAX_Real_Long_REG = MAX_REAL_LONG_REG -#else -mAX_Real_Long_REG = 0 -#endif -\end{code} - -Closure header sizes. - -\begin{code} -sTD_HDR_SIZE :: Int -sTD_HDR_SIZE = STD_HDR_SIZE - -pROF_HDR_SIZE :: Int -pROF_HDR_SIZE = PROF_HDR_SIZE -\end{code} - -Size of a double in StgWords. - -\begin{code} -dOUBLE_SIZE :: Int -dOUBLE_SIZE = SIZEOF_DOUBLE - -wORD64_SIZE :: Int -wORD64_SIZE = 8 - -iNT64_SIZE :: 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 :: Int -rESERVED_C_STACK_BYTES = RESERVED_C_STACK_BYTES -\end{code} - -The amount of (Haskell) stack to leave free for saving registers when -returning to the scheduler. - -\begin{code} -rESERVED_STACK_WORDS :: Int -rESERVED_STACK_WORDS = RESERVED_STACK_WORDS -\end{code} - -Continuations that need more than this amount of stack should do their -own stack check (see bug #1466). - -\begin{code} -aP_STACK_SPLIM :: Int -aP_STACK_SPLIM = AP_STACK_SPLIM -\end{code} - -Size of a word, in bytes - -\begin{code} -wORD_SIZE :: Int -wORD_SIZE = SIZEOF_HSWORD - -wORD_SIZE_IN_BITS :: Int -wORD_SIZE_IN_BITS = wORD_SIZE * 8 -\end{code} - -Amount of pointer bits used for semi-tagging constructor closures - -\begin{code} -tAG_BITS :: Int -tAG_BITS = TAG_BITS - -tAG_MASK :: Int -tAG_MASK = (1 `shiftL` tAG_BITS) - 1 - -mAX_PTR_TAG :: Int -mAX_PTR_TAG = tAG_MASK -\end{code} - -Size of a C int, in bytes. May be smaller than wORD_SIZE. - -\begin{code} -cINT_SIZE :: Int -cINT_SIZE = SIZEOF_INT -\end{code} - -Size of a storage manager block (in bytes). - -\begin{code} -bLOCK_SIZE :: Int -bLOCK_SIZE = BLOCK_SIZE -bLOCK_SIZE_W :: Int -bLOCK_SIZE_W = bLOCK_SIZE `quot` wORD_SIZE -\end{code} - -Number of bits to shift a bitfield left by in an info table. - -\begin{code} -bITMAP_BITS_SHIFT :: Int -bITMAP_BITS_SHIFT = BITMAP_BITS_SHIFT -\end{code} - -Constants derived from headers in ghc/includes, generated by the program -../includes/mkDerivedConstants.c. - -\begin{code} -#include "../includes/GHCConstants.h" \end{code} diff --git a/includes/HaskellConstants.hs b/includes/HaskellConstants.hs new file mode 100644 index 0000000..666728c --- /dev/null +++ b/includes/HaskellConstants.hs @@ -0,0 +1,170 @@ + +import Data.Bits (shiftL) + +-- This magical #include brings in all the everybody-knows-these magic +-- constants unfortunately, we need to be *explicit* about which one +-- we want; if we just hope a -I... will get the right one, we could +-- be in trouble. + +{- +Pull in the autoconf defines (HAVE_FOO), but don't include +ghcconfig.h, because that will include ghcplatform.h which has the +wrong platform settings for the compiler (it has the platform +settings for the target plat instead). +-} +#include "../includes/ghcautoconf.h" + +#include "stg/MachRegs.h" +#include "rts/Constants.h" +#include "MachDeps.h" +#include "DerivedConstants.h" + +-- import Util + +-- All pretty arbitrary: + +mAX_TUPLE_SIZE :: Int +mAX_TUPLE_SIZE = 62 -- Should really match the number + -- of decls in Data.Tuple + +mAX_CONTEXT_REDUCTION_DEPTH :: Int +mAX_CONTEXT_REDUCTION_DEPTH = 20 + + +-- specialised fun/thunk/constr closure types +mAX_SPEC_THUNK_SIZE :: Int +mAX_SPEC_THUNK_SIZE = MAX_SPEC_THUNK_SIZE + +mAX_SPEC_FUN_SIZE :: Int +mAX_SPEC_FUN_SIZE = MAX_SPEC_FUN_SIZE + +mAX_SPEC_CONSTR_SIZE :: Int +mAX_SPEC_CONSTR_SIZE = MAX_SPEC_CONSTR_SIZE + +-- pre-compiled thunk types +mAX_SPEC_SELECTEE_SIZE :: Int +mAX_SPEC_SELECTEE_SIZE = MAX_SPEC_SELECTEE_SIZE + +mAX_SPEC_AP_SIZE :: Int +mAX_SPEC_AP_SIZE = MAX_SPEC_AP_SIZE + +-- closure sizes: these do NOT include the header (see below for header sizes) +mIN_PAYLOAD_SIZE ::Int +mIN_PAYLOAD_SIZE = MIN_PAYLOAD_SIZE + +mIN_INTLIKE, mAX_INTLIKE :: Int +mIN_INTLIKE = MIN_INTLIKE +mAX_INTLIKE = MAX_INTLIKE + +mIN_CHARLIKE, mAX_CHARLIKE :: Int +mIN_CHARLIKE = MIN_CHARLIKE +mAX_CHARLIKE = MAX_CHARLIKE + +-- A section of code-generator-related MAGIC CONSTANTS. + +mAX_Vanilla_REG :: Int +mAX_Vanilla_REG = MAX_VANILLA_REG + +mAX_Float_REG :: Int +mAX_Float_REG = MAX_FLOAT_REG + +mAX_Double_REG :: Int +mAX_Double_REG = MAX_DOUBLE_REG + +mAX_Long_REG :: Int +mAX_Long_REG = MAX_LONG_REG + +mAX_Real_Vanilla_REG :: Int +mAX_Real_Vanilla_REG = MAX_REAL_VANILLA_REG + +mAX_Real_Float_REG :: Int +mAX_Real_Float_REG = MAX_REAL_FLOAT_REG + +mAX_Real_Double_REG :: Int +mAX_Real_Double_REG = MAX_REAL_DOUBLE_REG + +mAX_Real_Long_REG :: Int +#ifdef MAX_REAL_LONG_REG +mAX_Real_Long_REG = MAX_REAL_LONG_REG +#else +mAX_Real_Long_REG = 0 +#endif + +-- Closure header sizes. + +sTD_HDR_SIZE :: Int +sTD_HDR_SIZE = STD_HDR_SIZE + +pROF_HDR_SIZE :: Int +pROF_HDR_SIZE = PROF_HDR_SIZE + +-- Size of a double in StgWords. + +dOUBLE_SIZE :: Int +dOUBLE_SIZE = SIZEOF_DOUBLE + +wORD64_SIZE :: Int +wORD64_SIZE = 8 + +iNT64_SIZE :: Int +iNT64_SIZE = wORD64_SIZE + +-- This tells the native code generator the size of the spill +-- area is has available. + +rESERVED_C_STACK_BYTES :: Int +rESERVED_C_STACK_BYTES = RESERVED_C_STACK_BYTES + +-- The amount of (Haskell) stack to leave free for saving registers when +-- returning to the scheduler. + +rESERVED_STACK_WORDS :: Int +rESERVED_STACK_WORDS = RESERVED_STACK_WORDS + +-- Continuations that need more than this amount of stack should do their +-- own stack check (see bug #1466). + +aP_STACK_SPLIM :: Int +aP_STACK_SPLIM = AP_STACK_SPLIM + +-- Size of a word, in bytes + +wORD_SIZE :: Int +wORD_SIZE = SIZEOF_HSWORD + +wORD_SIZE_IN_BITS :: Int +wORD_SIZE_IN_BITS = wORD_SIZE * 8 + +-- Amount of pointer bits used for semi-tagging constructor closures + +tAG_BITS :: Int +tAG_BITS = TAG_BITS + +tAG_MASK :: Int +tAG_MASK = (1 `shiftL` tAG_BITS) - 1 + +mAX_PTR_TAG :: Int +mAX_PTR_TAG = tAG_MASK + +-- Size of a C int, in bytes. May be smaller than wORD_SIZE. + +cINT_SIZE :: Int +cINT_SIZE = SIZEOF_INT + +-- Size of a storage manager block (in bytes). + +bLOCK_SIZE :: Int +bLOCK_SIZE = BLOCK_SIZE +bLOCK_SIZE_W :: Int +bLOCK_SIZE_W = bLOCK_SIZE `quot` wORD_SIZE + +-- Number of bits to shift a bitfield left by in an info table. + +bITMAP_BITS_SHIFT :: Int +bITMAP_BITS_SHIFT = BITMAP_BITS_SHIFT + +-- Constants derived from headers in ghc/includes, generated by the program +-- ../includes/mkDerivedConstants.c. + +#include "GHCConstants.h" + -- 1.7.10.4