X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FName.lhs;h=aef8355dfbba5b3d0b1a424322880a6336940795;hb=f43ebad1020dccdf6fde2fddc91994b27d0f565e;hp=1a0e155c8ad3e8603e4f59f7eb83c2f001a4e2e8;hpb=fe6b0fa38eeafd116fc9d64b2443b773b2a59245;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/Name.lhs b/ghc/compiler/basicTypes/Name.lhs index 1a0e155..aef8355 100644 --- a/ghc/compiler/basicTypes/Name.lhs +++ b/ghc/compiler/basicTypes/Name.lhs @@ -11,14 +11,14 @@ module Name ( -- The Name type Name, -- Abstract mkLocalName, mkSysLocalName, mkCCallName, - mkTopName, mkIPName, - mkDerivedName, mkGlobalName, mkKnownKeyGlobal, mkWiredInName, + mkIPName, + mkGlobalName, mkKnownKeyGlobal, mkWiredInName, nameUnique, setNameUnique, - tidyTopName, nameOccName, nameModule, nameModule_maybe, setNameOcc, nameRdrName, setNameModuleAndLoc, - toRdrName, hashName, + toRdrName, hashName, + globaliseName, localiseName, nameSrcLoc, nameIsLocallyDefined, isDllName, nameIsFrom, nameIsLocalOrFrom, @@ -28,7 +28,7 @@ module Name ( -- Environment NameEnv, mkNameEnv, emptyNameEnv, unitNameEnv, nameEnvElts, - extendNameEnv_C, extendNameEnv, foldNameEnv, + extendNameEnv_C, extendNameEnv, foldNameEnv, filterNameEnv, plusNameEnv, plusNameEnv_C, extendNameEnv, extendNameEnvList, lookupNameEnv, lookupNameEnv_NF, delFromNameEnv, elemNameEnv, @@ -42,9 +42,9 @@ module Name ( #include "HsVersions.h" import OccName -- All of it -import Module ( Module, moduleName, mkVanillaModule, isModuleInThisPackage ) +import Module ( Module, moduleName, mkVanillaModule, isHomeModule ) import RdrName ( RdrName, mkRdrOrig, mkRdrUnqual, rdrNameOcc, rdrNameModule ) -import CmdLineOpts ( opt_Static, opt_OmitInterfacePragmas, opt_EnsureSplittableC ) +import CmdLineOpts ( opt_Static ) import SrcLoc ( builtinSrcLoc, noSrcLoc, SrcLoc ) import Unique ( Unique, Uniquable(..), u2i, pprUnique, pprUnique10 ) import FastTypes @@ -173,7 +173,6 @@ mkLocalName uniq occ loc = Name { n_uniq = uniq, n_sort = Local, n_occ = occ, n_ mkGlobalName :: Unique -> Module -> OccName -> SrcLoc -> Name mkGlobalName uniq mod occ loc = Name { n_uniq = uniq, n_sort = Global mod, n_occ = occ, n_loc = loc } - mkKnownKeyGlobal :: RdrName -> Unique -> Name mkKnownKeyGlobal rdr_name uniq @@ -199,14 +198,6 @@ mkIPName uniq occ n_sort = Local, n_occ = occ, n_loc = noSrcLoc } - ---------------------------------------------------------------------- -mkDerivedName :: (OccName -> OccName) - -> Name -- Base name - -> Unique -- New unique - -> Name -- Result is always a value name - -mkDerivedName f name uniq = name {n_uniq = uniq, n_occ = f (n_occ name)} \end{code} \begin{code} @@ -216,11 +207,14 @@ mkDerivedName f name uniq = name {n_uniq = uniq, n_occ = f (n_occ name)} setNameUnique name uniq = name {n_uniq = uniq} setNameOcc :: Name -> OccName -> Name - -- Give the thing a new OccName, *and* - -- record that it's no longer a sys-local - -- This is used by the tidy-up pass setNameOcc name occ = name {n_occ = occ} +globaliseName :: Name -> Module -> Name +globaliseName n mod = n { n_sort = Global mod } + +localiseName :: Name -> Name +localiseName n = n { n_sort = Local } + setNameModuleAndLoc :: Name -> Module -> SrcLoc -> Name setNameModuleAndLoc name mod loc = name {n_sort = set (n_sort name), n_loc = loc} where @@ -230,91 +224,6 @@ setNameModuleAndLoc name mod loc = name {n_sort = set (n_sort name), n_loc = loc %************************************************************************ %* * -\subsection{Tidying a name} -%* * -%************************************************************************ - -tidyTopName is applied to top-level names in the final program - -For top-level things, - it globalises Local names - (if all top-level things should be visible) - and localises non-exported Global names - (if only exported things should be visible) - -In all cases except an exported global, it gives it a new occurrence name. - -The "visibility" here concerns whether the .o file's symbol table -mentions the thing; if so, it needs a module name in its symbol. -The Global things are "visible" and the Local ones are not - -Why should things be "visible"? Certainly they must be if they -are exported. But also: - -(a) In certain (prelude only) modules we split up the .hc file into - lots of separate little files, which are separately compiled by the C - compiler. That gives lots of little .o files. The idea is that if - you happen to mention one of them you don't necessarily pull them all - in. (Pulling in a piece you don't need can be v bad, because it may - mention other pieces you don't need either, and so on.) - - Sadly, splitting up .hc files means that local names (like s234) are - now globally visible, which can lead to clashes between two .hc - files. So unlocaliseWhatnot goes through making all the local things - into global things, essentially by giving them full names so when they - are printed they'll have their module name too. Pretty revolting - really. - -(b) When optimisation is on we want to make all the internal - top-level defns externally visible - -\begin{code} -tidyTopName :: Module -> TidyOccEnv -> Bool -> Name -> (TidyOccEnv, Name) -tidyTopName mod env is_exported - name@(Name { n_occ = occ, n_sort = sort, n_uniq = uniq, n_loc = loc }) - = case sort of - Global _ | is_exported -> (env, name) - | otherwise -> (env, name { n_sort = new_sort }) - -- Don't change the occurrnce names of globals, because many of them - -- are bound by either a class declaration or a data declaration - -- or an explicit user export. - - other | is_exported -> (env', name { n_sort = Global mod, n_occ = occ' }) - | otherwise -> (env', name { n_sort = new_sort, n_occ = occ' }) - where - (env', occ') = tidyOccName env occ - new_sort = mkLocalTopSort mod - -mkTopName :: Unique -> Module -> FAST_STRING -> Name - -- Make a top-level name; make it Global if top-level - -- things should be externally visible; Local otherwise - -- This chap is only used *after* the tidyCore phase - -- Notably, it is used during STG lambda lifting - -- - -- We have to make sure that the name is globally unique - -- and we don't have tidyCore to help us. So we append - -- the unique. Hack! Hack! - -- (Used only by the STG lambda lifter.) -mkTopName uniq mod fs - = Name { n_uniq = uniq, - n_sort = mkLocalTopSort mod, - n_occ = mkVarOcc (_PK_ ((_UNPK_ fs) ++ show uniq)), - n_loc = noSrcLoc } - -mkLocalTopSort :: Module -> NameSort -mkLocalTopSort mod - | all_toplev_ids_visible = Global mod - | otherwise = Local - -all_toplev_ids_visible - = not opt_OmitInterfacePragmas || -- Pragmas can make them visible - opt_EnsureSplittableC -- Splitting requires visiblilty -\end{code} - - - -%************************************************************************ -%* * \subsection{Predicates and selectors} %* * %************************************************************************ @@ -334,13 +243,12 @@ isDllName :: Name -> Bool -- Does this name refer to something in a different DLL? isDllName nm = not opt_Static && not (isLocalName nm) && -- isLocalName test needed 'cos - not (isModuleInThisPackage (nameModule nm)) -- nameModule won't work on local names + not (isHomeModule (nameModule nm)) -- nameModule won't work on local names isTyVarName :: Name -> Bool isTyVarName name = isTvOcc (nameOccName name) - \end{code} @@ -398,6 +306,7 @@ lookupNameEnv :: NameEnv a -> Name -> Maybe a lookupNameEnv_NF :: NameEnv a -> Name -> a mapNameEnv :: (a->b) -> NameEnv a -> NameEnv b foldNameEnv :: (a -> b -> b) -> b -> NameEnv a -> b +filterNameEnv :: (elt -> Bool) -> NameEnv elt -> NameEnv elt emptyNameEnv = emptyUFM foldNameEnv = foldUFM @@ -412,6 +321,7 @@ delFromNameEnv = delFromUFM elemNameEnv = elemUFM mapNameEnv = mapUFM unitNameEnv = unitUFM +filterNameEnv = filterUFM lookupNameEnv = lookupUFM lookupNameEnv_NF env n = expectJust "lookupNameEnv_NF" (lookupUFM env n) @@ -436,27 +346,32 @@ pprName name@(Name {n_sort = sort, n_uniq = uniq, n_occ = occ}) System -> pprSysLocal sty uniq occ Local -> pprLocal sty uniq occ -pprLocal sty uniq occ - | codeStyle sty = pprUnique uniq - | debugStyle sty = pprOccName occ <> - text "{-" <> pprUnique10 uniq <> text "-}" - | otherwise = pprOccName occ - pprGlobal sty name uniq mod occ | codeStyle sty = ppr (moduleName mod) <> char '_' <> pprOccName occ | debugStyle sty = ppr (moduleName mod) <> dot <> pprOccName occ <> - text "{-" <> pprUnique10 uniq <> text "-}" + text "{-" <> pprUnique uniq <> text "-}" | unqualStyle sty name = pprOccName occ | otherwise = ppr (moduleName mod) <> dot <> pprOccName occ +pprLocal sty uniq occ + | codeStyle sty = pprUnique uniq + | debugStyle sty = pprOccName occ <> + text "{-" <> pprUnique10 uniq <> text "-}" + | otherwise = pprOccName occ -- User and Iface styles + +-- Like Local, except that we only omit the unique in Iface style pprSysLocal sty uniq occ | codeStyle sty = pprUnique uniq + | ifaceStyle sty = pprOccName occ -- The tidy phase has ensured that OccNames + -- are enough | otherwise = pprOccName occ <> char '_' <> pprUnique uniq + -- If the tidy phase hasn't run, the OccName + -- is unlikely to be informative (like 's'), + -- so print the unique \end{code} - %************************************************************************ %* * \subsection{Overloaded functions related to Names}