X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Fprelude%2FPrimRep.lhs;h=f3a066c9eda2dc7dd6511ecf38c8f1b953688eb9;hb=6226441f08e278ec52d5e054768d9bb557ea7de7;hp=9dfd5b4cd811b9b52024be322cf54fdf215c352e;hpb=438596897ebbe25a07e1c82085cfbc5bdb00f09e;p=ghc-hetmet.git diff --git a/ghc/compiler/prelude/PrimRep.lhs b/ghc/compiler/prelude/PrimRep.lhs index 9dfd5b4..f3a066c 100644 --- a/ghc/compiler/prelude/PrimRep.lhs +++ b/ghc/compiler/prelude/PrimRep.lhs @@ -9,8 +9,7 @@ types. \begin{code} module PrimRep - ( - PrimRep(..) + ( PrimRep(..) , separateByPtrFollowness , isFollowableRep , isFloatingRep @@ -18,15 +17,11 @@ module PrimRep , getPrimRepSize , getPrimRepSizeInBytes , retPrimRepSize - , showPrimRep - , primRepString - , showPrimRepToUser ) where #include "HsVersions.h" -import Constants ( dOUBLE_SIZE, iNT64_SIZE, wORD64_SIZE ) -import Util +import Constants ( dOUBLE_SIZE, iNT64_SIZE, wORD64_SIZE, wORD_SIZE ) import Outputable \end{code} @@ -36,6 +31,8 @@ import Outputable %* * %************************************************************************ +These pretty much correspond to the C types declared in StgTypes.h. + \begin{code} data PrimRep = -- These pointer-kinds are all really the same, but we keep @@ -47,41 +44,28 @@ data PrimRep | CostCentreRep -- Pointer to a cost centre | CharRep -- Machine characters - | IntRep -- integers (same size as ptr on this arch) - | WordRep -- ditto (but *unsigned*) - | AddrRep -- addresses ("C pointers") + | IntRep -- signed integers (same size as ptr on this arch) + | WordRep -- unsigned integers (same size as ptr on this arch) + | AddrRep -- addresses (C pointers) | FloatRep -- floats | DoubleRep -- doubles - | Word64Rep -- guaranteed to be 64 bits (no more, no less.) - | Int64Rep -- guaranteed to be 64 bits (no more, no less.) - - | WeakPtrRep - | ForeignObjRep - - | StablePtrRep -- We could replace this with IntRep but maybe - -- there's some documentation gain from having - -- it special? [ADR] - | ThreadIdRep -- Really a pointer to a TSO + | Int8Rep -- 8 bit signed integers + | Int16Rep -- 16 bit signed integers + | Int32Rep -- 32 bit signed integers + | Int64Rep -- 64 bit signed integers + | Word8Rep -- 8 bit unsigned integers + | Word16Rep -- 16 bit unsigned integers + | Word32Rep -- 32 bit unsigned integers + | Word64Rep -- 64 bit unsigned integers - | ArrayRep -- Primitive array of Haskell pointers - | ByteArrayRep -- Primitive array of bytes (no Haskell pointers) + | StablePtrRep -- guaranteed to be represented by a pointer | VoidRep -- Occupies no space at all! -- (Primitive states are mapped onto this) deriving (Eq, Ord) - -- Kinds are used in PrimTyCons, which need both Eq and Ord \end{code} -These pretty much correspond to the C types declared in StgTypes.h, -with the following exceptions: - - - when an Array or ByteArray is passed to C, we again pass a pointer - to the contents. The actual type that is passed is StgPtr for - ArrayRep, and StgByteArray (probably a char *) for ByteArrayRep. - -These hacks are left until the final printing of the C, in -PprAbsC.lhs. %************************************************************************ %* * @@ -98,19 +82,11 @@ the pointer/object possibly will have to be saved onto, and the computation of GC liveness info. \begin{code} -isFollowableRep :: PrimRep -> Bool - -isFollowableRep PtrRep = True -isFollowableRep ArrayRep = True -- all heap objects: -isFollowableRep ByteArrayRep = True -- '' -isFollowableRep WeakPtrRep = True -- '' -isFollowableRep ForeignObjRep = True -- '' -isFollowableRep ThreadIdRep = True -- pointer to a TSO - -isFollowableRep other = False +isFollowableRep :: PrimRep -> Bool -- True <=> points to a heap object +isFollowableRep PtrRep = True +isFollowableRep other = False separateByPtrFollowness :: (a -> PrimRep) -> [a] -> ([a], [a]) - separateByPtrFollowness kind_fun things = sep_things kind_fun things [] [] -- accumulating params for follow-able and don't-follow things... @@ -129,60 +105,60 @@ See codeGen/CgCon:cgTopRhsCon. \begin{code} isFloatingRep :: PrimRep -> Bool - isFloatingRep DoubleRep = True isFloatingRep FloatRep = True -isFloatingRep other = False - +isFloatingRep _ = False \end{code} \begin{code} is64BitRep :: PrimRep -> Bool - is64BitRep Int64Rep = True is64BitRep Word64Rep = True -is64BitRep other = False - -\end{code} - +is64BitRep _ = False +-- Size in words. -\begin{code} getPrimRepSize :: PrimRep -> Int +getPrimRepSize DoubleRep = dOUBLE_SIZE +getPrimRepSize Word64Rep = wORD64_SIZE +getPrimRepSize Int64Rep = iNT64_SIZE +getPrimRepSize VoidRep = 0 +getPrimRepSize _ = 1 -getPrimRepSize DoubleRep = dOUBLE_SIZE -- "words", of course -getPrimRepSize Word64Rep = wORD64_SIZE -getPrimRepSize Int64Rep = iNT64_SIZE ---getPrimRepSize FloatRep = 1 ---getPrimRepSize CharRep = 1 -- ToDo: count in bytes? ---getPrimRepSize ArrayRep = 1 -- Listed specifically for *documentation* ---getPrimRepSize ByteArrayRep = 1 -getPrimRepSize VoidRep = 0 -getPrimRepSize other = 1 - +retPrimRepSize :: Int retPrimRepSize = getPrimRepSize RetRep --- size in bytes, ToDo: cpp in the right vals. --- (used in some settings to figure out how many bytes --- we have to push onto the stack when calling external --- entry points (e.g., stdcalling on win32)) -getPrimRepSizeInBytes :: PrimRep -> Int -getPrimRepSizeInBytes pr = - case pr of - CharRep -> 1 - IntRep -> 4 - AddrRep -> 4 - FloatRep -> 4 - DoubleRep -> 8 - Word64Rep -> 8 - Int64Rep -> 8 - WeakPtrRep -> 4 - ForeignObjRep -> 4 - StablePtrRep -> 4 - ArrayRep -> 4 - ByteArrayRep -> 4 - _ -> panic "getPrimRepSize: ouch - this wasn't supposed to happen!" +-- Sizes in bytes. (used in some settings to figure out how many +-- bytes we have to push onto the stack when calling external entry +-- points (e.g., stdcalling on win32) + +-- Note: the "size in bytes" is also the scaling factor used when we +-- have an array of these things. For example, a ByteArray# of +-- Int16Rep will use a scaling factor of 2 when accessing the +-- elements. +getPrimRepSizeInBytes :: PrimRep -> Int +getPrimRepSizeInBytes PtrRep = wORD_SIZE +getPrimRepSizeInBytes CodePtrRep = wORD_SIZE +getPrimRepSizeInBytes DataPtrRep = wORD_SIZE +getPrimRepSizeInBytes RetRep = wORD_SIZE +getPrimRepSizeInBytes CostCentreRep = wORD_SIZE +getPrimRepSizeInBytes CharRep = 4 +getPrimRepSizeInBytes IntRep = wORD_SIZE +getPrimRepSizeInBytes WordRep = wORD_SIZE +getPrimRepSizeInBytes AddrRep = wORD_SIZE +getPrimRepSizeInBytes FloatRep = wORD_SIZE +getPrimRepSizeInBytes DoubleRep = dOUBLE_SIZE * wORD_SIZE +getPrimRepSizeInBytes Int8Rep = 1 +getPrimRepSizeInBytes Int16Rep = 2 +getPrimRepSizeInBytes Int32Rep = 4 +getPrimRepSizeInBytes Int64Rep = 8 +getPrimRepSizeInBytes Word8Rep = 1 +getPrimRepSizeInBytes Word16Rep = 2 +getPrimRepSizeInBytes Word32Rep = 4 +getPrimRepSizeInBytes Word64Rep = 8 +getPrimRepSizeInBytes StablePtrRep = wORD_SIZE +getPrimRepSizeInBytes other = pprPanic "getPrimRepSizeInBytes" (ppr other) \end{code} %************************************************************************ @@ -196,17 +172,18 @@ instance Outputable PrimRep where ppr kind = text (showPrimRep kind) showPrimRep :: PrimRep -> String -showPrimRepToUser :: PrimRep -> String - showPrimRep PtrRep = "P_" -- short for StgPtr - -showPrimRep CodePtrRep = "P_" -- DEATH to StgFunPtr! (94/02/22 WDP) -showPrimRep PtrRep = "P_" -- short for StgPtr showPrimRep CodePtrRep = "P_" -- DEATH to StgFunPtr! (94/02/22 WDP) showPrimRep DataPtrRep = "D_" showPrimRep RetRep = "P_" showPrimRep CostCentreRep = "CostCentre" showPrimRep CharRep = "C_" +showPrimRep Int8Rep = "StgInt8" +showPrimRep Int16Rep = "StgInt16" +showPrimRep Int32Rep = "StgInt32" +showPrimRep Word8Rep = "StgWord8" +showPrimRep Word16Rep = "StgWord16" +showPrimRep Word32Rep = "StgWord32" showPrimRep IntRep = "I_" -- short for StgInt showPrimRep WordRep = "W_" -- short for StgWord showPrimRep Int64Rep = "LI_" -- short for StgLongInt @@ -214,30 +191,6 @@ showPrimRep Word64Rep = "LW_" -- short for StgLongWord showPrimRep AddrRep = "StgAddr" showPrimRep FloatRep = "StgFloat" showPrimRep DoubleRep = "StgDouble" -showPrimRep ArrayRep = "P_" -- see comment below -showPrimRep ByteArrayRep = "StgByteArray" showPrimRep StablePtrRep = "StgStablePtr" -showPrimRep ThreadIdRep = "StgTSO*" -showPrimRep WeakPtrRep = "P_" -showPrimRep ForeignObjRep = "StgAddr" showPrimRep VoidRep = "!!VOID_KIND!!" - -primRepString CharRep = "Char" -primRepString IntRep = "Int" -primRepString WordRep = "Word" -primRepString Int64Rep = "Int64" -primRepString Word64Rep = "Word64" -primRepString AddrRep = "Addr" -primRepString FloatRep = "Float" -primRepString DoubleRep = "Double" -primRepString WeakPtrRep = "Weak" -primRepString ForeignObjRep = "ForeignObj" -primRepString StablePtrRep = "StablePtr" -primRepString other = pprPanic "primRepString" (ppr other) - -showPrimRepToUser pr = primRepString pr \end{code} - -Foreign Objects and Arrays are treated specially by the code for -_ccall_s: we pass a pointer to the contents of the object, not the -object itself.