X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2FbasicTypes%2FMkId.lhs;h=774c9199e4056401f6731e427098f90a12adf6e3;hp=68bafde6cee1ed116bab9949dd4af93646d75803;hb=7fc01c4671980ea3c66d549c0ece4d82fd3f5ade;hpb=dffadd63e0e0015782e211909961f76a8abf2ddc diff --git a/compiler/basicTypes/MkId.lhs b/compiler/basicTypes/MkId.lhs index 68bafde..774c919 100644 --- a/compiler/basicTypes/MkId.lhs +++ b/compiler/basicTypes/MkId.lhs @@ -1,4 +1,4 @@ -\% +% % (c) The University of Glasgow 2006 % (c) The AQUA Project, Glasgow University, 1998 % @@ -6,25 +6,17 @@ This module contains definitions for the IdInfo for things that have a standard form, namely: -* data constructors -* record selectors -* method and superclass selectors -* primitive operations +- data constructors +- record selectors +- method and superclass selectors +- primitive operations \begin{code} -{-# OPTIONS -fno-warn-missing-signatures #-} --- The above warning supression flag is a temporary kludge. --- While working on this module you are encouraged to remove it and fix --- any warnings in the module. See --- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings --- for details - module MkId ( mkDictFunId, mkDefaultMethodId, mkDictSelId, mkDataConIds, - mkRecordSelId, mkPrimOpId, mkFCallId, mkTickBoxOpId, mkBreakPointOpId, mkReboxingAlt, wrapNewTypeBody, unwrapNewTypeBody, @@ -33,47 +25,35 @@ module MkId ( -- And some particular Ids; see below for why they are wired in wiredInIds, ghcPrimIds, - unsafeCoerceId, realWorldPrimId, voidArgId, nullAddrId, seqId, - lazyId, lazyIdUnfolding, lazyIdKey, - - mkRuntimeErrorApp, - rEC_CON_ERROR_ID, iRREFUT_PAT_ERROR_ID, rUNTIME_ERROR_ID, - nON_EXHAUSTIVE_GUARDS_ERROR_ID, nO_METHOD_BINDING_ERROR_ID, - pAT_ERROR_ID, eRROR_ID, - - unsafeCoerceName + unsafeCoerceName, unsafeCoerceId, realWorldPrimId, + voidArgId, nullAddrId, seqId, lazyId, lazyIdKey ) where #include "HsVersions.h" import Rules import TysPrim -import TysWiredIn import PrelRules import Type -import TypeRep -import TcGadt import Coercion import TcType -import CoreUtils +import MkCore +import CoreUtils ( exprType, mkCoerce ) import CoreUnfold import Literal import TyCon import Class import VarSet import Name -import OccName import PrimOp import ForeignCall import DataCon import Id -import Var ( Var, TyVar, mkCoVar) +import Var ( Var, TyVar, mkCoVar, mkExportedLocalVar ) import IdInfo -import NewDemand -import DmdAnal +import Demand import CoreSyn import Unique -import Maybes import PrelNames import BasicTypes hiding ( SuccessFlag(..) ) import Util @@ -89,34 +69,47 @@ import Module %* * %************************************************************************ +Note [Wired-in Ids] +~~~~~~~~~~~~~~~~~~~ +There are several reasons why an Id might appear in the wiredInIds: + +(1) The ghcPrimIds are wired in because they can't be defined in + Haskell at all, although the can be defined in Core. They have + compulsory unfoldings, so they are always inlined and they have + no definition site. Their home module is GHC.Prim, so they + also have a description in primops.txt.pp, where they are called + 'pseudoops'. + +(2) The 'error' function, eRROR_ID, is wired in because we don't yet have + a way to express in an interface file that the result type variable + is 'open'; that is can be unified with an unboxed type + + [The interface file format now carry such information, but there's + no way yet of expressing at the definition site for these + error-reporting functions that they have an 'open' + result type. -- sof 1/99] + +(3) Other error functions (rUNTIME_ERROR_ID) are wired in (a) because + the desugarer generates code that mentiones them directly, and + (b) for the same reason as eRROR_ID + +(4) lazyId is wired in because the wired-in version overrides the + strictness of the version defined in GHC.Base + +In cases (2-4), the function has a definition in a library module, and +can be called; but the wired-in version means that the details are +never read from that module's interface file; instead, the full definition +is right here. + \begin{code} +wiredInIds :: [Id] wiredInIds - = [ -- These error-y things are wired in because we don't yet have - -- a way to express in an interface file that the result type variable - -- is 'open'; that is can be unified with an unboxed type - -- - -- [The interface file format now carry such information, but there's - -- no way yet of expressing at the definition site for these - -- error-reporting functions that they have an 'open' - -- result type. -- sof 1/99] - - eRROR_ID, -- This one isn't used anywhere else in the compiler - -- But we still need it in wiredInIds so that when GHC - -- compiles a program that mentions 'error' we don't - -- import its type from the interface file; we just get - -- the Id defined here. Which has an 'open-tyvar' type. - - rUNTIME_ERROR_ID, - iRREFUT_PAT_ERROR_ID, - nON_EXHAUSTIVE_GUARDS_ERROR_ID, - nO_METHOD_BINDING_ERROR_ID, - pAT_ERROR_ID, - rEC_CON_ERROR_ID, - - lazyId - ] ++ ghcPrimIds + = [lazyId] + ++ errorIds -- Defined in MkCore + ++ ghcPrimIds -- These Ids are exported from GHC.Prim +ghcPrimIds :: [Id] ghcPrimIds = [ -- These can't be defined in Haskell, but they have -- perfectly reasonable unfoldings in Core @@ -186,7 +179,7 @@ tyConFamInst_maybe). A coercion allows you to move between representation and family type. It is accessible from :R123Map via tyConFamilyCoercion_maybe and has kind - Co123Map a b v :: {Map (a, b) v :=: :R123Map a b v} + Co123Map a b v :: {Map (a, b) v ~ :R123Map a b v} The wrapper and worker of MapPair get the types @@ -203,10 +196,8 @@ It's a bit more complicated if the data instance is a GADT as well! data instance T [a] where T1 :: forall b. b -> T [Maybe b] -Hence - Co7T a :: T [a] ~ :R7T a -Now we want +Hence we translate to -- Wrapper $WT1 :: forall b. b -> T [Maybe b] @@ -216,15 +207,18 @@ Now we want -- Worker T1 :: forall c b. (c ~ Maybe b) => b -> :R7T c + -- Coercion from family type to representation type + Co7T a :: T [a] ~ :R7T a + \begin{code} mkDataConIds :: Name -> Name -> DataCon -> DataConIds mkDataConIds wrap_name wkr_name data_con | isNewTyCon tycon -- Newtype, only has a worker = DCIds Nothing nt_work_id - | any isMarkedStrict all_strict_marks -- Algebraic, needs wrapper - || not (null eq_spec) -- NB: LoadIface.ifaceDeclSubBndrs - || isFamInstTyCon tycon -- depends on this test + | any isBanged all_strict_marks -- Algebraic, needs wrapper + || not (null eq_spec) -- NB: LoadIface.ifaceDeclSubBndrs + || isFamInstTyCon tycon -- depends on this test = DCIds (Just alg_wrap_id) wrk_id | otherwise -- Algebraic, no wrapper @@ -243,7 +237,7 @@ mkDataConIds wrap_name wkr_name data_con wkr_arity = dataConRepArity data_con wkr_info = noCafIdInfo `setArityInfo` wkr_arity - `setAllStrictnessInfo` Just wkr_sig + `setStrictnessInfo` Just wkr_sig `setUnfoldingInfo` evaldUnfolding -- Record that it's evaluated, -- even if arity = 0 @@ -278,23 +272,14 @@ mkDataConIds wrap_name wkr_name data_con nt_work_info = noCafIdInfo -- The NoCaf-ness is set by noCafIdInfo `setArityInfo` 1 -- Arity 1 `setUnfoldingInfo` newtype_unf - newtype_unf = -- The assertion below is no longer correct: - -- there may be a dict theta rather than a singleton orig_arg_ty - -- ASSERT( isVanillaDataCon data_con && - -- isSingleton orig_arg_tys ) - -- - -- No existentials on a newtype, but it can have a context - -- e.g. newtype Eq a => T a = MkT (...) + id_arg1 = mkTemplateLocal 1 (head orig_arg_tys) + newtype_unf = ASSERT2( isVanillaDataCon data_con && + isSingleton orig_arg_tys, ppr data_con ) + -- Note [Newtype datacons] mkCompulsoryUnfolding $ mkLams wrap_tvs $ Lam id_arg1 $ - wrapNewTypeBody tycon res_ty_args - (Var id_arg1) + wrapNewTypeBody tycon res_ty_args (Var id_arg1) - id_arg1 = mkTemplateLocal 1 - (if null orig_arg_tys - then ASSERT(not (null $ dataConDictTheta data_con)) mkPredTy $ head (dataConDictTheta data_con) - else head orig_arg_tys - ) ----------- Wrapper -------------- -- We used to include the stupid theta in the wrapper's args @@ -316,13 +301,13 @@ mkDataConIds wrap_name wkr_name data_con -- It's important to specify the arity, so that partial -- applications are treated as values `setUnfoldingInfo` wrap_unf - `setAllStrictnessInfo` Just wrap_sig + `setStrictnessInfo` Just wrap_sig all_strict_marks = dataConExStricts data_con ++ dataConStrictMarks data_con wrap_sig = mkStrictSig (mkTopDmdType arg_dmds cpr_info) arg_dmds = map mk_dmd all_strict_marks - mk_dmd str | isMarkedStrict str = evalDmd - | otherwise = lazyDmd + mk_dmd str | isBanged str = evalDmd + | otherwise = lazyDmd -- The Cpr info can be important inside INLINE rhss, where the -- wrapper constructor isn't inlined. -- And the argument strictness can be important too; we @@ -332,13 +317,13 @@ mkDataConIds wrap_name wkr_name data_con -- ...(let w = C x in ...(w p q)...)... -- we want to see that w is strict in its two arguments - wrap_unf = mkTopUnfolding $ Note InlineMe $ - mkLams wrap_tvs $ - mkLams eq_args $ - mkLams dict_args $ mkLams id_args $ - foldr mk_case con_app - (zip (dict_args ++ id_args) all_strict_marks) - i3 [] + wrap_unf = mkInlineRule wrap_rhs (Just (length dict_args + length id_args)) + wrap_rhs = mkLams wrap_tvs $ + mkLams eq_args $ + mkLams dict_args $ mkLams id_args $ + foldr mk_case con_app + (zip (dict_args ++ id_args) all_strict_marks) + i3 [] con_app _ rep_ids = wrapFamInstBody tycon res_ty_args $ Var wrk_id `mkTyApps` res_ty_args @@ -355,27 +340,26 @@ mkDataConIds wrap_name wkr_name data_con mkCoVarLocals i [] = ([],i) mkCoVarLocals i (x:xs) = let (ys,j) = mkCoVarLocals (i+1) xs - y = mkCoVar (mkSysTvName (mkBuiltinUnique i) FSLIT("dc_co")) x + y = mkCoVar (mkSysTvName (mkBuiltinUnique i) + (fsLit "dc_co")) x in (y:ys,j) mk_case - :: (Id, StrictnessMark) -- Arg, strictness + :: (Id, HsBang) -- Arg, strictness -> (Int -> [Id] -> CoreExpr) -- Body -> Int -- Next rep arg id -> [Id] -- Rep args so far, reversed -> CoreExpr mk_case (arg,strict) body i rep_args = case strict of - NotMarkedStrict -> body i (arg:rep_args) - MarkedStrict - | isUnLiftedType (idType arg) -> body i (arg:rep_args) - | otherwise -> - Case (Var arg) arg res_ty [(DEFAULT,[], body i (arg:rep_args))] - - MarkedUnboxed - -> unboxProduct i (Var arg) (idType arg) the_body + HsNoBang -> body i (arg:rep_args) + HsUnpack -> unboxProduct i (Var arg) (idType arg) the_body where the_body i con_args = body i (reverse con_args ++ rep_args) + _other -- HsUnpackFailed and HsStrict + | isUnLiftedType (idType arg) -> body i (arg:rep_args) + | otherwise -> Case (Var arg) arg res_ty + [(DEFAULT,[], body i (arg:rep_args))] mAX_CPR_SIZE :: Arity mAX_CPR_SIZE = 10 @@ -388,290 +372,151 @@ mAX_CPR_SIZE = 10 -- by the caller. So doing CPR for them may in fact make -- things worse. +mkLocals :: Int -> [Type] -> ([Id], Int) mkLocals i tys = (zipWith mkTemplateLocal [i..i+n-1] tys, i+n) where n = length tys \end{code} +Note [Newtype datacons] +~~~~~~~~~~~~~~~~~~~~~~~ +The "data constructor" for a newtype should always be vanilla. At one +point this wasn't true, because the newtype arising from + class C a => D a +looked like + newtype T:D a = D:D (C a) +so the data constructor for T:C had a single argument, namely the +predicate (C a). But now we treat that as an ordinary argument, not +part of the theta-type, so all is well. + %************************************************************************ %* * -\subsection{Record selectors} +\subsection{Dictionary selectors} %* * %************************************************************************ -We're going to build a record selector unfolding that looks like this: - - data T a b c = T1 { ..., op :: a, ...} - | T2 { ..., op :: a, ...} - | T3 - - sel = /\ a b c -> \ d -> case d of - T1 ... x ... -> x - T2 ... x ... -> x - other -> error "..." - -Similarly for newtypes - - newtype N a = MkN { unN :: a->a } - - unN :: N a -> a -> a - unN n = coerce (a->a) n - -We need to take a little care if the field has a polymorphic type: +Selecting a field for a dictionary. If there is just one field, then +there's nothing to do. - data R = R { f :: forall a. a->a } +Dictionary selectors may get nested forall-types. Thus: -Then we want + class Foo a where + op :: forall b. Ord b => a -> b -> b - f :: forall a. R -> a -> a - f = /\ a \ r = case r of - R f -> f a +Then the top-level type for op is -(not f :: R -> forall a. a->a, which gives the type inference mechanism -problems at call sites) + op :: forall a. Foo a => + forall b. Ord b => + a -> b -> b -Similarly for (recursive) newtypes +This is unlike ordinary record selectors, which have all the for-alls +at the outside. When dealing with classes it's very convenient to +recover the original type signature from the class op selector. - newtype N = MkN { unN :: forall a. a->a } +\begin{code} +mkDictSelId :: Bool -- True <=> don't include the unfolding + -- Little point on imports without -O, because the + -- dictionary itself won't be visible + -> Name -- Name of one of the *value* selectors + -- (dictionary superclass or method) + -> Class -> Id +mkDictSelId no_unf name clas + = mkGlobalId (ClassOpId clas) name sel_ty info + where + sel_ty = mkForAllTys tyvars (mkFunTy (idType dict_id) (idType the_arg_id)) + -- We can't just say (exprType rhs), because that would give a type + -- C a -> C a + -- for a single-op class (after all, the selector is the identity) + -- But it's type must expose the representation of the dictionary + -- to get (say) C a -> (a -> a) - unN :: forall b. N -> b -> b - unN = /\b -> \n:N -> (coerce (forall a. a->a) n) + base_info = noCafIdInfo + `setArityInfo` 1 + `setStrictnessInfo` Just strict_sig + `setUnfoldingInfo` (if no_unf then noUnfolding + else mkImplicitUnfolding rhs) + -- In module where class op is defined, we must add + -- the unfolding, even though it'll never be inlined + -- becuase we use that to generate a top-level binding + -- for the ClassOp + + info = base_info `setSpecInfo` mkSpecInfo [rule] + `setInlinePragInfo` neverInlinePragma + -- Add a magic BuiltinRule, and never inline it + -- so that the rule is always available to fire. + -- See Note [ClassOp/DFun selection] in TcInstDcls + + n_ty_args = length tyvars + + -- This is the built-in rule that goes + -- op (dfT d1 d2) ---> opT d1 d2 + rule = BuiltinRule { ru_name = fsLit "Class op " `appendFS` + occNameFS (getOccName name) + , ru_fn = name + , ru_nargs = n_ty_args + 1 + , ru_try = dictSelRule val_index n_ty_args n_eq_args } + -- The strictness signature is of the form U(AAAVAAAA) -> T + -- where the V depends on which item we are selecting + -- It's worth giving one, so that absence info etc is generated + -- even if the selector isn't inlined + strict_sig = mkStrictSig (mkTopDmdType [arg_dmd] TopRes) + arg_dmd | new_tycon = evalDmd + | otherwise = Eval (Prod [ if the_arg_id == id then evalDmd else Abs + | id <- arg_ids ]) + + tycon = classTyCon clas + new_tycon = isNewTyCon tycon + [data_con] = tyConDataCons tycon + tyvars = dataConUnivTyVars data_con + arg_tys = dataConRepArgTys data_con -- Includes the dictionary superclasses + eq_theta = dataConEqTheta data_con + n_eq_args = length eq_theta + + -- 'index' is a 0-index into the *value* arguments of the dictionary + val_index = assoc "MkId.mkDictSelId" sel_index_prs name + sel_index_prs = map idName (classAllSelIds clas) `zip` [0..] + + the_arg_id = arg_ids !! val_index + pred = mkClassPred clas (mkTyVarTys tyvars) + dict_id = mkTemplateLocal 1 $ mkPredTy pred + arg_ids = mkTemplateLocalsNum 2 arg_tys + eq_ids = map mkWildEvBinder eq_theta -Note [Naughty record selectors] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -A "naughty" field is one for which we can't define a record -selector, because an existential type variable would escape. For example: - data T = forall a. MkT { x,y::a } -We obviously can't define - x (MkT v _) = v -Nevertheless we *do* put a RecordSelId into the type environment -so that if the user tries to use 'x' as a selector we can bleat -helpfully, rather than saying unhelpfully that 'x' is not in scope. -Hence the sel_naughty flag, to identify record selectors that don't really exist. + rhs = mkLams tyvars (Lam dict_id rhs_body) + rhs_body | new_tycon = unwrapNewTypeBody tycon (map mkTyVarTy tyvars) (Var dict_id) + | otherwise = Case (Var dict_id) dict_id (idType the_arg_id) + [(DataAlt data_con, eq_ids ++ arg_ids, Var the_arg_id)] + +dictSelRule :: Int -> Arity -> Arity + -> IdUnfoldingFun -> [CoreExpr] -> Maybe CoreExpr +-- Oh, very clever +-- sel_i t1..tk (df s1..sn d1..dm) = op_i_helper s1..sn d1..dm +-- sel_i t1..tk (D t1..tk op1 ... opm) = opi +-- +-- NB: the data constructor has the same number of type and +-- coercion args as the selector +-- +-- This only works for *value* superclasses +-- There are no selector functions for equality superclasses +dictSelRule val_index n_ty_args n_eq_args id_unf args + | (dict_arg : _) <- drop n_ty_args args + , Just (_, _, con_args) <- exprIsConApp_maybe id_unf dict_arg + , let val_args = drop n_eq_args con_args + = Just (val_args !! val_index) + | otherwise + = Nothing +\end{code} -In general, a field is naughty if its type mentions a type variable that -isn't in the result type of the constructor. -Note [GADT record selectors] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -For GADTs, we require that all constructors with a common field 'f' have the same -result type (modulo alpha conversion). [Checked in TcTyClsDecls.checkValidTyCon] -E.g. - data T where - T1 { f :: a } :: T [a] - T2 { f :: a, y :: b } :: T [a] -and now the selector takes that type as its argument: - f :: forall a. T [a] -> a - f t = case t of - T1 { f = v } -> v - T2 { f = v } -> v -Note the forall'd tyvars of the selector are just the free tyvars -of the result type; there may be other tyvars in the constructor's -type (e.g. 'b' in T2). - -Note [Selector running example] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -It's OK to combine GADTs and type families. Here's a running example: - - data instance T [a] where - T1 { fld :: b } :: T [Maybe b] - -The representation type looks like this - data :R7T a where - T1 { fld :: b } :: :R7T (Maybe b) - -and there's coercion from the family type to the representation type - :CoR7T a :: T [a] ~ :R7T a - -The selector we want for fld looks like this: - - fld :: forall b. T [Maybe b] -> b - fld = /\b. \(d::T [Maybe b]). - case d `cast` :CoR7T (Maybe b) of - T1 (x::b) -> x - -The scrutinee of the case has type :R7T (Maybe b), which can be -gotten by appying the eq_spec to the univ_tvs of the data con. +%************************************************************************ +%* * + Boxing and unboxing +%* * +%************************************************************************ \begin{code} -mkRecordSelId :: TyCon -> FieldLabel -> Id -mkRecordSelId tycon field_label - -- Assumes that all fields with the same field label have the same type - = sel_id - where - -- Because this function gets called by implicitTyThings, we need to - -- produce the OccName of the Id without doing any suspend type checks. - -- (see the note [Tricky iface loop]). - -- A suspended type-check is sometimes necessary to compute field_ty, - -- so we need to make sure that we suspend anything that depends on field_ty. - - -- the overall result - sel_id = mkGlobalId sel_id_details field_label theType theInfo - - -- check whether the type is naughty: this thunk does not get forced - -- until the type is actually needed - field_ty = dataConFieldType con1 field_label - is_naughty = not (tyVarsOfType field_ty `subVarSet` data_tv_set) - - -- it's important that this doesn't force the if - (theType, theInfo) = if is_naughty - -- Escapist case here for naughty constructors - -- We give it no IdInfo, and a type of - -- forall a.a (never looked at) - then (forall_a_a, noCafIdInfo) - -- otherwise do the real case - else (selector_ty, info) - - sel_id_details = RecordSelId { sel_tycon = tycon, - sel_label = field_label, - sel_naughty = is_naughty } - -- For a data type family, the tycon is the *instance* TyCon - - -- for naughty case - forall_a_a = mkForAllTy alphaTyVar (mkTyVarTy alphaTyVar) - - -- real case starts here: - data_cons = tyConDataCons tycon - data_cons_w_field = filter has_field data_cons -- Can't be empty! - has_field con = field_label `elem` dataConFieldLabels con - - con1 = ASSERT( not (null data_cons_w_field) ) head data_cons_w_field - (univ_tvs, _, eq_spec, _, _, _, data_ty) = dataConFullSig con1 - -- For a data type family, the data_ty (and hence selector_ty) mentions - -- only the family TyCon, not the instance TyCon - data_tv_set = tyVarsOfType data_ty - data_tvs = varSetElems data_tv_set - - -- *Very* tiresomely, the selectors are (unnecessarily!) overloaded over - -- just the dictionaries in the types of the constructors that contain - -- the relevant field. [The Report says that pattern matching on a - -- constructor gives the same constraints as applying it.] Urgh. - -- - -- However, not all data cons have all constraints (because of - -- BuildTyCl.mkDataConStupidTheta). So we need to find all the data cons - -- involved in the pattern match and take the union of their constraints. - stupid_dict_tys = mkPredTys (dataConsStupidTheta data_cons_w_field) - n_stupid_dicts = length stupid_dict_tys - - (field_tyvars,pre_field_theta,field_tau) = tcSplitSigmaTy field_ty - field_theta = filter (not . isEqPred) pre_field_theta - field_dict_tys = mkPredTys field_theta - n_field_dict_tys = length field_dict_tys - -- If the field has a universally quantified type we have to - -- be a bit careful. Suppose we have - -- data R = R { op :: forall a. Foo a => a -> a } - -- Then we can't give op the type - -- op :: R -> forall a. Foo a => a -> a - -- because the typechecker doesn't understand foralls to the - -- right of an arrow. The "right" type to give it is - -- op :: forall a. Foo a => R -> a -> a - -- But then we must generate the right unfolding too: - -- op = /\a -> \dfoo -> \ r -> - -- case r of - -- R op -> op a dfoo - -- Note that this is exactly the type we'd infer from a user defn - -- op (R op) = op - - selector_ty :: Type - selector_ty = mkForAllTys data_tvs $ mkForAllTys field_tyvars $ - mkFunTys stupid_dict_tys $ mkFunTys field_dict_tys $ - mkFunTy data_ty field_tau - - arity = 1 + n_stupid_dicts + n_field_dict_tys - - (strict_sig, rhs_w_str) = dmdAnalTopRhs sel_rhs - -- Use the demand analyser to work out strictness. - -- With all this unpackery it's not easy! - - info = noCafIdInfo - `setCafInfo` caf_info - `setArityInfo` arity - `setUnfoldingInfo` mkTopUnfolding rhs_w_str - `setAllStrictnessInfo` Just strict_sig - - -- Allocate Ids. We do it a funny way round because field_dict_tys is - -- almost always empty. Also note that we use max_dict_tys - -- rather than n_dict_tys, because the latter gives an infinite loop: - -- n_dict tys depends on the_alts, which depens on arg_ids, which depends - -- on arity, which depends on n_dict tys. Sigh! Mega sigh! - stupid_dict_ids = mkTemplateLocalsNum 1 stupid_dict_tys - max_stupid_dicts = length (tyConStupidTheta tycon) - field_dict_base = max_stupid_dicts + 1 - field_dict_ids = mkTemplateLocalsNum field_dict_base field_dict_tys - dict_id_base = field_dict_base + n_field_dict_tys - data_id = mkTemplateLocal dict_id_base data_ty - scrut_id = mkTemplateLocal (dict_id_base+1) scrut_ty - arg_base = dict_id_base + 2 - - the_alts :: [CoreAlt] - the_alts = map mk_alt data_cons_w_field -- Already sorted by data-con - no_default = length data_cons == length data_cons_w_field -- No default needed - - default_alt | no_default = [] - | otherwise = [(DEFAULT, [], error_expr)] - - -- The default branch may have CAF refs, because it calls recSelError etc. - caf_info | no_default = NoCafRefs - | otherwise = MayHaveCafRefs - - sel_rhs = mkLams data_tvs $ mkLams field_tyvars $ - mkLams stupid_dict_ids $ mkLams field_dict_ids $ - Lam data_id $ mk_result sel_body - - scrut_ty_args = substTyVars (mkTopTvSubst eq_spec) univ_tvs - scrut_ty = mkTyConApp tycon scrut_ty_args - scrut = unwrapFamInstScrut tycon scrut_ty_args (Var data_id) - -- First coerce from the type family to the representation type - - -- NB: A newtype always has a vanilla DataCon; no existentials etc - -- data_tys will simply be the dataConUnivTyVars - sel_body | isNewTyCon tycon = unwrapNewTypeBody tycon scrut_ty_args scrut - | otherwise = Case scrut scrut_id field_ty (default_alt ++ the_alts) - - mk_result poly_result = mkVarApps (mkVarApps poly_result field_tyvars) field_dict_ids - -- We pull the field lambdas to the top, so we need to - -- apply them in the body. For example: - -- data T = MkT { foo :: forall a. a->a } - -- - -- foo :: forall a. T -> a -> a - -- foo = /\a. \t:T. case t of { MkT f -> f a } - - mk_alt data_con - = ASSERT2( data_ty `tcEqType` field_ty, ppr data_con $$ ppr data_ty $$ ppr field_ty ) - mkReboxingAlt rebox_uniqs data_con (ex_tvs ++ co_tvs ++ arg_vs) rhs - where - -- get pattern binders with types appropriately instantiated - arg_uniqs = map mkBuiltinUnique [arg_base..] - (ex_tvs, co_tvs, arg_vs) = dataConOrigInstPat arg_uniqs data_con scrut_ty_args - - rebox_base = arg_base + length ex_tvs + length co_tvs + length arg_vs - rebox_uniqs = map mkBuiltinUnique [rebox_base..] - - -- data T :: *->* where T1 { fld :: Maybe b } -> T [b] - -- Hence T1 :: forall a b. (a=[b]) => b -> T a - -- fld :: forall b. T [b] -> Maybe b - -- fld = /\b.\(t:T[b]). case t of - -- T1 b' (c : [b]=[b']) (x:Maybe b') - -- -> x `cast` Maybe (sym (right c)) - - - -- Generate the refinement for b'=b, - -- and apply to (Maybe b'), to get (Maybe b) - Succeeded refinement = gadtRefine emptyRefinement ex_tvs co_tvs - the_arg_id_ty = idType the_arg_id - (rhs, data_ty) = case refineType refinement the_arg_id_ty of - Just (co, data_ty) -> (Cast (Var the_arg_id) co, data_ty) - Nothing -> (Var the_arg_id, the_arg_id_ty) - - field_vs = filter (not . isPredTy . idType) arg_vs - the_arg_id = assoc "mkRecordSelId:mk_alt" (field_lbls `zip` field_vs) field_label - field_lbls = dataConFieldLabels data_con - - error_expr = mkRuntimeErrorApp rEC_SEL_ERROR_ID field_ty full_msg - full_msg = showSDoc (sep [text "No match in record selector", ppr sel_id]) - -- unbox a product type... -- we will recurse into newtypes, casting along the way, and unbox at the -- first product data constructor we find. e.g. @@ -726,7 +571,7 @@ reboxProduct us ty us' = dropList con_arg_tys us - arg_ids = zipWith (mkSysLocal FSLIT("rb")) us con_arg_tys + arg_ids = zipWith (mkSysLocal (fsLit "rb")) us con_arg_tys bind_rhs = mkProductBox arg_ids ty @@ -784,7 +629,7 @@ mkReboxingAlt us con args rhs -- Type variable case go (arg:args) stricts us - | isTyVar arg + | isTyCoVar arg = let (binds, args') = go args stricts us in (binds, arg:args') @@ -805,83 +650,6 @@ mkReboxingAlt us con args rhs %************************************************************************ %* * -\subsection{Dictionary selectors} -%* * -%************************************************************************ - -Selecting a field for a dictionary. If there is just one field, then -there's nothing to do. - -Dictionary selectors may get nested forall-types. Thus: - - class Foo a where - op :: forall b. Ord b => a -> b -> b - -Then the top-level type for op is - - op :: forall a. Foo a => - forall b. Ord b => - a -> b -> b - -This is unlike ordinary record selectors, which have all the for-alls -at the outside. When dealing with classes it's very convenient to -recover the original type signature from the class op selector. - -\begin{code} -mkDictSelId :: Name -> Class -> Id -mkDictSelId name clas - = mkGlobalId (ClassOpId clas) name sel_ty info - where - sel_ty = mkForAllTys tyvars (mkFunTy (idType dict_id) (idType the_arg_id)) - -- We can't just say (exprType rhs), because that would give a type - -- C a -> C a - -- for a single-op class (after all, the selector is the identity) - -- But it's type must expose the representation of the dictionary - -- to get (say) C a -> (a -> a) - - info = noCafIdInfo - `setArityInfo` 1 - `setUnfoldingInfo` mkTopUnfolding rhs - `setAllStrictnessInfo` Just strict_sig - - -- We no longer use 'must-inline' on record selectors. They'll - -- inline like crazy if they scrutinise a constructor - - -- The strictness signature is of the form U(AAAVAAAA) -> T - -- where the V depends on which item we are selecting - -- It's worth giving one, so that absence info etc is generated - -- even if the selector isn't inlined - strict_sig = mkStrictSig (mkTopDmdType [arg_dmd] TopRes) - arg_dmd | isNewTyCon tycon = evalDmd - | otherwise = Eval (Prod [ if the_arg_id == id then evalDmd else Abs - | id <- arg_ids ]) - - tycon = classTyCon clas - [data_con] = tyConDataCons tycon - tyvars = dataConUnivTyVars data_con - arg_tys = {- ASSERT( isVanillaDataCon data_con ) -} dataConRepArgTys data_con - eq_theta = dataConEqTheta data_con - the_arg_id = assoc "MkId.mkDictSelId" (map idName (classSelIds clas) `zip` arg_ids) name - - pred = mkClassPred clas (mkTyVarTys tyvars) - dict_id = mkTemplateLocal 1 $ mkPredTy pred - (eq_ids,n) = mkCoVarLocals 2 $ mkPredTys eq_theta - arg_ids = mkTemplateLocalsNum n arg_tys - - mkCoVarLocals i [] = ([],i) - mkCoVarLocals i (x:xs) = let (ys,j) = mkCoVarLocals (i+1) xs - y = mkCoVar (mkSysTvName (mkBuiltinUnique i) FSLIT("dc_co")) x - in (y:ys,j) - - rhs = mkLams tyvars (Lam dict_id rhs_body) - rhs_body | isNewTyCon tycon = unwrapNewTypeBody tycon (map mkTyVarTy tyvars) (Var dict_id) - | otherwise = Case (Var dict_id) dict_id (idType the_arg_id) - [(DataAlt data_con, eq_ids ++ arg_ids, Var the_arg_id)] -\end{code} - - -%************************************************************************ -%* * Wrapping and unwrapping newtypes and type families %* * %************************************************************************ @@ -950,7 +718,7 @@ unwrapFamInstScrut tycon args scrut %************************************************************************ %* * -\subsection{Primitive operations +\subsection{Primitive operations} %* * %************************************************************************ @@ -969,7 +737,7 @@ mkPrimOpId prim_op info = noCafIdInfo `setSpecInfo` mkSpecInfo (primOpRules prim_op name) `setArityInfo` arity - `setAllStrictnessInfo` Just strict_sig + `setStrictnessInfo` Just strict_sig -- For each ccall we manufacture a separate CCallOpId, giving it -- a fresh unique, a type that is correct for this particular ccall, @@ -995,7 +763,7 @@ mkFCallId uniq fcall ty info = noCafIdInfo `setArityInfo` arity - `setAllStrictnessInfo` Just strict_sig + `setStrictnessInfo` Just strict_sig (_, tau) = tcSplitForAllTys ty (arg_tys, _) = tcSplitFunTys tau @@ -1018,6 +786,7 @@ mkBreakPointOpId :: Unique -> Module -> TickBoxId -> Id mkBreakPointOpId uniq mod ix = mkTickBox' uniq mod ix ty where ty = mkSigmaTy [openAlphaTyVar] [] openAlphaTy +mkTickBox' :: Unique -> Module -> TickBoxId -> Type -> Id mkTickBox' uniq mod ix ty = mkGlobalId (TickBoxOpId tickbox) name ty info where tickbox = TickBox mod ix @@ -1058,7 +827,10 @@ BUT make sure they are *exported* LocalIds (mkExportedLocalId) so that they aren't discarded by the occurrence analyser. \begin{code} -mkDefaultMethodId dm_name ty = mkExportedLocalId dm_name ty +mkDefaultMethodId :: Id -- Selector Id + -> Name -- Default method name + -> Id -- Default method Id +mkDefaultMethodId sel_id dm_name = mkExportedLocalId dm_name (idType sel_id) mkDictFunId :: Name -- Name to use for the dict fun; -> [TyVar] @@ -1068,37 +840,10 @@ mkDictFunId :: Name -- Name to use for the dict fun; -> Id mkDictFunId dfun_name inst_tyvars dfun_theta clas inst_tys - = mkExportedLocalId dfun_name dfun_ty + = mkExportedLocalVar (DFunId is_nt) dfun_name dfun_ty vanillaIdInfo where + is_nt = isNewTyCon (classTyCon clas) dfun_ty = mkSigmaTy inst_tyvars dfun_theta (mkDictTy clas inst_tys) - -{- 1 dec 99: disable the Mark Jones optimisation for the sake - of compatibility with Hugs. - See `types/InstEnv' for a discussion related to this. - - (class_tyvars, sc_theta, _, _) = classBigSig clas - not_const (clas, tys) = not (isEmptyVarSet (tyVarsOfTypes tys)) - sc_theta' = substClasses (zipTopTvSubst class_tyvars inst_tys) sc_theta - dfun_theta = case inst_decl_theta of - [] -> [] -- If inst_decl_theta is empty, then we don't - -- want to have any dict arguments, so that we can - -- expose the constant methods. - - other -> nub (inst_decl_theta ++ filter not_const sc_theta') - -- Otherwise we pass the superclass dictionaries to - -- the dictionary function; the Mark Jones optimisation. - -- - -- NOTE the "nub". I got caught by this one: - -- class Monad m => MonadT t m where ... - -- instance Monad m => MonadT (EnvT env) m where ... - -- Here, the inst_decl_theta has (Monad m); but so - -- does the sc_theta'! - -- - -- NOTE the "not_const". I got caught by this one too: - -- class Foo a => Baz a b where ... - -- instance Wob b => Baz T b where.. - -- Now sc_theta' has Foo T --} \end{code} @@ -1124,85 +869,150 @@ they can unify with both unlifted and lifted types. Hence we provide another gun with which to shoot yourself in the foot. \begin{code} -mkWiredInIdName mod fs uniq id - = mkWiredInName mod (mkOccNameFS varName fs) uniq (AnId id) UserSyntax - -unsafeCoerceName = mkWiredInIdName gHC_PRIM FSLIT("unsafeCoerce#") unsafeCoerceIdKey unsafeCoerceId -nullAddrName = mkWiredInIdName gHC_PRIM FSLIT("nullAddr#") nullAddrIdKey nullAddrId -seqName = mkWiredInIdName gHC_PRIM FSLIT("seq") seqIdKey seqId -realWorldName = mkWiredInIdName gHC_PRIM FSLIT("realWorld#") realWorldPrimIdKey realWorldPrimId -lazyIdName = mkWiredInIdName gHC_BASE FSLIT("lazy") lazyIdKey lazyId - -errorName = mkWiredInIdName gHC_ERR FSLIT("error") errorIdKey eRROR_ID -recSelErrorName = mkWiredInIdName gHC_ERR FSLIT("recSelError") recSelErrorIdKey rEC_SEL_ERROR_ID -runtimeErrorName = mkWiredInIdName gHC_ERR FSLIT("runtimeError") runtimeErrorIdKey rUNTIME_ERROR_ID -irrefutPatErrorName = mkWiredInIdName gHC_ERR FSLIT("irrefutPatError") irrefutPatErrorIdKey iRREFUT_PAT_ERROR_ID -recConErrorName = mkWiredInIdName gHC_ERR FSLIT("recConError") recConErrorIdKey rEC_CON_ERROR_ID -patErrorName = mkWiredInIdName gHC_ERR FSLIT("patError") patErrorIdKey pAT_ERROR_ID -noMethodBindingErrorName = mkWiredInIdName gHC_ERR FSLIT("noMethodBindingError") - noMethodBindingErrorIdKey nO_METHOD_BINDING_ERROR_ID -nonExhaustiveGuardsErrorName - = mkWiredInIdName gHC_ERR FSLIT("nonExhaustiveGuardsError") - nonExhaustiveGuardsErrorIdKey nON_EXHAUSTIVE_GUARDS_ERROR_ID +lazyIdName, unsafeCoerceName, nullAddrName, seqName, realWorldName :: Name +unsafeCoerceName = mkWiredInIdName gHC_PRIM (fsLit "unsafeCoerce#") unsafeCoerceIdKey unsafeCoerceId +nullAddrName = mkWiredInIdName gHC_PRIM (fsLit "nullAddr#") nullAddrIdKey nullAddrId +seqName = mkWiredInIdName gHC_PRIM (fsLit "seq") seqIdKey seqId +realWorldName = mkWiredInIdName gHC_PRIM (fsLit "realWorld#") realWorldPrimIdKey realWorldPrimId +lazyIdName = mkWiredInIdName gHC_BASE (fsLit "lazy") lazyIdKey lazyId \end{code} \begin{code} +------------------------------------------------ -- unsafeCoerce# :: forall a b. a -> b +unsafeCoerceId :: Id unsafeCoerceId = pcMiscPrelId unsafeCoerceName ty info where info = noCafIdInfo `setUnfoldingInfo` mkCompulsoryUnfolding rhs - ty = mkForAllTys [openAlphaTyVar,openBetaTyVar] - (mkFunTy openAlphaTy openBetaTy) - [x] = mkTemplateLocals [openAlphaTy] - rhs = mkLams [openAlphaTyVar,openBetaTyVar,x] $ - Cast (Var x) (mkUnsafeCoercion openAlphaTy openBetaTy) + ty = mkForAllTys [argAlphaTyVar,openBetaTyVar] + (mkFunTy argAlphaTy openBetaTy) + [x] = mkTemplateLocals [argAlphaTy] + rhs = mkLams [argAlphaTyVar,openBetaTyVar,x] $ + Cast (Var x) (mkUnsafeCoercion argAlphaTy openBetaTy) +------------------------------------------------ +nullAddrId :: Id -- nullAddr# :: Addr# -- The reason is is here is because we don't provide -- a way to write this literal in Haskell. -nullAddrId - = pcMiscPrelId nullAddrName addrPrimTy info +nullAddrId = pcMiscPrelId nullAddrName addrPrimTy info where info = noCafIdInfo `setUnfoldingInfo` mkCompulsoryUnfolding (Lit nullAddrLit) -seqId - = pcMiscPrelId seqName ty info +------------------------------------------------ +seqId :: Id -- See Note [seqId magic] +seqId = pcMiscPrelId seqName ty info where info = noCafIdInfo `setUnfoldingInfo` mkCompulsoryUnfolding rhs + `setSpecInfo` mkSpecInfo [seq_cast_rule] - ty = mkForAllTys [alphaTyVar,openBetaTyVar] - (mkFunTy alphaTy (mkFunTy openBetaTy openBetaTy)) - [x,y] = mkTemplateLocals [alphaTy, openBetaTy] - rhs = mkLams [alphaTyVar,openBetaTyVar,x,y] (Case (Var x) x openBetaTy [(DEFAULT, [], Var y)]) - --- lazy :: forall a?. a? -> a? (i.e. works for unboxed types too) --- Used to lazify pseq: pseq a b = a `seq` lazy b --- --- Also, no strictness: by being a built-in Id, all the info about lazyId comes from here, --- not from GHC.Base.hi. This is important, because the strictness --- analyser will spot it as strict! --- --- Also no unfolding in lazyId: it gets "inlined" by a HACK in the worker/wrapperpass --- (see WorkWrap.wwExpr) --- We could use inline phases to do this, but that would be vulnerable to changes in --- phase numbering....we must inline precisely after strictness analysis. -lazyId - = pcMiscPrelId lazyIdName ty info + ty = mkForAllTys [alphaTyVar,argBetaTyVar] + (mkFunTy alphaTy (mkFunTy argBetaTy argBetaTy)) + [x,y] = mkTemplateLocals [alphaTy, argBetaTy] + rhs = mkLams [alphaTyVar,argBetaTyVar,x,y] (Case (Var x) x argBetaTy [(DEFAULT, [], Var y)]) + + -- See Note [Built-in RULES for seq] + seq_cast_rule = BuiltinRule { ru_name = fsLit "seq of cast" + , ru_fn = seqName + , ru_nargs = 4 + , ru_try = match_seq_of_cast + } + +match_seq_of_cast :: IdUnfoldingFun -> [CoreExpr] -> Maybe CoreExpr + -- See Note [Built-in RULES for seq] +match_seq_of_cast _ [Type _, Type res_ty, Cast scrut co, expr] + = Just (Var seqId `mkApps` [Type (fst (coercionKind co)), Type res_ty, + scrut, expr]) +match_seq_of_cast _ _ = Nothing + +------------------------------------------------ +lazyId :: Id -- See Note [lazyId magic] +lazyId = pcMiscPrelId lazyIdName ty info where info = noCafIdInfo ty = mkForAllTys [alphaTyVar] (mkFunTy alphaTy alphaTy) - -lazyIdUnfolding :: CoreExpr -- Used to expand 'lazyId' after strictness anal -lazyIdUnfolding = mkLams [openAlphaTyVar,x] (Var x) - where - [x] = mkTemplateLocals [openAlphaTy] \end{code} +Note [seqId magic] +~~~~~~~~~~~~~~~~~~ +'GHC.Prim.seq' is special in several ways. + +a) Its second arg can have an unboxed type + x `seq` (v +# w) + +b) Its fixity is set in LoadIface.ghcPrimIface + +c) It has quite a bit of desugaring magic. + See DsUtils.lhs Note [Desugaring seq (1)] and (2) and (3) + +d) There is some special rule handing: Note [User-defined RULES for seq] + +e) See Note [Typing rule for seq] in TcExpr. + +Note [User-defined RULES for seq] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Roman found situations where he had + case (f n) of _ -> e +where he knew that f (which was strict in n) would terminate if n did. +Notice that the result of (f n) is discarded. So it makes sense to +transform to + case n of _ -> e + +Rather than attempt some general analysis to support this, I've added +enough support that you can do this using a rewrite rule: + + RULE "f/seq" forall n. seq (f n) e = seq n e + +You write that rule. When GHC sees a case expression that discards +its result, it mentally transforms it to a call to 'seq' and looks for +a RULE. (This is done in Simplify.rebuildCase.) As usual, the +correctness of the rule is up to you. + +To make this work, we need to be careful that the magical desugaring +done in Note [seqId magic] item (c) is *not* done on the LHS of a rule. +Or rather, we arrange to un-do it, in DsBinds.decomposeRuleLhs. + +Note [Built-in RULES for seq] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +We also have the following built-in rule for seq + + seq (x `cast` co) y = seq x y + +This eliminates unnecessary casts and also allows other seq rules to +match more often. Notably, + + seq (f x `cast` co) y --> seq (f x) y + +and now a user-defined rule for seq (see Note [User-defined RULES for seq]) +may fire. + + +Note [lazyId magic] +~~~~~~~~~~~~~~~~~~~ + lazy :: forall a?. a? -> a? (i.e. works for unboxed types too) + +Used to lazify pseq: pseq a b = a `seq` lazy b + +Also, no strictness: by being a built-in Id, all the info about lazyId comes from here, +not from GHC.Base.hi. This is important, because the strictness +analyser will spot it as strict! + +Also no unfolding in lazyId: it gets "inlined" by a HACK in CorePrep. +It's very important to do this inlining *after* unfoldings are exposed +in the interface file. Otherwise, the unfolding for (say) pseq in the +interface file will not mention 'lazy', so if we inline 'pseq' we'll totally +miss the very thing that 'lazy' was there for in the first place. +See Trac #3259 for a real world example. + +lazyId is defined in GHC.Base, so we don't *have* to inline it. If it +appears un-applied, we'll end up just calling it. + +------------------------------------------------------------- @realWorld#@ used to be a magic literal, \tr{void#}. If things get nasty as-is, change it back to a literal (@Literal@). @@ -1214,6 +1024,7 @@ E.g. This comes up in strictness analysis \begin{code} +realWorldPrimId :: Id realWorldPrimId -- :: State# RealWorld = pcMiscPrelId realWorldName realWorldStatePrimTy (noCafIdInfo `setUnfoldingInfo` evaldUnfolding) @@ -1224,103 +1035,17 @@ realWorldPrimId -- :: State# RealWorld voidArgId :: Id voidArgId -- :: State# RealWorld - = mkSysLocal FSLIT("void") voidArgIdKey realWorldStatePrimTy + = mkSysLocal (fsLit "void") voidArgIdKey realWorldStatePrimTy \end{code} -%************************************************************************ -%* * -\subsection[PrelVals-error-related]{@error@ and friends; @trace@} -%* * -%************************************************************************ - -GHC randomly injects these into the code. - -@patError@ is just a version of @error@ for pattern-matching -failures. It knows various ``codes'' which expand to longer -strings---this saves space! - -@absentErr@ is a thing we put in for ``absent'' arguments. They jolly -well shouldn't be yanked on, but if one is, then you will get a -friendly message from @absentErr@ (rather than a totally random -crash). - -@parError@ is a special version of @error@ which the compiler does -not know to be a bottoming Id. It is used in the @_par_@ and @_seq_@ -templates, but we don't ever expect to generate code for it. - -\begin{code} -mkRuntimeErrorApp - :: Id -- Should be of type (forall a. Addr# -> a) - -- where Addr# points to a UTF8 encoded string - -> Type -- The type to instantiate 'a' - -> String -- The string to print - -> CoreExpr - -mkRuntimeErrorApp err_id res_ty err_msg - = mkApps (Var err_id) [Type res_ty, err_string] - where - err_string = Lit (mkStringLit err_msg) - -rEC_SEL_ERROR_ID = mkRuntimeErrorId recSelErrorName -rUNTIME_ERROR_ID = mkRuntimeErrorId runtimeErrorName -iRREFUT_PAT_ERROR_ID = mkRuntimeErrorId irrefutPatErrorName -rEC_CON_ERROR_ID = mkRuntimeErrorId recConErrorName -pAT_ERROR_ID = mkRuntimeErrorId patErrorName -nO_METHOD_BINDING_ERROR_ID = mkRuntimeErrorId noMethodBindingErrorName -nON_EXHAUSTIVE_GUARDS_ERROR_ID = mkRuntimeErrorId nonExhaustiveGuardsErrorName - --- The runtime error Ids take a UTF8-encoded string as argument - -mkRuntimeErrorId :: Name -> Id -mkRuntimeErrorId name = pc_bottoming_Id name runtimeErrorTy - -runtimeErrorTy :: Type -runtimeErrorTy = mkSigmaTy [openAlphaTyVar] [] (mkFunTy addrPrimTy openAlphaTy) -\end{code} - -\begin{code} -eRROR_ID = pc_bottoming_Id errorName errorTy - -errorTy :: Type -errorTy = mkSigmaTy [openAlphaTyVar] [] (mkFunTys [mkListTy charTy] openAlphaTy) - -- Notice the openAlphaTyVar. It says that "error" can be applied - -- to unboxed as well as boxed types. This is OK because it never - -- returns, so the return type is irrelevant. -\end{code} - - -%************************************************************************ -%* * -\subsection{Utilities} -%* * -%************************************************************************ - \begin{code} pcMiscPrelId :: Name -> Type -> IdInfo -> Id pcMiscPrelId name ty info - = mkVanillaGlobal name ty info + = mkVanillaGlobalWithInfo name ty info -- We lie and say the thing is imported; otherwise, we get into -- a mess with dependency analysis; e.g., core2stg may heave in -- random calls to GHCbase.unpackPS__. If GHCbase is the module -- being compiled, then it's just a matter of luck if the definition -- will be in "the right place" to be in scope. - -pc_bottoming_Id :: Name -> Type -> Id -pc_bottoming_Id name ty - = pcMiscPrelId name ty bottoming_info - where - bottoming_info = vanillaIdInfo `setAllStrictnessInfo` Just strict_sig - -- Do *not* mark them as NoCafRefs, because they can indeed have - -- CAF refs. For example, pAT_ERROR_ID calls GHC.Err.untangle, - -- which has some CAFs - -- In due course we may arrange that these error-y things are - -- regarded by the GC as permanently live, in which case we - -- can give them NoCaf info. As it is, any function that calls - -- any pc_bottoming_Id will itself have CafRefs, which bloats - -- SRTs. - - strict_sig = mkStrictSig (mkTopDmdType [evalDmd] BotRes) - -- These "bottom" out, no matter what their arguments \end{code} -