X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Fprelude%2FPrimRep.lhs;h=2d13efa7d44638a6cdd3049b342c658a9e0c5a27;hb=922d60a441da853662b29c870859607af166a5c8;hp=4b1b71c7b205b46ad67f16d8ed53407ba8a7e9dd;hpb=dcef38bab91d45b56f7cf3ceeec96303d93728bb;p=ghc-hetmet.git diff --git a/ghc/compiler/prelude/PrimRep.lhs b/ghc/compiler/prelude/PrimRep.lhs index 4b1b71c..2d13efa 100644 --- a/ghc/compiler/prelude/PrimRep.lhs +++ b/ghc/compiler/prelude/PrimRep.lhs @@ -1,5 +1,5 @@ % -% (c) The GRASP Project, Glasgow University, 1992-1996 +% (c) The GRASP Project, Glasgow University, 1992-1998 % \section[PrimRep]{Primitive machine-level kinds of things.} @@ -8,27 +8,26 @@ At various places in the back end, we want to be to tag things with a types. \begin{code} -#include "HsVersions.h" - -module PrimRep ( - PrimRep(..), - - separateByPtrFollowness, isFollowableRep, isFloatingRep, - getPrimRepSize, retPrimRepSize, - showPrimRep, ppPrimRep, - guessPrimRep, decodePrimRep - ) where +module PrimRep + ( + PrimRep(..) + , separateByPtrFollowness + , isFollowableRep + , isFloatingRep + , is64BitRep + , getPrimRepSize + , getPrimRepSizeInBytes + , retPrimRepSize + , showPrimRep + , primRepString + , showPrimRepToUser + ) where -IMP_Ubiq() +#include "HsVersions.h" -import Pretty -- pretty-printing code +import Constants ( dOUBLE_SIZE, iNT64_SIZE, wORD64_SIZE ) import Util -#if __GLASGOW_HASKELL__ >= 202 import Outputable -#endif - --- Oh dear. -#include "../../includes/GhcConstants.h" \end{code} %************************************************************************ @@ -48,20 +47,29 @@ data PrimRep | CostCentreRep -- Pointer to a cost centre | CharRep -- Machine characters - | IntRep -- integers (at least 32 bits) + | IntRep -- integers (same size as ptr on this arch) | WordRep -- ditto (but *unsigned*) | 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.) - | ForeignObjRep -- This has to be a special kind because ccall - -- generates special code when passing/returning - -- one of these. [ADR] + | WeakPtrRep + | ForeignObjRep | StablePtrRep -- We could replace this with IntRep but maybe -- there's some documentation gain from having -- it special? [ADR] + | StableNameRep -- A stable name is a real heap object, unpointed, + -- with one field containing an index into the + -- stable pointer table. It has to be a heap + -- object so the garbage collector can track these + -- objects and reclaim stable pointer entries. + + | ThreadIdRep -- Really a pointer to a TSO + | ArrayRep -- Primitive array of Haskell pointers | ByteArrayRep -- Primitive array of bytes (no Haskell pointers) @@ -71,6 +79,16 @@ data PrimRep -- 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. + %************************************************************************ %* * \subsection[PrimRep-predicates]{Follow-ness, sizes, and such---on @PrimitiveKinds@} @@ -78,27 +96,23 @@ data PrimRep %************************************************************************ Whether or not the thing is a pointer that the garbage-collector -should follow. +should follow. Or, to put it another (less confusing) way, whether +the object in question is a heap object. -Or, to put it another (less confusing) way, whether the object in -question is a heap object. +Depending on the outcome, this predicate determines what stack +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 -isFollowableRep ByteArrayRep = True --- why is a ForeignObj followable? 4/96 SOF --- --- A: they're followable because these objects --- should be lugged around by the storage manager --- (==> we need to generate code that identify them as such) -- 3/97 SOF -isFollowableRep ForeignObjRep = True - -isFollowableRep StablePtrRep = False --- StablePtrs aren't followable because they are just indices into a --- table for which explicit allocation/ deallocation is required. +isFollowableRep ArrayRep = True -- all heap objects: +isFollowableRep ByteArrayRep = True -- '' +isFollowableRep WeakPtrRep = True -- '' +isFollowableRep ForeignObjRep = True -- '' +isFollowableRep StableNameRep = True -- '' +isFollowableRep ThreadIdRep = True -- pointer to a TSO isFollowableRep other = False @@ -126,12 +140,26 @@ isFloatingRep :: PrimRep -> Bool isFloatingRep DoubleRep = True isFloatingRep FloatRep = True isFloatingRep other = False + +\end{code} + +\begin{code} +is64BitRep :: PrimRep -> Bool + +is64BitRep Int64Rep = True +is64BitRep Word64Rep = True +is64BitRep other = False + \end{code} + + \begin{code} getPrimRepSize :: PrimRep -> Int -getPrimRepSize DoubleRep = DOUBLE_SIZE -- "words", of course +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* @@ -140,6 +168,29 @@ getPrimRepSize VoidRep = 0 getPrimRepSize other = 1 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 + StableNameRep -> 4 + ArrayRep -> 4 + ByteArrayRep -> 4 + _ -> panic "getPrimRepSize: ouch - this wasn't supposed to happen!" + \end{code} %************************************************************************ @@ -150,111 +201,50 @@ retPrimRepSize = getPrimRepSize RetRep \begin{code} instance Outputable PrimRep where - ppr sty kind = text (showPrimRep kind) + ppr kind = text (showPrimRep kind) showPrimRep :: PrimRep -> String --- dumping PrimRep tag for unfoldings -ppPrimRep :: PrimRep -> Doc - -guessPrimRep :: String -> PrimRep -- a horrible "inverse" function -decodePrimRep :: Char -> PrimRep -- of equal nature - -ppPrimRep k = - char - (case k of - PtrRep -> 'P' - CodePtrRep -> 'p' - DataPtrRep -> 'd' - CostCentreRep -> 'c' -- Pointer to a cost centre - RetRep -> 'R' - CharRep -> 'C' - IntRep -> 'I' - WordRep -> 'W' - AddrRep -> 'A' - FloatRep -> 'F' - DoubleRep -> 'D' - ArrayRep -> 'a' - ByteArrayRep -> 'b' - StablePtrRep -> 'S' - ForeignObjRep -> 'f' - VoidRep -> 'V' - _ -> panic "ppPrimRep") - -showPrimRep PtrRep = "P_" -- short for StgPtr - -showPrimRep CodePtrRep = "P_" -- DEATH to StgFunPtr! (94/02/22 WDP) - -- but aren't code pointers and function pointers different sizes - -- on some machines (eg 80x86)? ADR - -- Are you trying to ruin my life, or what? (WDP) - -showPrimRep DataPtrRep = "D_" -showPrimRep RetRep = "StgRetAddr" -showPrimRep CostCentreRep = "CostCentre" -showPrimRep CharRep = "StgChar" -showPrimRep IntRep = "I_" -- short for StgInt -showPrimRep WordRep = "W_" -- short for StgWord -showPrimRep AddrRep = "StgAddr" -showPrimRep FloatRep = "StgFloat" -showPrimRep DoubleRep = "StgDouble" -showPrimRep ArrayRep = "StgArray" -- see comment below -showPrimRep ByteArrayRep = "StgByteArray" -showPrimRep StablePtrRep = "StgStablePtr" -showPrimRep ForeignObjRep = "StgPtr" -- see comment below -showPrimRep VoidRep = "!!VOID_KIND!!" - -decodePrimRep ch = - case ch of - 'P' -> PtrRep - 'p' -> CodePtrRep - 'd' -> DataPtrRep - 'c' -> CostCentreRep - 'R' -> RetRep - 'C' -> CharRep - 'I' -> IntRep - 'W' -> WordRep - 'A' -> AddrRep - 'F' -> FloatRep - 'D' -> DoubleRep - 'a' -> ArrayRep - 'b' -> ByteArrayRep - 'S' -> StablePtrRep - 'f' -> ForeignObjRep - 'V' -> VoidRep - _ -> panic "decodePrimRep" - -guessPrimRep "D_" = DataPtrRep -guessPrimRep "StgRetAddr" = RetRep -guessPrimRep "StgChar" = CharRep -guessPrimRep "I_" = IntRep -guessPrimRep "W_" = WordRep -guessPrimRep "StgAddr" = AddrRep -guessPrimRep "StgFloat" = FloatRep -guessPrimRep "StgDouble" = DoubleRep -guessPrimRep "StgArray" = ArrayRep -guessPrimRep "StgByteArray" = ByteArrayRep -guessPrimRep "StgStablePtr" = StablePtrRep +showPrimRepToUser :: PrimRep -> String + +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 IntRep = "I_" -- short for StgInt +showPrimRep WordRep = "W_" -- short for StgWord +showPrimRep Int64Rep = "LI_" -- short for StgLongInt +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 StableNameRep = "P_" +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 StableNameRep = "StableName" +primRepString other = pprPanic "primRepString" (ppr other) + +showPrimRepToUser pr = primRepString pr \end{code} -All local C variables of @ArrayRep@ are declared in C as type -@StgArray@. The coercion to a more precise C type is done just before -indexing (by the relevant C primitive-op macro). - -Nota Bene. There are three types associated with @ForeignObj@ (MallocPtr++): -\begin{itemize} -\item -@StgForeignObjClosure@ is the type of the thing the prim. op @mkForeignObj@ returns. -{- old comment for MallocPtr -(This typename is hardwired into @ppr_casm_results@ in -@PprAbsC.lhs@.) --} - -\item -@StgForeignObj@ is the type of the thing we give the C world. - -\item -@StgPtr@ is the type of the (pointer to the) heap object which we -pass around inside the STG machine. -\end{itemize} - -It is really easy to confuse the two. (I'm not sure this choice of -type names helps.) [ADR] +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.