diff options
author | Sylvain Henry <sylvain@haskus.fr> | 2020-04-05 17:39:13 +0200 |
---|---|---|
committer | Sylvain Henry <sylvain@haskus.fr> | 2020-04-18 20:04:46 +0200 |
commit | 15312bbb53f247c9ed2c5cf75100a9f44c1c7227 (patch) | |
tree | 8306dcc04a5b7c82464f903044dfdd589e7fdcd7 /compiler/prelude/TysPrim.hs | |
parent | 3ca52151881451ce5b3a7740d003e811b586140d (diff) | |
download | haskell-15312bbb53f247c9ed2c5cf75100a9f44c1c7227.tar.gz |
Modules (#13009)
* SysTools
* Parser
* GHC.Builtin
* GHC.Iface.Recomp
* Settings
Update Haddock submodule
Metric Decrease:
Naperian
parsing001
Diffstat (limited to 'compiler/prelude/TysPrim.hs')
-rw-r--r-- | compiler/prelude/TysPrim.hs | 1110 |
1 files changed, 0 insertions, 1110 deletions
diff --git a/compiler/prelude/TysPrim.hs b/compiler/prelude/TysPrim.hs deleted file mode 100644 index a5f17870f9..0000000000 --- a/compiler/prelude/TysPrim.hs +++ /dev/null @@ -1,1110 +0,0 @@ -{- -(c) The AQUA Project, Glasgow University, 1994-1998 - - -\section[TysPrim]{Wired-in knowledge about primitive types} --} - -{-# LANGUAGE CPP #-} -{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-} - --- | This module defines TyCons that can't be expressed in Haskell. --- They are all, therefore, wired-in TyCons. C.f module TysWiredIn -module TysPrim( - mkPrimTyConName, -- For implicit parameters in TysWiredIn only - - mkTemplateKindVars, mkTemplateTyVars, mkTemplateTyVarsFrom, - mkTemplateKiTyVars, mkTemplateKiTyVar, - - mkTemplateTyConBinders, mkTemplateKindTyConBinders, - mkTemplateAnonTyConBinders, - - alphaTyVars, alphaTyVar, betaTyVar, gammaTyVar, deltaTyVar, - alphaTys, alphaTy, betaTy, gammaTy, deltaTy, - alphaTyVarsUnliftedRep, alphaTyVarUnliftedRep, - alphaTysUnliftedRep, alphaTyUnliftedRep, - runtimeRep1TyVar, runtimeRep2TyVar, runtimeRep1Ty, runtimeRep2Ty, - openAlphaTy, openBetaTy, openAlphaTyVar, openBetaTyVar, - - -- Kind constructors... - tYPETyCon, tYPETyConName, - - -- Kinds - tYPE, primRepToRuntimeRep, - - funTyCon, funTyConName, - unexposedPrimTyCons, exposedPrimTyCons, primTyCons, - - charPrimTyCon, charPrimTy, charPrimTyConName, - intPrimTyCon, intPrimTy, intPrimTyConName, - wordPrimTyCon, wordPrimTy, wordPrimTyConName, - addrPrimTyCon, addrPrimTy, addrPrimTyConName, - floatPrimTyCon, floatPrimTy, floatPrimTyConName, - doublePrimTyCon, doublePrimTy, doublePrimTyConName, - - voidPrimTyCon, voidPrimTy, - statePrimTyCon, mkStatePrimTy, - realWorldTyCon, realWorldTy, realWorldStatePrimTy, - - proxyPrimTyCon, mkProxyPrimTy, - - arrayPrimTyCon, mkArrayPrimTy, - byteArrayPrimTyCon, byteArrayPrimTy, - arrayArrayPrimTyCon, mkArrayArrayPrimTy, - smallArrayPrimTyCon, mkSmallArrayPrimTy, - mutableArrayPrimTyCon, mkMutableArrayPrimTy, - mutableByteArrayPrimTyCon, mkMutableByteArrayPrimTy, - mutableArrayArrayPrimTyCon, mkMutableArrayArrayPrimTy, - smallMutableArrayPrimTyCon, mkSmallMutableArrayPrimTy, - mutVarPrimTyCon, mkMutVarPrimTy, - - mVarPrimTyCon, mkMVarPrimTy, - tVarPrimTyCon, mkTVarPrimTy, - stablePtrPrimTyCon, mkStablePtrPrimTy, - stableNamePrimTyCon, mkStableNamePrimTy, - compactPrimTyCon, compactPrimTy, - bcoPrimTyCon, bcoPrimTy, - weakPrimTyCon, mkWeakPrimTy, - threadIdPrimTyCon, threadIdPrimTy, - - int8PrimTyCon, int8PrimTy, int8PrimTyConName, - word8PrimTyCon, word8PrimTy, word8PrimTyConName, - - int16PrimTyCon, int16PrimTy, int16PrimTyConName, - word16PrimTyCon, word16PrimTy, word16PrimTyConName, - - int32PrimTyCon, int32PrimTy, int32PrimTyConName, - word32PrimTyCon, word32PrimTy, word32PrimTyConName, - - int64PrimTyCon, int64PrimTy, int64PrimTyConName, - word64PrimTyCon, word64PrimTy, word64PrimTyConName, - - eqPrimTyCon, -- ty1 ~# ty2 - eqReprPrimTyCon, -- ty1 ~R# ty2 (at role Representational) - eqPhantPrimTyCon, -- ty1 ~P# ty2 (at role Phantom) - equalityTyCon, - - -- * SIMD -#include "primop-vector-tys-exports.hs-incl" - ) where - -#include "HsVersions.h" - -import GhcPrelude - -import {-# SOURCE #-} TysWiredIn - ( runtimeRepTy, unboxedTupleKind, liftedTypeKind - , vecRepDataConTyCon, tupleRepDataConTyCon - , liftedRepDataConTy, unliftedRepDataConTy - , intRepDataConTy - , int8RepDataConTy, int16RepDataConTy, int32RepDataConTy, int64RepDataConTy - , wordRepDataConTy - , word16RepDataConTy, word8RepDataConTy, word32RepDataConTy, word64RepDataConTy - , addrRepDataConTy - , floatRepDataConTy, doubleRepDataConTy - , vec2DataConTy, vec4DataConTy, vec8DataConTy, vec16DataConTy, vec32DataConTy - , vec64DataConTy - , int8ElemRepDataConTy, int16ElemRepDataConTy, int32ElemRepDataConTy - , int64ElemRepDataConTy, word8ElemRepDataConTy, word16ElemRepDataConTy - , word32ElemRepDataConTy, word64ElemRepDataConTy, floatElemRepDataConTy - , doubleElemRepDataConTy - , mkPromotedListTy ) - -import GHC.Types.Var ( TyVar, mkTyVar ) -import GHC.Types.Name -import GHC.Core.TyCon -import GHC.Types.SrcLoc -import GHC.Types.Unique -import PrelNames -import FastString -import Outputable -import GHC.Core.TyCo.Rep -- Doesn't need special access, but this is easier to avoid - -- import loops which show up if you import Type instead - -import Data.Char - -{- -************************************************************************ -* * -\subsection{Primitive type constructors} -* * -************************************************************************ --} - -primTyCons :: [TyCon] -primTyCons = unexposedPrimTyCons ++ exposedPrimTyCons - --- | Primitive 'TyCon's that are defined in "GHC.Prim" but not exposed. --- It's important to keep these separate as we don't want users to be able to --- write them (see #15209) or see them in GHCi's @:browse@ output --- (see #12023). -unexposedPrimTyCons :: [TyCon] -unexposedPrimTyCons - = [ eqPrimTyCon - , eqReprPrimTyCon - , eqPhantPrimTyCon - ] - --- | Primitive 'TyCon's that are defined in, and exported from, "GHC.Prim". -exposedPrimTyCons :: [TyCon] -exposedPrimTyCons - = [ addrPrimTyCon - , arrayPrimTyCon - , byteArrayPrimTyCon - , arrayArrayPrimTyCon - , smallArrayPrimTyCon - , charPrimTyCon - , doublePrimTyCon - , floatPrimTyCon - , intPrimTyCon - , int8PrimTyCon - , int16PrimTyCon - , int32PrimTyCon - , int64PrimTyCon - , bcoPrimTyCon - , weakPrimTyCon - , mutableArrayPrimTyCon - , mutableByteArrayPrimTyCon - , mutableArrayArrayPrimTyCon - , smallMutableArrayPrimTyCon - , mVarPrimTyCon - , tVarPrimTyCon - , mutVarPrimTyCon - , realWorldTyCon - , stablePtrPrimTyCon - , stableNamePrimTyCon - , compactPrimTyCon - , statePrimTyCon - , voidPrimTyCon - , proxyPrimTyCon - , threadIdPrimTyCon - , wordPrimTyCon - , word8PrimTyCon - , word16PrimTyCon - , word32PrimTyCon - , word64PrimTyCon - - , tYPETyCon - -#include "primop-vector-tycons.hs-incl" - ] - -mkPrimTc :: FastString -> Unique -> TyCon -> Name -mkPrimTc fs unique tycon - = mkWiredInName gHC_PRIM (mkTcOccFS fs) - unique - (ATyCon tycon) -- Relevant TyCon - UserSyntax - -mkBuiltInPrimTc :: FastString -> Unique -> TyCon -> Name -mkBuiltInPrimTc fs unique tycon - = mkWiredInName gHC_PRIM (mkTcOccFS fs) - unique - (ATyCon tycon) -- Relevant TyCon - BuiltInSyntax - - -charPrimTyConName, intPrimTyConName, int8PrimTyConName, int16PrimTyConName, int32PrimTyConName, int64PrimTyConName, wordPrimTyConName, word32PrimTyConName, word8PrimTyConName, word16PrimTyConName, word64PrimTyConName, addrPrimTyConName, floatPrimTyConName, doublePrimTyConName, statePrimTyConName, proxyPrimTyConName, realWorldTyConName, arrayPrimTyConName, arrayArrayPrimTyConName, smallArrayPrimTyConName, byteArrayPrimTyConName, mutableArrayPrimTyConName, mutableByteArrayPrimTyConName, mutableArrayArrayPrimTyConName, smallMutableArrayPrimTyConName, mutVarPrimTyConName, mVarPrimTyConName, tVarPrimTyConName, stablePtrPrimTyConName, stableNamePrimTyConName, compactPrimTyConName, bcoPrimTyConName, weakPrimTyConName, threadIdPrimTyConName, eqPrimTyConName, eqReprPrimTyConName, eqPhantPrimTyConName, voidPrimTyConName :: Name -charPrimTyConName = mkPrimTc (fsLit "Char#") charPrimTyConKey charPrimTyCon -intPrimTyConName = mkPrimTc (fsLit "Int#") intPrimTyConKey intPrimTyCon -int8PrimTyConName = mkPrimTc (fsLit "Int8#") int8PrimTyConKey int8PrimTyCon -int16PrimTyConName = mkPrimTc (fsLit "Int16#") int16PrimTyConKey int16PrimTyCon -int32PrimTyConName = mkPrimTc (fsLit "Int32#") int32PrimTyConKey int32PrimTyCon -int64PrimTyConName = mkPrimTc (fsLit "Int64#") int64PrimTyConKey int64PrimTyCon -wordPrimTyConName = mkPrimTc (fsLit "Word#") wordPrimTyConKey wordPrimTyCon -word8PrimTyConName = mkPrimTc (fsLit "Word8#") word8PrimTyConKey word8PrimTyCon -word16PrimTyConName = mkPrimTc (fsLit "Word16#") word16PrimTyConKey word16PrimTyCon -word32PrimTyConName = mkPrimTc (fsLit "Word32#") word32PrimTyConKey word32PrimTyCon -word64PrimTyConName = mkPrimTc (fsLit "Word64#") word64PrimTyConKey word64PrimTyCon -addrPrimTyConName = mkPrimTc (fsLit "Addr#") addrPrimTyConKey addrPrimTyCon -floatPrimTyConName = mkPrimTc (fsLit "Float#") floatPrimTyConKey floatPrimTyCon -doublePrimTyConName = mkPrimTc (fsLit "Double#") doublePrimTyConKey doublePrimTyCon -statePrimTyConName = mkPrimTc (fsLit "State#") statePrimTyConKey statePrimTyCon -voidPrimTyConName = mkPrimTc (fsLit "Void#") voidPrimTyConKey voidPrimTyCon -proxyPrimTyConName = mkPrimTc (fsLit "Proxy#") proxyPrimTyConKey proxyPrimTyCon -eqPrimTyConName = mkPrimTc (fsLit "~#") eqPrimTyConKey eqPrimTyCon -eqReprPrimTyConName = mkBuiltInPrimTc (fsLit "~R#") eqReprPrimTyConKey eqReprPrimTyCon -eqPhantPrimTyConName = mkBuiltInPrimTc (fsLit "~P#") eqPhantPrimTyConKey eqPhantPrimTyCon -realWorldTyConName = mkPrimTc (fsLit "RealWorld") realWorldTyConKey realWorldTyCon -arrayPrimTyConName = mkPrimTc (fsLit "Array#") arrayPrimTyConKey arrayPrimTyCon -byteArrayPrimTyConName = mkPrimTc (fsLit "ByteArray#") byteArrayPrimTyConKey byteArrayPrimTyCon -arrayArrayPrimTyConName = mkPrimTc (fsLit "ArrayArray#") arrayArrayPrimTyConKey arrayArrayPrimTyCon -smallArrayPrimTyConName = mkPrimTc (fsLit "SmallArray#") smallArrayPrimTyConKey smallArrayPrimTyCon -mutableArrayPrimTyConName = mkPrimTc (fsLit "MutableArray#") mutableArrayPrimTyConKey mutableArrayPrimTyCon -mutableByteArrayPrimTyConName = mkPrimTc (fsLit "MutableByteArray#") mutableByteArrayPrimTyConKey mutableByteArrayPrimTyCon -mutableArrayArrayPrimTyConName= mkPrimTc (fsLit "MutableArrayArray#") mutableArrayArrayPrimTyConKey mutableArrayArrayPrimTyCon -smallMutableArrayPrimTyConName= mkPrimTc (fsLit "SmallMutableArray#") smallMutableArrayPrimTyConKey smallMutableArrayPrimTyCon -mutVarPrimTyConName = mkPrimTc (fsLit "MutVar#") mutVarPrimTyConKey mutVarPrimTyCon -mVarPrimTyConName = mkPrimTc (fsLit "MVar#") mVarPrimTyConKey mVarPrimTyCon -tVarPrimTyConName = mkPrimTc (fsLit "TVar#") tVarPrimTyConKey tVarPrimTyCon -stablePtrPrimTyConName = mkPrimTc (fsLit "StablePtr#") stablePtrPrimTyConKey stablePtrPrimTyCon -stableNamePrimTyConName = mkPrimTc (fsLit "StableName#") stableNamePrimTyConKey stableNamePrimTyCon -compactPrimTyConName = mkPrimTc (fsLit "Compact#") compactPrimTyConKey compactPrimTyCon -bcoPrimTyConName = mkPrimTc (fsLit "BCO") bcoPrimTyConKey bcoPrimTyCon -weakPrimTyConName = mkPrimTc (fsLit "Weak#") weakPrimTyConKey weakPrimTyCon -threadIdPrimTyConName = mkPrimTc (fsLit "ThreadId#") threadIdPrimTyConKey threadIdPrimTyCon - -{- -************************************************************************ -* * -\subsection{Support code} -* * -************************************************************************ - -alphaTyVars is a list of type variables for use in templates: - ["a", "b", ..., "z", "t1", "t2", ... ] --} - -mkTemplateKindVar :: Kind -> TyVar -mkTemplateKindVar = mkTyVar (mk_tv_name 0 "k") - -mkTemplateKindVars :: [Kind] -> [TyVar] --- k0 with unique (mkAlphaTyVarUnique 0) --- k1 with unique (mkAlphaTyVarUnique 1) --- ... etc -mkTemplateKindVars [kind] = [mkTemplateKindVar kind] - -- Special case for one kind: just "k" -mkTemplateKindVars kinds - = [ mkTyVar (mk_tv_name u ('k' : show u)) kind - | (kind, u) <- kinds `zip` [0..] ] -mk_tv_name :: Int -> String -> Name -mk_tv_name u s = mkInternalName (mkAlphaTyVarUnique u) - (mkTyVarOccFS (mkFastString s)) - noSrcSpan - -mkTemplateTyVarsFrom :: Int -> [Kind] -> [TyVar] --- a with unique (mkAlphaTyVarUnique n) --- b with unique (mkAlphaTyVarUnique n+1) --- ... etc --- Typically called as --- mkTemplateTyVarsFrom (length kv_bndrs) kinds --- where kv_bndrs are the kind-level binders of a TyCon -mkTemplateTyVarsFrom n kinds - = [ mkTyVar name kind - | (kind, index) <- zip kinds [0..], - let ch_ord = index + ord 'a' - name_str | ch_ord <= ord 'z' = [chr ch_ord] - | otherwise = 't':show index - name = mk_tv_name (index + n) name_str - ] - -mkTemplateTyVars :: [Kind] -> [TyVar] -mkTemplateTyVars = mkTemplateTyVarsFrom 1 - -mkTemplateTyConBinders - :: [Kind] -- [k1, .., kn] Kinds of kind-forall'd vars - -> ([Kind] -> [Kind]) -- Arg is [kv1:k1, ..., kvn:kn] - -- same length as first arg - -- Result is anon arg kinds - -> [TyConBinder] -mkTemplateTyConBinders kind_var_kinds mk_anon_arg_kinds - = kv_bndrs ++ tv_bndrs - where - kv_bndrs = mkTemplateKindTyConBinders kind_var_kinds - anon_kinds = mk_anon_arg_kinds (mkTyVarTys (binderVars kv_bndrs)) - tv_bndrs = mkTemplateAnonTyConBindersFrom (length kv_bndrs) anon_kinds - -mkTemplateKiTyVars - :: [Kind] -- [k1, .., kn] Kinds of kind-forall'd vars - -> ([Kind] -> [Kind]) -- Arg is [kv1:k1, ..., kvn:kn] - -- same length as first arg - -- Result is anon arg kinds [ak1, .., akm] - -> [TyVar] -- [kv1:k1, ..., kvn:kn, av1:ak1, ..., avm:akm] --- Example: if you want the tyvars for --- forall (r:RuntimeRep) (a:TYPE r) (b:*). blah --- call mkTemplateKiTyVars [RuntimeRep] (\[r] -> [TYPE r, *]) -mkTemplateKiTyVars kind_var_kinds mk_arg_kinds - = kv_bndrs ++ tv_bndrs - where - kv_bndrs = mkTemplateKindVars kind_var_kinds - anon_kinds = mk_arg_kinds (mkTyVarTys kv_bndrs) - tv_bndrs = mkTemplateTyVarsFrom (length kv_bndrs) anon_kinds - -mkTemplateKiTyVar - :: Kind -- [k1, .., kn] Kind of kind-forall'd var - -> (Kind -> [Kind]) -- Arg is kv1:k1 - -- Result is anon arg kinds [ak1, .., akm] - -> [TyVar] -- [kv1:k1, ..., kvn:kn, av1:ak1, ..., avm:akm] --- Example: if you want the tyvars for --- forall (r:RuntimeRep) (a:TYPE r) (b:*). blah --- call mkTemplateKiTyVar RuntimeRep (\r -> [TYPE r, *]) -mkTemplateKiTyVar kind mk_arg_kinds - = kv_bndr : tv_bndrs - where - kv_bndr = mkTemplateKindVar kind - anon_kinds = mk_arg_kinds (mkTyVarTy kv_bndr) - tv_bndrs = mkTemplateTyVarsFrom 1 anon_kinds - -mkTemplateKindTyConBinders :: [Kind] -> [TyConBinder] --- Makes named, Specified binders -mkTemplateKindTyConBinders kinds = [mkNamedTyConBinder Specified tv | tv <- mkTemplateKindVars kinds] - -mkTemplateAnonTyConBinders :: [Kind] -> [TyConBinder] -mkTemplateAnonTyConBinders kinds = mkAnonTyConBinders VisArg (mkTemplateTyVars kinds) - -mkTemplateAnonTyConBindersFrom :: Int -> [Kind] -> [TyConBinder] -mkTemplateAnonTyConBindersFrom n kinds = mkAnonTyConBinders VisArg (mkTemplateTyVarsFrom n kinds) - -alphaTyVars :: [TyVar] -alphaTyVars = mkTemplateTyVars $ repeat liftedTypeKind - -alphaTyVar, betaTyVar, gammaTyVar, deltaTyVar :: TyVar -(alphaTyVar:betaTyVar:gammaTyVar:deltaTyVar:_) = alphaTyVars - -alphaTys :: [Type] -alphaTys = mkTyVarTys alphaTyVars -alphaTy, betaTy, gammaTy, deltaTy :: Type -(alphaTy:betaTy:gammaTy:deltaTy:_) = alphaTys - -alphaTyVarsUnliftedRep :: [TyVar] -alphaTyVarsUnliftedRep = mkTemplateTyVars $ repeat (tYPE unliftedRepDataConTy) - -alphaTyVarUnliftedRep :: TyVar -(alphaTyVarUnliftedRep:_) = alphaTyVarsUnliftedRep - -alphaTysUnliftedRep :: [Type] -alphaTysUnliftedRep = mkTyVarTys alphaTyVarsUnliftedRep -alphaTyUnliftedRep :: Type -(alphaTyUnliftedRep:_) = alphaTysUnliftedRep - -runtimeRep1TyVar, runtimeRep2TyVar :: TyVar -(runtimeRep1TyVar : runtimeRep2TyVar : _) - = drop 16 (mkTemplateTyVars (repeat runtimeRepTy)) -- selects 'q','r' - -runtimeRep1Ty, runtimeRep2Ty :: Type -runtimeRep1Ty = mkTyVarTy runtimeRep1TyVar -runtimeRep2Ty = mkTyVarTy runtimeRep2TyVar - -openAlphaTyVar, openBetaTyVar :: TyVar --- alpha :: TYPE r1 --- beta :: TYPE r2 -[openAlphaTyVar,openBetaTyVar] - = mkTemplateTyVars [tYPE runtimeRep1Ty, tYPE runtimeRep2Ty] - -openAlphaTy, openBetaTy :: Type -openAlphaTy = mkTyVarTy openAlphaTyVar -openBetaTy = mkTyVarTy openBetaTyVar - -{- -************************************************************************ -* * - FunTyCon -* * -************************************************************************ --} - -funTyConName :: Name -funTyConName = mkPrimTyConName (fsLit "->") funTyConKey funTyCon - --- | The @(->)@ type constructor. --- --- @ --- (->) :: forall (rep1 :: RuntimeRep) (rep2 :: RuntimeRep). --- TYPE rep1 -> TYPE rep2 -> * --- @ -funTyCon :: TyCon -funTyCon = mkFunTyCon funTyConName tc_bndrs tc_rep_nm - where - tc_bndrs = [ mkNamedTyConBinder Inferred runtimeRep1TyVar - , mkNamedTyConBinder Inferred runtimeRep2TyVar ] - ++ mkTemplateAnonTyConBinders [ tYPE runtimeRep1Ty - , tYPE runtimeRep2Ty - ] - tc_rep_nm = mkPrelTyConRepName funTyConName - -{- -************************************************************************ -* * - Kinds -* * -************************************************************************ - -Note [TYPE and RuntimeRep] -~~~~~~~~~~~~~~~~~~~~~~~~~~ -All types that classify values have a kind of the form (TYPE rr), where - - data RuntimeRep -- Defined in ghc-prim:GHC.Types - = LiftedRep - | UnliftedRep - | IntRep - | FloatRep - .. etc .. - - rr :: RuntimeRep - - TYPE :: RuntimeRep -> TYPE 'LiftedRep -- Built in - -So for example: - Int :: TYPE 'LiftedRep - Array# Int :: TYPE 'UnliftedRep - Int# :: TYPE 'IntRep - Float# :: TYPE 'FloatRep - Maybe :: TYPE 'LiftedRep -> TYPE 'LiftedRep - (# , #) :: TYPE r1 -> TYPE r2 -> TYPE (TupleRep [r1, r2]) - -We abbreviate '*' specially: - type * = TYPE 'LiftedRep - -The 'rr' parameter tells us how the value is represented at runtime. - -Generally speaking, you can't be polymorphic in 'rr'. E.g - f :: forall (rr:RuntimeRep) (a:TYPE rr). a -> [a] - f = /\(rr:RuntimeRep) (a:rr) \(a:rr). ... -This is no good: we could not generate code code for 'f', because the -calling convention for 'f' varies depending on whether the argument is -a a Int, Int#, or Float#. (You could imagine generating specialised -code, one for each instantiation of 'rr', but we don't do that.) - -Certain functions CAN be runtime-rep-polymorphic, because the code -generator never has to manipulate a value of type 'a :: TYPE rr'. - -* error :: forall (rr:RuntimeRep) (a:TYPE rr). String -> a - Code generator never has to manipulate the return value. - -* unsafeCoerce#, defined in Desugar.mkUnsafeCoercePair: - Always inlined to be a no-op - unsafeCoerce# :: forall (r1 :: RuntimeRep) (r2 :: RuntimeRep) - (a :: TYPE r1) (b :: TYPE r2). - a -> b - -* Unboxed tuples, and unboxed sums, defined in TysWiredIn - Always inlined, and hence specialised to the call site - (#,#) :: forall (r1 :: RuntimeRep) (r2 :: RuntimeRep) - (a :: TYPE r1) (b :: TYPE r2). - a -> b -> TYPE ('TupleRep '[r1, r2]) - -Note [PrimRep and kindPrimRep] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -As part of its source code, in GHC.Core.TyCon, GHC has - data PrimRep = LiftedRep | UnliftedRep | IntRep | FloatRep | ...etc... - -Notice that - * RuntimeRep is part of the syntax tree of the program being compiled - (defined in a library: ghc-prim:GHC.Types) - * PrimRep is part of GHC's source code. - (defined in GHC.Core.TyCon) - -We need to get from one to the other; that is what kindPrimRep does. -Suppose we have a value - (v :: t) where (t :: k) -Given this kind - k = TyConApp "TYPE" [rep] -GHC needs to be able to figure out how 'v' is represented at runtime. -It expects 'rep' to be form - TyConApp rr_dc args -where 'rr_dc' is a promoteed data constructor from RuntimeRep. So -now we need to go from 'dc' to the corresponding PrimRep. We store this -PrimRep in the promoted data constructor itself: see TyCon.promDcRepInfo. - --} - -tYPETyCon :: TyCon -tYPETyConName :: Name - -tYPETyCon = mkKindTyCon tYPETyConName - (mkTemplateAnonTyConBinders [runtimeRepTy]) - liftedTypeKind - [Nominal] - (mkPrelTyConRepName tYPETyConName) - --------------------------- --- ... and now their names - --- If you edit these, you may need to update the GHC formalism --- See Note [GHC Formalism] in GHC.Core.Lint -tYPETyConName = mkPrimTyConName (fsLit "TYPE") tYPETyConKey tYPETyCon - -mkPrimTyConName :: FastString -> Unique -> TyCon -> Name -mkPrimTyConName = mkPrimTcName BuiltInSyntax - -- All of the super kinds and kinds are defined in Prim, - -- and use BuiltInSyntax, because they are never in scope in the source - -mkPrimTcName :: BuiltInSyntax -> FastString -> Unique -> TyCon -> Name -mkPrimTcName built_in_syntax occ key tycon - = mkWiredInName gHC_PRIM (mkTcOccFS occ) key (ATyCon tycon) built_in_syntax - ------------------------------ --- | Given a RuntimeRep, applies TYPE to it. --- see Note [TYPE and RuntimeRep] -tYPE :: Type -> Type -tYPE rr = TyConApp tYPETyCon [rr] - -{- -************************************************************************ -* * -\subsection[TysPrim-basic]{Basic primitive types (@Char#@, @Int#@, etc.)} -* * -************************************************************************ --} - --- only used herein -pcPrimTyCon :: Name -> [Role] -> PrimRep -> TyCon -pcPrimTyCon name roles rep - = mkPrimTyCon name binders result_kind roles - where - binders = mkTemplateAnonTyConBinders (map (const liftedTypeKind) roles) - result_kind = tYPE (primRepToRuntimeRep rep) - --- | Convert a 'PrimRep' to a 'Type' of kind RuntimeRep --- Defined here to avoid (more) module loops -primRepToRuntimeRep :: PrimRep -> Type -primRepToRuntimeRep rep = case rep of - VoidRep -> TyConApp tupleRepDataConTyCon [mkPromotedListTy runtimeRepTy []] - LiftedRep -> liftedRepDataConTy - UnliftedRep -> unliftedRepDataConTy - IntRep -> intRepDataConTy - Int8Rep -> int8RepDataConTy - Int16Rep -> int16RepDataConTy - Int32Rep -> int32RepDataConTy - Int64Rep -> int64RepDataConTy - WordRep -> wordRepDataConTy - Word8Rep -> word8RepDataConTy - Word16Rep -> word16RepDataConTy - Word32Rep -> word32RepDataConTy - Word64Rep -> word64RepDataConTy - AddrRep -> addrRepDataConTy - FloatRep -> floatRepDataConTy - DoubleRep -> doubleRepDataConTy - VecRep n elem -> TyConApp vecRepDataConTyCon [n', elem'] - where - n' = case n of - 2 -> vec2DataConTy - 4 -> vec4DataConTy - 8 -> vec8DataConTy - 16 -> vec16DataConTy - 32 -> vec32DataConTy - 64 -> vec64DataConTy - _ -> pprPanic "Disallowed VecCount" (ppr n) - - elem' = case elem of - Int8ElemRep -> int8ElemRepDataConTy - Int16ElemRep -> int16ElemRepDataConTy - Int32ElemRep -> int32ElemRepDataConTy - Int64ElemRep -> int64ElemRepDataConTy - Word8ElemRep -> word8ElemRepDataConTy - Word16ElemRep -> word16ElemRepDataConTy - Word32ElemRep -> word32ElemRepDataConTy - Word64ElemRep -> word64ElemRepDataConTy - FloatElemRep -> floatElemRepDataConTy - DoubleElemRep -> doubleElemRepDataConTy - -pcPrimTyCon0 :: Name -> PrimRep -> TyCon -pcPrimTyCon0 name rep - = pcPrimTyCon name [] rep - -charPrimTy :: Type -charPrimTy = mkTyConTy charPrimTyCon -charPrimTyCon :: TyCon -charPrimTyCon = pcPrimTyCon0 charPrimTyConName WordRep - -intPrimTy :: Type -intPrimTy = mkTyConTy intPrimTyCon -intPrimTyCon :: TyCon -intPrimTyCon = pcPrimTyCon0 intPrimTyConName IntRep - -int8PrimTy :: Type -int8PrimTy = mkTyConTy int8PrimTyCon -int8PrimTyCon :: TyCon -int8PrimTyCon = pcPrimTyCon0 int8PrimTyConName Int8Rep - -int16PrimTy :: Type -int16PrimTy = mkTyConTy int16PrimTyCon -int16PrimTyCon :: TyCon -int16PrimTyCon = pcPrimTyCon0 int16PrimTyConName Int16Rep - -int32PrimTy :: Type -int32PrimTy = mkTyConTy int32PrimTyCon -int32PrimTyCon :: TyCon -int32PrimTyCon = pcPrimTyCon0 int32PrimTyConName Int32Rep - -int64PrimTy :: Type -int64PrimTy = mkTyConTy int64PrimTyCon -int64PrimTyCon :: TyCon -int64PrimTyCon = pcPrimTyCon0 int64PrimTyConName Int64Rep - -wordPrimTy :: Type -wordPrimTy = mkTyConTy wordPrimTyCon -wordPrimTyCon :: TyCon -wordPrimTyCon = pcPrimTyCon0 wordPrimTyConName WordRep - -word8PrimTy :: Type -word8PrimTy = mkTyConTy word8PrimTyCon -word8PrimTyCon :: TyCon -word8PrimTyCon = pcPrimTyCon0 word8PrimTyConName Word8Rep - -word16PrimTy :: Type -word16PrimTy = mkTyConTy word16PrimTyCon -word16PrimTyCon :: TyCon -word16PrimTyCon = pcPrimTyCon0 word16PrimTyConName Word16Rep - -word32PrimTy :: Type -word32PrimTy = mkTyConTy word32PrimTyCon -word32PrimTyCon :: TyCon -word32PrimTyCon = pcPrimTyCon0 word32PrimTyConName Word32Rep - -word64PrimTy :: Type -word64PrimTy = mkTyConTy word64PrimTyCon -word64PrimTyCon :: TyCon -word64PrimTyCon = pcPrimTyCon0 word64PrimTyConName Word64Rep - -addrPrimTy :: Type -addrPrimTy = mkTyConTy addrPrimTyCon -addrPrimTyCon :: TyCon -addrPrimTyCon = pcPrimTyCon0 addrPrimTyConName AddrRep - -floatPrimTy :: Type -floatPrimTy = mkTyConTy floatPrimTyCon -floatPrimTyCon :: TyCon -floatPrimTyCon = pcPrimTyCon0 floatPrimTyConName FloatRep - -doublePrimTy :: Type -doublePrimTy = mkTyConTy doublePrimTyCon -doublePrimTyCon :: TyCon -doublePrimTyCon = pcPrimTyCon0 doublePrimTyConName DoubleRep - -{- -************************************************************************ -* * -\subsection[TysPrim-state]{The @State#@ type (and @_RealWorld@ types)} -* * -************************************************************************ - -Note [The equality types story] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -GHC sports a veritable menagerie of equality types: - - Type or Lifted? Hetero? Role Built in Defining module - class? L/U TyCon ------------------------------------------------------------------------------------------ -~# T U hetero nominal eqPrimTyCon GHC.Prim -~~ C L hetero nominal heqTyCon GHC.Types -~ C L homo nominal eqTyCon GHC.Types -:~: T L homo nominal (not built-in) Data.Type.Equality -:~~: T L hetero nominal (not built-in) Data.Type.Equality - -~R# T U hetero repr eqReprPrimTy GHC.Prim -Coercible C L homo repr coercibleTyCon GHC.Types -Coercion T L homo repr (not built-in) Data.Type.Coercion -~P# T U hetero phantom eqPhantPrimTyCon GHC.Prim - -Recall that "hetero" means the equality can related types of different -kinds. Knowing that (t1 ~# t2) or (t1 ~R# t2) or even that (t1 ~P# t2) -also means that (k1 ~# k2), where (t1 :: k1) and (t2 :: k2). - -To produce less confusion for end users, when not dumping and without --fprint-equality-relations, each of these groups is printed as the bottommost -listed equality. That is, (~#) and (~~) are both rendered as (~) in -error messages, and (~R#) is rendered as Coercible. - -Let's take these one at a time: - - -------------------------- - (~#) :: forall k1 k2. k1 -> k2 -> # - -------------------------- -This is The Type Of Equality in GHC. It classifies nominal coercions. -This type is used in the solver for recording equality constraints. -It responds "yes" to Type.isEqPrimPred and classifies as an EqPred in -Type.classifyPredType. - -All wanted constraints of this type are built with coercion holes. -(See Note [Coercion holes] in GHC.Core.TyCo.Rep.) But see also -Note [Deferred errors for coercion holes] in GHC.Tc.Errors to see how -equality constraints are deferred. - -Within GHC, ~# is called eqPrimTyCon, and it is defined in TysPrim. - - - -------------------------- - (~~) :: forall k1 k2. k1 -> k2 -> Constraint - -------------------------- -This is (almost) an ordinary class, defined as if by - class a ~# b => a ~~ b - instance a ~# b => a ~~ b -Here's what's unusual about it: - - * We can't actually declare it that way because we don't have syntax for ~#. - And ~# isn't a constraint, so even if we could write it, it wouldn't kind - check. - - * Users cannot write instances of it. - - * It is "naturally coherent". This means that the solver won't hesitate to - solve a goal of type (a ~~ b) even if there is, say (Int ~~ c) in the - context. (Normally, it waits to learn more, just in case the given - influences what happens next.) See Note [Naturally coherent classes] - in GHC.Tc.Solver.Interact. - - * It always terminates. That is, in the UndecidableInstances checks, we - don't worry if a (~~) constraint is too big, as we know that solving - equality terminates. - -On the other hand, this behaves just like any class w.r.t. eager superclass -unpacking in the solver. So a lifted equality given quickly becomes an unlifted -equality given. This is good, because the solver knows all about unlifted -equalities. There is some special-casing in GHC.Tc.Solver.Interact.matchClassInst to -pretend that there is an instance of this class, as we can't write the instance -in Haskell. - -Within GHC, ~~ is called heqTyCon, and it is defined in TysWiredIn. - - - -------------------------- - (~) :: forall k. k -> k -> Constraint - -------------------------- -This is /exactly/ like (~~), except with a homogeneous kind. -It is an almost-ordinary class defined as if by - class a ~# b => (a :: k) ~ (b :: k) - instance a ~# b => a ~ b - - * All the bullets for (~~) apply - - * In addition (~) is magical syntax, as ~ is a reserved symbol. - It cannot be exported or imported. - -Within GHC, ~ is called eqTyCon, and it is defined in TysWiredIn. - -Historical note: prior to July 18 (~) was defined as a - more-ordinary class with (~~) as a superclass. But that made it - special in different ways; and the extra superclass selections to - get from (~) to (~#) via (~~) were tiresome. Now it's defined - uniformly with (~~) and Coercible; much nicer.) - - - -------------------------- - (:~:) :: forall k. k -> k -> * - (:~~:) :: forall k1 k2. k1 -> k2 -> * - -------------------------- -These are perfectly ordinary GADTs, wrapping (~) and (~~) resp. -They are not defined within GHC at all. - - - -------------------------- - (~R#) :: forall k1 k2. k1 -> k2 -> # - -------------------------- -The is the representational analogue of ~#. This is the type of representational -equalities that the solver works on. All wanted constraints of this type are -built with coercion holes. - -Within GHC, ~R# is called eqReprPrimTyCon, and it is defined in TysPrim. - - - -------------------------- - Coercible :: forall k. k -> k -> Constraint - -------------------------- -This is quite like (~~) in the way it's defined and treated within GHC, but -it's homogeneous. Homogeneity helps with type inference (as GHC can solve one -kind from the other) and, in my (Richard's) estimation, will be more intuitive -for users. - -An alternative design included HCoercible (like (~~)) and Coercible (like (~)). -One annoyance was that we want `coerce :: Coercible a b => a -> b`, and -we need the type of coerce to be fully wired-in. So the HCoercible/Coercible -split required that both types be fully wired-in. Instead of doing this, -I just got rid of HCoercible, as I'm not sure who would use it, anyway. - -Within GHC, Coercible is called coercibleTyCon, and it is defined in -TysWiredIn. - - - -------------------------- - Coercion :: forall k. k -> k -> * - -------------------------- -This is a perfectly ordinary GADT, wrapping Coercible. It is not defined -within GHC at all. - - - -------------------------- - (~P#) :: forall k1 k2. k1 -> k2 -> # - -------------------------- -This is the phantom analogue of ~# and it is barely used at all. -(The solver has no idea about this one.) Here is the motivation: - - data Phant a = MkPhant - type role Phant phantom - - Phant <Int, Bool>_P :: Phant Int ~P# Phant Bool - -We just need to have something to put on that last line. You probably -don't need to worry about it. - - - -Note [The State# TyCon] -~~~~~~~~~~~~~~~~~~~~~~~ -State# is the primitive, unlifted type of states. It has one type parameter, -thus - State# RealWorld -or - State# s - -where s is a type variable. The only purpose of the type parameter is to -keep different state threads separate. It is represented by nothing at all. - -The type parameter to State# is intended to keep separate threads separate. -Even though this parameter is not used in the definition of State#, it is -given role Nominal to enforce its intended use. --} - -mkStatePrimTy :: Type -> Type -mkStatePrimTy ty = TyConApp statePrimTyCon [ty] - -statePrimTyCon :: TyCon -- See Note [The State# TyCon] -statePrimTyCon = pcPrimTyCon statePrimTyConName [Nominal] VoidRep - -{- -RealWorld is deeply magical. It is *primitive*, but it is not -*unlifted* (hence ptrArg). We never manipulate values of type -RealWorld; it's only used in the type system, to parameterise State#. --} - -realWorldTyCon :: TyCon -realWorldTyCon = mkLiftedPrimTyCon realWorldTyConName [] liftedTypeKind [] -realWorldTy :: Type -realWorldTy = mkTyConTy realWorldTyCon -realWorldStatePrimTy :: Type -realWorldStatePrimTy = mkStatePrimTy realWorldTy -- State# RealWorld - --- Note: the ``state-pairing'' types are not truly primitive, --- so they are defined in \tr{TysWiredIn.hs}, not here. - - -voidPrimTy :: Type -voidPrimTy = TyConApp voidPrimTyCon [] - -voidPrimTyCon :: TyCon -voidPrimTyCon = pcPrimTyCon voidPrimTyConName [] VoidRep - -mkProxyPrimTy :: Type -> Type -> Type -mkProxyPrimTy k ty = TyConApp proxyPrimTyCon [k, ty] - -proxyPrimTyCon :: TyCon -proxyPrimTyCon = mkPrimTyCon proxyPrimTyConName binders res_kind [Nominal,Phantom] - where - -- Kind: forall k. k -> TYPE (Tuple '[]) - binders = mkTemplateTyConBinders [liftedTypeKind] id - res_kind = unboxedTupleKind [] - - -{- ********************************************************************* -* * - Primitive equality constraints - See Note [The equality types story] -* * -********************************************************************* -} - -eqPrimTyCon :: TyCon -- The representation type for equality predicates - -- See Note [The equality types story] -eqPrimTyCon = mkPrimTyCon eqPrimTyConName binders res_kind roles - where - -- Kind :: forall k1 k2. k1 -> k2 -> TYPE (Tuple '[]) - binders = mkTemplateTyConBinders [liftedTypeKind, liftedTypeKind] id - res_kind = unboxedTupleKind [] - roles = [Nominal, Nominal, Nominal, Nominal] - --- like eqPrimTyCon, but the type for *Representational* coercions --- this should only ever appear as the type of a covar. Its role is --- interpreted in coercionRole -eqReprPrimTyCon :: TyCon -- See Note [The equality types story] -eqReprPrimTyCon = mkPrimTyCon eqReprPrimTyConName binders res_kind roles - where - -- Kind :: forall k1 k2. k1 -> k2 -> TYPE (Tuple '[]) - binders = mkTemplateTyConBinders [liftedTypeKind, liftedTypeKind] id - res_kind = unboxedTupleKind [] - roles = [Nominal, Nominal, Representational, Representational] - --- like eqPrimTyCon, but the type for *Phantom* coercions. --- This is only used to make higher-order equalities. Nothing --- should ever actually have this type! -eqPhantPrimTyCon :: TyCon -eqPhantPrimTyCon = mkPrimTyCon eqPhantPrimTyConName binders res_kind roles - where - -- Kind :: forall k1 k2. k1 -> k2 -> TYPE (Tuple '[]) - binders = mkTemplateTyConBinders [liftedTypeKind, liftedTypeKind] id - res_kind = unboxedTupleKind [] - roles = [Nominal, Nominal, Phantom, Phantom] - --- | Given a Role, what TyCon is the type of equality predicates at that role? -equalityTyCon :: Role -> TyCon -equalityTyCon Nominal = eqPrimTyCon -equalityTyCon Representational = eqReprPrimTyCon -equalityTyCon Phantom = eqPhantPrimTyCon - -{- ********************************************************************* -* * - The primitive array types -* * -********************************************************************* -} - -arrayPrimTyCon, mutableArrayPrimTyCon, mutableByteArrayPrimTyCon, - byteArrayPrimTyCon, arrayArrayPrimTyCon, mutableArrayArrayPrimTyCon, - smallArrayPrimTyCon, smallMutableArrayPrimTyCon :: TyCon -arrayPrimTyCon = pcPrimTyCon arrayPrimTyConName [Representational] UnliftedRep -mutableArrayPrimTyCon = pcPrimTyCon mutableArrayPrimTyConName [Nominal, Representational] UnliftedRep -mutableByteArrayPrimTyCon = pcPrimTyCon mutableByteArrayPrimTyConName [Nominal] UnliftedRep -byteArrayPrimTyCon = pcPrimTyCon0 byteArrayPrimTyConName UnliftedRep -arrayArrayPrimTyCon = pcPrimTyCon0 arrayArrayPrimTyConName UnliftedRep -mutableArrayArrayPrimTyCon = pcPrimTyCon mutableArrayArrayPrimTyConName [Nominal] UnliftedRep -smallArrayPrimTyCon = pcPrimTyCon smallArrayPrimTyConName [Representational] UnliftedRep -smallMutableArrayPrimTyCon = pcPrimTyCon smallMutableArrayPrimTyConName [Nominal, Representational] UnliftedRep - -mkArrayPrimTy :: Type -> Type -mkArrayPrimTy elt = TyConApp arrayPrimTyCon [elt] -byteArrayPrimTy :: Type -byteArrayPrimTy = mkTyConTy byteArrayPrimTyCon -mkArrayArrayPrimTy :: Type -mkArrayArrayPrimTy = mkTyConTy arrayArrayPrimTyCon -mkSmallArrayPrimTy :: Type -> Type -mkSmallArrayPrimTy elt = TyConApp smallArrayPrimTyCon [elt] -mkMutableArrayPrimTy :: Type -> Type -> Type -mkMutableArrayPrimTy s elt = TyConApp mutableArrayPrimTyCon [s, elt] -mkMutableByteArrayPrimTy :: Type -> Type -mkMutableByteArrayPrimTy s = TyConApp mutableByteArrayPrimTyCon [s] -mkMutableArrayArrayPrimTy :: Type -> Type -mkMutableArrayArrayPrimTy s = TyConApp mutableArrayArrayPrimTyCon [s] -mkSmallMutableArrayPrimTy :: Type -> Type -> Type -mkSmallMutableArrayPrimTy s elt = TyConApp smallMutableArrayPrimTyCon [s, elt] - - -{- ********************************************************************* -* * - The mutable variable type -* * -********************************************************************* -} - -mutVarPrimTyCon :: TyCon -mutVarPrimTyCon = pcPrimTyCon mutVarPrimTyConName [Nominal, Representational] UnliftedRep - -mkMutVarPrimTy :: Type -> Type -> Type -mkMutVarPrimTy s elt = TyConApp mutVarPrimTyCon [s, elt] - -{- -************************************************************************ -* * -\subsection[TysPrim-synch-var]{The synchronizing variable type} -* * -************************************************************************ --} - -mVarPrimTyCon :: TyCon -mVarPrimTyCon = pcPrimTyCon mVarPrimTyConName [Nominal, Representational] UnliftedRep - -mkMVarPrimTy :: Type -> Type -> Type -mkMVarPrimTy s elt = TyConApp mVarPrimTyCon [s, elt] - -{- -************************************************************************ -* * -\subsection[TysPrim-stm-var]{The transactional variable type} -* * -************************************************************************ --} - -tVarPrimTyCon :: TyCon -tVarPrimTyCon = pcPrimTyCon tVarPrimTyConName [Nominal, Representational] UnliftedRep - -mkTVarPrimTy :: Type -> Type -> Type -mkTVarPrimTy s elt = TyConApp tVarPrimTyCon [s, elt] - -{- -************************************************************************ -* * -\subsection[TysPrim-stable-ptrs]{The stable-pointer type} -* * -************************************************************************ --} - -stablePtrPrimTyCon :: TyCon -stablePtrPrimTyCon = pcPrimTyCon stablePtrPrimTyConName [Representational] AddrRep - -mkStablePtrPrimTy :: Type -> Type -mkStablePtrPrimTy ty = TyConApp stablePtrPrimTyCon [ty] - -{- -************************************************************************ -* * -\subsection[TysPrim-stable-names]{The stable-name type} -* * -************************************************************************ --} - -stableNamePrimTyCon :: TyCon -stableNamePrimTyCon = pcPrimTyCon stableNamePrimTyConName [Phantom] UnliftedRep - -mkStableNamePrimTy :: Type -> Type -mkStableNamePrimTy ty = TyConApp stableNamePrimTyCon [ty] - -{- -************************************************************************ -* * -\subsection[TysPrim-compact-nfdata]{The Compact NFData (CNF) type} -* * -************************************************************************ --} - -compactPrimTyCon :: TyCon -compactPrimTyCon = pcPrimTyCon0 compactPrimTyConName UnliftedRep - -compactPrimTy :: Type -compactPrimTy = mkTyConTy compactPrimTyCon - -{- -************************************************************************ -* * -\subsection[TysPrim-BCOs]{The ``bytecode object'' type} -* * -************************************************************************ --} - --- Unlike most other primitive types, BCO is lifted. This is because in --- general a BCO may be a thunk for the reasons given in Note [Updatable CAF --- BCOs] in GHCi.CreateBCO. -bcoPrimTy :: Type -bcoPrimTy = mkTyConTy bcoPrimTyCon -bcoPrimTyCon :: TyCon -bcoPrimTyCon = pcPrimTyCon0 bcoPrimTyConName LiftedRep - -{- -************************************************************************ -* * -\subsection[TysPrim-Weak]{The ``weak pointer'' type} -* * -************************************************************************ --} - -weakPrimTyCon :: TyCon -weakPrimTyCon = pcPrimTyCon weakPrimTyConName [Representational] UnliftedRep - -mkWeakPrimTy :: Type -> Type -mkWeakPrimTy v = TyConApp weakPrimTyCon [v] - -{- -************************************************************************ -* * -\subsection[TysPrim-thread-ids]{The ``thread id'' type} -* * -************************************************************************ - -A thread id is represented by a pointer to the TSO itself, to ensure -that they are always unique and we can always find the TSO for a given -thread id. However, this has the unfortunate consequence that a -ThreadId# for a given thread is treated as a root by the garbage -collector and can keep TSOs around for too long. - -Hence the programmer API for thread manipulation uses a weak pointer -to the thread id internally. --} - -threadIdPrimTy :: Type -threadIdPrimTy = mkTyConTy threadIdPrimTyCon -threadIdPrimTyCon :: TyCon -threadIdPrimTyCon = pcPrimTyCon0 threadIdPrimTyConName UnliftedRep - -{- -************************************************************************ -* * -\subsection{SIMD vector types} -* * -************************************************************************ --} - -#include "primop-vector-tys.hs-incl" |