summaryrefslogtreecommitdiff
path: root/compiler/utils
diff options
context:
space:
mode:
authorBartosz Nitka <niteria@gmail.com>2016-06-06 02:10:07 -0700
committerBartosz Nitka <niteria@gmail.com>2016-06-06 02:11:04 -0700
commit3042a9d8d55b4706d2ce366fee1712c7357d5a00 (patch)
tree3d8af3dd805288bbca7097a100acdb28949e4b2c /compiler/utils
parentf91d87df889fb612183b8f2d42b29d2edd7c1dbc (diff)
downloadhaskell-3042a9d8d55b4706d2ce366fee1712c7357d5a00.tar.gz
Use UniqDFM for HomePackageTable
This isn't strictly necessary for deterministic ABIs. The results of eltsHpt are consumed in two ways: 1) they determine the order of linking 2) if you track the data flow all the family instances get put in FamInstEnvs, so the nondeterministic order is forgotten. 3) same for VectInfo stuff 4) same for Annotations The problem is that I haven't found a nice way to do 2. in a local way and 1. is nice to have if we went for deterministic object files. Besides these maps are keyed on ModuleNames so they should be small relative to other things and the overhead should be negligible. As a bonus we also get more specific names. Test Plan: ./validate Reviewers: bgamari, austin, hvr, ezyang, simonmar Reviewed By: simonmar Subscribers: thomie Differential Revision: https://phabricator.haskell.org/D2300 GHC Trac Issues: #4012
Diffstat (limited to 'compiler/utils')
-rw-r--r--compiler/utils/UniqDFM.hs21
1 files changed, 19 insertions, 2 deletions
diff --git a/compiler/utils/UniqDFM.hs b/compiler/utils/UniqDFM.hs
index 8bd19ad7ff..6e6292ec3c 100644
--- a/compiler/utils/UniqDFM.hs
+++ b/compiler/utils/UniqDFM.hs
@@ -28,6 +28,7 @@ module UniqDFM (
unitUDFM,
addToUDFM,
addToUDFM_C,
+ addListToUDFM,
delFromUDFM,
delListFromUDFM,
adjustUDFM,
@@ -35,7 +36,7 @@ module UniqDFM (
mapUDFM,
plusUDFM,
plusUDFM_C,
- lookupUDFM,
+ lookupUDFM, lookupUDFM_Directly,
elemUDFM,
foldUDFM,
eltsUDFM,
@@ -49,7 +50,8 @@ module UniqDFM (
listToUDFM,
udfmMinusUFM,
partitionUDFM,
- anyUDFM,
+ anyUDFM, allUDFM,
+ pprUDFM,
udfmToList,
udfmToUfm,
@@ -155,6 +157,9 @@ addToUDFM_Directly_C f (UDFM m i) u v =
where
tf (TaggedVal a j) (TaggedVal b _) = TaggedVal (f a b) j
+addListToUDFM :: Uniquable key => UniqDFM elt -> [(key,elt)] -> UniqDFM elt
+addListToUDFM = foldl (\m (k, v) -> addToUDFM m k v)
+
addToUDFM_C
:: Uniquable key => (elt -> elt -> elt) -- old -> new -> result
-> UniqDFM elt -- old
@@ -235,6 +240,9 @@ insertUDFMIntoLeft_C f udfml udfmr =
lookupUDFM :: Uniquable key => UniqDFM elt -> key -> Maybe elt
lookupUDFM (UDFM m _i) k = taggedFst `fmap` M.lookup (getKey $ getUnique k) m
+lookupUDFM_Directly :: UniqDFM elt -> Unique -> Maybe elt
+lookupUDFM_Directly (UDFM m _i) k = taggedFst `fmap` M.lookup (getKey k) m
+
elemUDFM :: Uniquable key => key -> UniqDFM elt -> Bool
elemUDFM k (UDFM m _i) = M.member (getKey $ getUnique k) m
@@ -349,6 +357,9 @@ mapUDFM f (UDFM m i) = UDFM (M.map (fmap f) m) i
anyUDFM :: (elt -> Bool) -> UniqDFM elt -> Bool
anyUDFM p (UDFM m _i) = M.fold ((||) . p . taggedFst) False m
+allUDFM :: (elt -> Bool) -> UniqDFM elt -> Bool
+allUDFM p (UDFM m _i) = M.fold ((&&) . p . taggedFst) True m
+
instance Monoid (UniqDFM a) where
mempty = emptyUDFM
mappend = plusUDFM
@@ -368,3 +379,9 @@ pprUniqDFM ppr_elt ufm
= brackets $ fsep $ punctuate comma $
[ ppr uq <+> text ":->" <+> ppr_elt elt
| (uq, elt) <- udfmToList ufm ]
+
+pprUDFM :: UniqDFM a -- ^ The things to be pretty printed
+ -> ([a] -> SDoc) -- ^ The pretty printing function to use on the elements
+ -> SDoc -- ^ 'SDoc' where the things have been pretty
+ -- printed
+pprUDFM ufm pp = pp (eltsUDFM ufm)