X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Fprelude%2FPrimRep.lhs;h=2769a583503b4c9b351b02b88782ffe777106f21;hb=e73218c6a995e56a60eab34594802d6a1067a604;hp=cde186abff7be867a7c7169827e32878352c1c44;hpb=3c87ea6cd7018f266e6a097a7d9a16f2b5289f4c;p=ghc-hetmet.git diff --git a/ghc/compiler/prelude/PrimRep.lhs b/ghc/compiler/prelude/PrimRep.lhs index cde186a..2769a58 100644 --- a/ghc/compiler/prelude/PrimRep.lhs +++ b/ghc/compiler/prelude/PrimRep.lhs @@ -25,8 +25,7 @@ module PrimRep #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} @@ -47,6 +46,7 @@ data PrimRep | CostCentreRep -- Pointer to a cost centre | CharRep -- Machine characters + | Int8Rep -- 8 bit integers | IntRep -- integers (same size as ptr on this arch) | WordRep -- ditto (but *unsigned*) | AddrRep -- addresses ("C pointers") @@ -54,11 +54,18 @@ data PrimRep | DoubleRep -- doubles | Word64Rep -- guaranteed to be 64 bits (no more, no less.) | Int64Rep -- guaranteed to be 64 bits (no more, no less.) - + + -- Perhaps all sized integers and words should be primitive types. + + -- Int8Rep is currently used to simulate some old CharRep usages + -- when Char changed size from 8 to 31 bits. It does not correspond + -- to a Haskell unboxed type, in particular it's not used by Int8. + | WeakPtrRep | ForeignObjRep + | BCORep - | StablePtrRep -- guaranteed to be a represented by a pointer + | StablePtrRep -- guaranteed to be represented by a pointer | StableNameRep -- A stable name is a real heap object, unpointed, -- with one field containing an index into the @@ -71,6 +78,11 @@ data PrimRep | ArrayRep -- Primitive array of Haskell pointers | ByteArrayRep -- Primitive array of bytes (no Haskell pointers) + | PrimPtrRep -- Used for MutVars and MVars; + -- a pointer to a primitive object + -- ToDo: subsumes WeakPtrRep, ThreadIdRep, + -- StableNameRep, ForeignObjRep, and BCORep ? + | VoidRep -- Occupies no space at all! -- (Primitive states are mapped onto this) deriving (Eq, Ord) @@ -110,9 +122,10 @@ isFollowableRep ByteArrayRep = True -- '' isFollowableRep WeakPtrRep = True -- '' isFollowableRep ForeignObjRep = True -- '' isFollowableRep StableNameRep = True -- '' +isFollowableRep PrimPtrRep = True -- '' isFollowableRep ThreadIdRep = True -- pointer to a TSO -isFollowableRep other = False +isFollowableRep other = False separateByPtrFollowness :: (a -> PrimRep) -> [a] -> ([a], [a]) @@ -167,27 +180,28 @@ getPrimRepSize other = 1 retPrimRepSize = getPrimRepSize RetRep --- size in bytes, ToDo: cpp in the right vals. +-- 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)) +-- 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 - StableNameRep -> 4 - ArrayRep -> 4 - ByteArrayRep -> 4 - _ -> panic "getPrimRepSize: ouch - this wasn't supposed to happen!" + CharRep -> 4 + Int8Rep -> 1 + IntRep -> wORD_SIZE + AddrRep -> wORD_SIZE + FloatRep -> wORD_SIZE + DoubleRep -> dOUBLE_SIZE * wORD_SIZE + Word64Rep -> wORD64_SIZE * wORD_SIZE + Int64Rep -> iNT64_SIZE * wORD_SIZE + WeakPtrRep -> wORD_SIZE + ForeignObjRep -> wORD_SIZE + StablePtrRep -> wORD_SIZE + StableNameRep -> wORD_SIZE + ArrayRep -> wORD_SIZE + ByteArrayRep -> wORD_SIZE + _ -> panic "getPrimRepSize: ouch - this wasn't supposed to happen!" \end{code} @@ -210,6 +224,7 @@ showPrimRep DataPtrRep = "D_" showPrimRep RetRep = "P_" showPrimRep CostCentreRep = "CostCentre" showPrimRep CharRep = "C_" +showPrimRep Int8Rep = "StgInt8" showPrimRep IntRep = "I_" -- short for StgInt showPrimRep WordRep = "W_" -- short for StgWord showPrimRep Int64Rep = "LI_" -- short for StgLongInt @@ -218,6 +233,7 @@ showPrimRep AddrRep = "StgAddr" showPrimRep FloatRep = "StgFloat" showPrimRep DoubleRep = "StgDouble" showPrimRep ArrayRep = "P_" -- see comment below +showPrimRep PrimPtrRep = "P_" showPrimRep ByteArrayRep = "StgByteArray" showPrimRep StablePtrRep = "StgStablePtr" showPrimRep StableNameRep = "P_" @@ -225,8 +241,10 @@ showPrimRep ThreadIdRep = "StgTSO*" showPrimRep WeakPtrRep = "P_" showPrimRep ForeignObjRep = "StgAddr" showPrimRep VoidRep = "!!VOID_KIND!!" +showPrimRep BCORep = "P_" -- not sure -- JRS 000708 primRepString CharRep = "Char" +primRepString Int8Rep = "Char" -- To have names like newCharArray# primRepString IntRep = "Int" primRepString WordRep = "Word" primRepString Int64Rep = "Int64"