diff options
author | Simon Marlow <simonmar@microsoft.com> | 2006-10-11 12:05:18 +0000 |
---|---|---|
committer | Simon Marlow <simonmar@microsoft.com> | 2006-10-11 12:05:18 +0000 |
commit | b00b5bc04ff36a551552470060064f0b7d84ca30 (patch) | |
tree | 9b3ae9433218dd1388a640f2aad7f3e37d63711e /compiler/prelude | |
parent | 7e623a3a6c4fa75bae5be29a9fca015f98f1c30b (diff) | |
download | haskell-b00b5bc04ff36a551552470060064f0b7d84ca30.tar.gz |
Interface file optimisation and removal of nameParent
This large commit combines several interrelated changes:
- IfaceSyn now contains actual Names rather than the special
IfaceExtName type. The binary interface file contains
a symbol table of Names, where each entry is a (package,
ModuleName, OccName) triple. Names in the IfaceSyn point
to entries in the symbol table.
This reduces the size of interface files, which should
hopefully improve performance (not measured yet).
The toIfaceXXX functions now do not need to pass around
a function from Name -> IfaceExtName, which makes that
code simpler.
- Names now do not point directly to their parents, and the
nameParent operation has gone away. It turned out to be hard to
keep this information consistent in practice, and the parent info
was only valid in some Names. Instead we made the following
changes:
* ImportAvails contains a new field
imp_parent :: NameEnv AvailInfo
which gives the family info for any Name in scope, and
is used by the renamer when renaming export lists, amongst
other things. This info is thrown away after renaming.
* The mi_ver_fn field of ModIface now maps to
(OccName,Version) instead of just Version, where the
OccName is the parent name. This mapping is used when
constructing the usage info for dependent modules.
There may be entries in mi_ver_fn for things that are not in
scope, whereas imp_parent only deals with in-scope things.
* The md_exports field of ModDetails now contains
[AvailInfo] rather than NameSet. This gives us
family info for the exported names of a module.
Also:
- ifaceDeclSubBinders moved to IfaceSyn (seems like the
right place for it).
- heavily refactored renaming of import/export lists.
- Unfortunately external core is now broken, as it relied on
IfaceSyn. It requires some attention.
Diffstat (limited to 'compiler/prelude')
-rw-r--r-- | compiler/prelude/PrelNames.lhs | 97 | ||||
-rw-r--r-- | compiler/prelude/TysPrim.lhs | 1 | ||||
-rw-r--r-- | compiler/prelude/TysWiredIn.lhs | 31 |
3 files changed, 60 insertions, 69 deletions
diff --git a/compiler/prelude/PrelNames.lhs b/compiler/prelude/PrelNames.lhs index 36413dd18a..bccf84fa1d 100644 --- a/compiler/prelude/PrelNames.lhs +++ b/compiler/prelude/PrelNames.lhs @@ -446,9 +446,9 @@ runMainIOName = varQual gHC_TOP_HANDLER FSLIT("runMainIO") runMainKey orderingTyConName = tcQual gHC_BASE FSLIT("Ordering") orderingTyConKey -eitherTyConName = tcQual dATA_EITHER FSLIT("Either") eitherTyConKey -leftDataConName = conName eitherTyConName FSLIT("Left") leftDataConKey -rightDataConName = conName eitherTyConName FSLIT("Right") rightDataConKey +eitherTyConName = tcQual dATA_EITHER FSLIT("Either") eitherTyConKey +leftDataConName = conName dATA_EITHER FSLIT("Left") leftDataConKey +rightDataConName = conName dATA_EITHER FSLIT("Right") rightDataConKey -- Generics crossTyConName = tcQual gHC_BASE FSLIT(":*:") crossTyConKey @@ -466,18 +466,18 @@ eqStringName = varQual gHC_BASE FSLIT("eqString") eqStringIdKey inlineIdName = varQual gHC_BASE FSLIT("inline") inlineIdKey -- Base classes (Eq, Ord, Functor) -eqClassName = clsQual gHC_BASE FSLIT("Eq") eqClassKey -eqName = methName eqClassName FSLIT("==") eqClassOpKey -ordClassName = clsQual gHC_BASE FSLIT("Ord") ordClassKey -geName = methName ordClassName FSLIT(">=") geClassOpKey -functorClassName = clsQual gHC_BASE FSLIT("Functor") functorClassKey +eqClassName = clsQual gHC_BASE FSLIT("Eq") eqClassKey +eqName = methName gHC_BASE FSLIT("==") eqClassOpKey +ordClassName = clsQual gHC_BASE FSLIT("Ord") ordClassKey +geName = methName gHC_BASE FSLIT(">=") geClassOpKey +functorClassName = clsQual gHC_BASE FSLIT("Functor") functorClassKey -- Class Monad -monadClassName = clsQual gHC_BASE FSLIT("Monad") monadClassKey -thenMName = methName monadClassName FSLIT(">>") thenMClassOpKey -bindMName = methName monadClassName FSLIT(">>=") bindMClassOpKey -returnMName = methName monadClassName FSLIT("return") returnMClassOpKey -failMName = methName monadClassName FSLIT("fail") failMClassOpKey +monadClassName = clsQual gHC_BASE FSLIT("Monad") monadClassKey +thenMName = methName gHC_BASE FSLIT(">>") thenMClassOpKey +bindMName = methName gHC_BASE FSLIT(">>=") bindMClassOpKey +returnMName = methName gHC_BASE FSLIT("return") returnMClassOpKey +failMName = methName gHC_BASE FSLIT("fail") failMClassOpKey -- Random PrelBase functions otherwiseIdName = varQual gHC_BASE FSLIT("otherwise") otherwiseIdKey @@ -506,25 +506,25 @@ fstName = varQual dATA_TUP FSLIT("fst") fstIdKey sndName = varQual dATA_TUP FSLIT("snd") sndIdKey -- Module PrelNum -numClassName = clsQual gHC_NUM FSLIT("Num") numClassKey -fromIntegerName = methName numClassName FSLIT("fromInteger") fromIntegerClassOpKey -minusName = methName numClassName FSLIT("-") minusClassOpKey -negateName = methName numClassName FSLIT("negate") negateClassOpKey -plusIntegerName = varQual gHC_NUM FSLIT("plusInteger") plusIntegerIdKey -timesIntegerName = varQual gHC_NUM FSLIT("timesInteger") timesIntegerIdKey -integerTyConName = tcQual gHC_NUM FSLIT("Integer") integerTyConKey -smallIntegerDataConName = conName integerTyConName FSLIT("S#") smallIntegerDataConKey -largeIntegerDataConName = conName integerTyConName FSLIT("J#") largeIntegerDataConKey +numClassName = clsQual gHC_NUM FSLIT("Num") numClassKey +fromIntegerName = methName gHC_NUM FSLIT("fromInteger") fromIntegerClassOpKey +minusName = methName gHC_NUM FSLIT("-") minusClassOpKey +negateName = methName gHC_NUM FSLIT("negate") negateClassOpKey +plusIntegerName = varQual gHC_NUM FSLIT("plusInteger") plusIntegerIdKey +timesIntegerName = varQual gHC_NUM FSLIT("timesInteger") timesIntegerIdKey +integerTyConName = tcQual gHC_NUM FSLIT("Integer") integerTyConKey +smallIntegerDataConName = conName gHC_NUM FSLIT("S#") smallIntegerDataConKey +largeIntegerDataConName = conName gHC_NUM FSLIT("J#") largeIntegerDataConKey -- PrelReal types and classes -rationalTyConName = tcQual gHC_REAL FSLIT("Rational") rationalTyConKey -ratioTyConName = tcQual gHC_REAL FSLIT("Ratio") ratioTyConKey -ratioDataConName = conName ratioTyConName FSLIT(":%") ratioDataConKey -realClassName = clsQual gHC_REAL FSLIT("Real") realClassKey -integralClassName = clsQual gHC_REAL FSLIT("Integral") integralClassKey -realFracClassName = clsQual gHC_REAL FSLIT("RealFrac") realFracClassKey -fractionalClassName = clsQual gHC_REAL FSLIT("Fractional") fractionalClassKey -fromRationalName = methName fractionalClassName FSLIT("fromRational") fromRationalClassOpKey +rationalTyConName = tcQual gHC_REAL FSLIT("Rational") rationalTyConKey +ratioTyConName = tcQual gHC_REAL FSLIT("Ratio") ratioTyConKey +ratioDataConName = conName gHC_REAL FSLIT(":%") ratioDataConKey +realClassName = clsQual gHC_REAL FSLIT("Real") realClassKey +integralClassName = clsQual gHC_REAL FSLIT("Integral") integralClassKey +realFracClassName = clsQual gHC_REAL FSLIT("RealFrac") realFracClassKey +fractionalClassName = clsQual gHC_REAL FSLIT("Fractional") fractionalClassKey +fromRationalName = methName gHC_REAL FSLIT("fromRational") fromRationalClassOpKey -- PrelFloat classes floatingClassName = clsQual gHC_FLOAT FSLIT("Floating") floatingClassKey @@ -555,10 +555,10 @@ assertErrorName = varQual gHC_ERR FSLIT("assertError") assertErrorIdKey -- Enum module (Enum, Bounded) enumClassName = clsQual gHC_ENUM FSLIT("Enum") enumClassKey -enumFromName = methName enumClassName FSLIT("enumFrom") enumFromClassOpKey -enumFromToName = methName enumClassName FSLIT("enumFromTo") enumFromToClassOpKey -enumFromThenName = methName enumClassName FSLIT("enumFromThen") enumFromThenClassOpKey -enumFromThenToName = methName enumClassName FSLIT("enumFromThenTo") enumFromThenToClassOpKey +enumFromName = methName gHC_ENUM FSLIT("enumFrom") enumFromClassOpKey +enumFromToName = methName gHC_ENUM FSLIT("enumFromTo") enumFromToClassOpKey +enumFromThenName = methName gHC_ENUM FSLIT("enumFromThen") enumFromThenClassOpKey +enumFromThenToName = methName gHC_ENUM FSLIT("enumFromThenTo") enumFromThenToClassOpKey boundedClassName = clsQual gHC_ENUM FSLIT("Bounded") boundedClassKey -- List functions @@ -590,7 +590,7 @@ indexOfPName = varQual gHC_PARR FSLIT("indexOfP") indexOfPIdKey -- IOBase things ioTyConName = tcQual gHC_IO_BASE FSLIT("IO") ioTyConKey -ioDataConName = conName ioTyConName FSLIT("IO") ioDataConKey +ioDataConName = conName gHC_IO_BASE FSLIT("IO") ioDataConKey thenIOName = varQual gHC_IO_BASE FSLIT("thenIO") thenIOIdKey bindIOName = varQual gHC_IO_BASE FSLIT("bindIO") bindIOIdKey returnIOName = varQual gHC_IO_BASE FSLIT("returnIO") returnIOIdKey @@ -611,7 +611,7 @@ word16TyConName = tcQual gHC_WORD FSLIT("Word16") word16TyConKey word32TyConName = tcQual gHC_WORD FSLIT("Word32") word32TyConKey word64TyConName = tcQual gHC_WORD FSLIT("Word64") word64TyConKey wordTyConName = tcQual gHC_WORD FSLIT("Word") wordTyConKey -wordDataConName = conName wordTyConName FSLIT("W#") wordDataConKey +wordDataConName = conName gHC_WORD FSLIT("W#") wordDataConKey -- PrelPtr module ptrTyConName = tcQual gHC_PTR FSLIT("Ptr") ptrTyConKey @@ -626,7 +626,7 @@ runSTRepName = varQual gHC_ST FSLIT("runSTRep") runSTRepIdKey -- Recursive-do notation monadFixClassName = clsQual mONAD_FIX FSLIT("MonadFix") monadFixClassKey -mfixName = methName monadFixClassName FSLIT("mfix") mfixIdKey +mfixName = methName mONAD_FIX FSLIT("mfix") mfixIdKey -- Arrow notation arrAName = varQual aRROW FSLIT("arr") arrAIdKey @@ -666,20 +666,15 @@ tcQual = mk_known_key_name tcName clsQual = mk_known_key_name clsName mk_known_key_name space mod str uniq - = mkExternalName uniq mod (mkOccNameFS space str) - Nothing noSrcLoc - -conName :: Name -> FastString -> Unique -> Name --- Be careful to ghve constructor names the right parent! -conName tycon occ uniq - = mkExternalName uniq (nameModule tycon) (mkOccNameFS dataName occ) - (Just tycon) noSrcLoc - -methName :: Name -> FastString -> Unique -> Name --- Be careful to ghve method names the right parent! -methName cls occ uniq - = mkExternalName uniq (nameModule cls) (mkVarOccFS occ) - (Just cls) noSrcLoc + = mkExternalName uniq mod (mkOccNameFS space str) noSrcLoc + +conName :: Module -> FastString -> Unique -> Name +conName mod occ uniq + = mkExternalName uniq mod (mkOccNameFS dataName occ) noSrcLoc + +methName :: Module -> FastString -> Unique -> Name +methName mod occ uniq + = mkExternalName uniq mod (mkVarOccFS occ) noSrcLoc \end{code} %************************************************************************ diff --git a/compiler/prelude/TysPrim.lhs b/compiler/prelude/TysPrim.lhs index 4b6832a856..7a316835ea 100644 --- a/compiler/prelude/TysPrim.lhs +++ b/compiler/prelude/TysPrim.lhs @@ -103,7 +103,6 @@ mkPrimTc :: FastString -> Unique -> TyCon -> Name mkPrimTc fs uniq tycon = mkWiredInName gHC_PRIM (mkOccNameFS tcName fs) uniq - Nothing -- No parent object (ATyCon tycon) -- Relevant TyCon UserSyntax -- None are built-in syntax diff --git a/compiler/prelude/TysWiredIn.lhs b/compiler/prelude/TysWiredIn.lhs index 598fa42032..436b121adc 100644 --- a/compiler/prelude/TysWiredIn.lhs +++ b/compiler/prelude/TysWiredIn.lhs @@ -133,36 +133,34 @@ wiredInTyCons = [ unitTyCon -- Not treated like other tuples, because mkWiredInTyConName :: BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name mkWiredInTyConName built_in mod fs uniq tycon = mkWiredInName mod (mkOccNameFS tcName fs) uniq - Nothing -- No parent object (ATyCon tycon) -- Relevant TyCon built_in -mkWiredInDataConName :: BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name -> Name -mkWiredInDataConName built_in mod fs uniq datacon parent +mkWiredInDataConName :: BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name +mkWiredInDataConName built_in mod fs uniq datacon = mkWiredInName mod (mkOccNameFS dataName fs) uniq - (Just parent) -- Name of parent TyCon (ADataCon datacon) -- Relevant DataCon built_in charTyConName = mkWiredInTyConName UserSyntax gHC_BASE FSLIT("Char") charTyConKey charTyCon -charDataConName = mkWiredInDataConName UserSyntax gHC_BASE FSLIT("C#") charDataConKey charDataCon charTyConName +charDataConName = mkWiredInDataConName UserSyntax gHC_BASE FSLIT("C#") charDataConKey charDataCon intTyConName = mkWiredInTyConName UserSyntax gHC_BASE FSLIT("Int") intTyConKey intTyCon -intDataConName = mkWiredInDataConName UserSyntax gHC_BASE FSLIT("I#") intDataConKey intDataCon intTyConName +intDataConName = mkWiredInDataConName UserSyntax gHC_BASE FSLIT("I#") intDataConKey intDataCon boolTyConName = mkWiredInTyConName UserSyntax gHC_BASE FSLIT("Bool") boolTyConKey boolTyCon -falseDataConName = mkWiredInDataConName UserSyntax gHC_BASE FSLIT("False") falseDataConKey falseDataCon boolTyConName -trueDataConName = mkWiredInDataConName UserSyntax gHC_BASE FSLIT("True") trueDataConKey trueDataCon boolTyConName +falseDataConName = mkWiredInDataConName UserSyntax gHC_BASE FSLIT("False") falseDataConKey falseDataCon +trueDataConName = mkWiredInDataConName UserSyntax gHC_BASE FSLIT("True") trueDataConKey trueDataCon listTyConName = mkWiredInTyConName BuiltInSyntax gHC_BASE FSLIT("[]") listTyConKey listTyCon -nilDataConName = mkWiredInDataConName BuiltInSyntax gHC_BASE FSLIT("[]") nilDataConKey nilDataCon listTyConName -consDataConName = mkWiredInDataConName BuiltInSyntax gHC_BASE FSLIT(":") consDataConKey consDataCon listTyConName +nilDataConName = mkWiredInDataConName BuiltInSyntax gHC_BASE FSLIT("[]") nilDataConKey nilDataCon +consDataConName = mkWiredInDataConName BuiltInSyntax gHC_BASE FSLIT(":") consDataConKey consDataCon floatTyConName = mkWiredInTyConName UserSyntax gHC_FLOAT FSLIT("Float") floatTyConKey floatTyCon -floatDataConName = mkWiredInDataConName UserSyntax gHC_FLOAT FSLIT("F#") floatDataConKey floatDataCon floatTyConName +floatDataConName = mkWiredInDataConName UserSyntax gHC_FLOAT FSLIT("F#") floatDataConKey floatDataCon doubleTyConName = mkWiredInTyConName UserSyntax gHC_FLOAT FSLIT("Double") doubleTyConKey doubleTyCon -doubleDataConName = mkWiredInDataConName UserSyntax gHC_FLOAT FSLIT("D#") doubleDataConKey doubleDataCon doubleTyConName +doubleDataConName = mkWiredInDataConName UserSyntax gHC_FLOAT FSLIT("D#") doubleDataConKey doubleDataCon parrTyConName = mkWiredInTyConName BuiltInSyntax gHC_PARR FSLIT("[::]") parrTyConKey parrTyCon -parrDataConName = mkWiredInDataConName UserSyntax gHC_PARR FSLIT("PArr") parrDataConKey parrDataCon parrTyConName +parrDataConName = mkWiredInDataConName UserSyntax gHC_PARR FSLIT("PArr") parrDataConKey parrDataCon boolTyCon_RDR = nameRdrName boolTyConName false_RDR = nameRdrName falseDataConName @@ -240,7 +238,6 @@ pcDataConWithFixity declared_infix dc_name tyvars arg_tys tycon wrk_occ = mkDataConWorkerOcc (nameOccName dc_name) wrk_key = incrUnique (nameUnique dc_name) wrk_name = mkWiredInName mod wrk_occ wrk_key - (Just (tyConName tycon)) (AnId (dataConWorkId data_con)) UserSyntax bogus_wrap_name = pprPanic "Wired-in data wrapper id" (ppr dc_name) -- Wired-in types are too simple to need wrappers @@ -274,7 +271,7 @@ mk_tuple boxity arity = (tycon, tuple_con) tycon = mkTupleTyCon tc_name tc_kind arity tyvars tuple_con boxity gen_info mod = mkTupleModule boxity arity tc_name = mkWiredInName mod (mkTupleOcc tcName boxity arity) tc_uniq - Nothing (ATyCon tycon) BuiltInSyntax + (ATyCon tycon) BuiltInSyntax tc_kind = mkArrowKinds (map tyVarKind tyvars) res_kind res_kind | isBoxed boxity = liftedTypeKind | otherwise = ubxTupleKind @@ -285,7 +282,7 @@ mk_tuple boxity arity = (tycon, tuple_con) tuple_con = pcDataCon dc_name tyvars tyvar_tys tycon tyvar_tys = mkTyVarTys tyvars dc_name = mkWiredInName mod (mkTupleOcc dataName boxity arity) dc_uniq - (Just tc_name) (ADataCon tuple_con) BuiltInSyntax + (ADataCon tuple_con) BuiltInSyntax tc_uniq = mkTupleTyConUnique boxity arity dc_uniq = mkTupleDataConUnique boxity arity gen_info = True -- Tuples all have generics.. @@ -569,7 +566,7 @@ mkPArrFakeCon arity = data_con tyvarTys = replicate arity $ mkTyVarTy tyvar nameStr = mkFastString ("MkPArr" ++ show arity) name = mkWiredInName gHC_PARR (mkOccNameFS dataName nameStr) uniq - Nothing (ADataCon data_con) UserSyntax + (ADataCon data_con) UserSyntax uniq = mkPArrDataConUnique arity -- checks whether a data constructor is a fake constructor for parallel arrays |