| ... |
... |
@@ -61,8 +61,7 @@ import Data.Typeable (Typeable) |
|
61
|
61
|
import qualified GHC.Data.Strict as Strict
|
|
62
|
62
|
import Data.Function ((&))
|
|
63
|
63
|
import GHC.Types.Name.Env
|
|
64
|
|
-import GHC.Types.Unique.DFM
|
|
65
|
|
-
|
|
|
64
|
+import Data.Maybe
|
|
66
|
65
|
|
|
67
|
66
|
-- ---------------------------------------------------------------------------
|
|
68
|
67
|
-- Reading and writing binary interface files
|
| ... |
... |
@@ -619,25 +618,30 @@ initNameReaderTable cache = do |
|
619
|
618
|
}
|
|
620
|
619
|
|
|
621
|
620
|
data BinSymbolTable = BinSymbolTable {
|
|
622
|
|
- bin_symtab_next :: !FastMutInt, -- The next index to use
|
|
623
|
|
- bin_symtab_map :: !(IORef (ModuleEnv (DNameEnv (Int,Name))))
|
|
624
|
|
- -- indexed by Name
|
|
|
621
|
+ bin_symtab_next :: !FastMutInt,
|
|
|
622
|
+ -- ^ The next index to use
|
|
|
623
|
+ bin_symtab_map :: !(IORef (NameEnv Int)),
|
|
|
624
|
+ -- ^ Deduplication indexed by Name
|
|
|
625
|
+ bin_symtab_tbl :: !(IORef (ModuleEnv [(Int,Name)]))
|
|
|
626
|
+ -- ^ Group table data by module for serialization
|
|
625
|
627
|
}
|
|
626
|
628
|
|
|
627
|
629
|
initNameWriterTable :: IO (WriterTable, BinaryWriter Name)
|
|
628
|
630
|
initNameWriterTable = do
|
|
629
|
631
|
symtab_next <- newFastMutInt 0
|
|
630
|
|
- symtab_map <- newIORef emptyModuleEnv
|
|
|
632
|
+ symtab_tbl <- newIORef emptyModuleEnv
|
|
|
633
|
+ symtab_map <- newIORef emptyNameEnv
|
|
631
|
634
|
let bin_symtab =
|
|
632
|
635
|
BinSymbolTable
|
|
633
|
636
|
{ bin_symtab_next = symtab_next
|
|
634
|
|
- , bin_symtab_map = symtab_map
|
|
|
637
|
+ , bin_symtab_map = symtab_map
|
|
|
638
|
+ , bin_symtab_tbl = symtab_tbl
|
|
635
|
639
|
}
|
|
636
|
640
|
|
|
637
|
641
|
let put_symtab bh = do
|
|
638
|
642
|
name_count <- readFastMutInt symtab_next
|
|
639
|
|
- symtab_map <- readIORef symtab_map
|
|
640
|
|
- putSymbolTable bh name_count symtab_map
|
|
|
643
|
+ symtab_tbl <- readIORef symtab_tbl
|
|
|
644
|
+ putSymbolTable bh name_count symtab_tbl
|
|
641
|
645
|
pure name_count
|
|
642
|
646
|
|
|
643
|
647
|
return
|
| ... |
... |
@@ -660,14 +664,14 @@ The symbol table payload will look like: |
|
660
|
664
|
$table_ix
|
|
661
|
665
|
$occ
|
|
662
|
666
|
-}
|
|
663
|
|
-putSymbolTable :: WriteBinHandle -> Int -> ModuleEnv (DNameEnv (Int, Name)) -> IO ()
|
|
|
667
|
+putSymbolTable :: WriteBinHandle -> Int -> ModuleEnv [(Int, Name)] -> IO ()
|
|
664
|
668
|
putSymbolTable bh name_count symtab = do
|
|
665
|
669
|
put_ bh name_count
|
|
666
|
670
|
put_ bh (sizeModuleEnv symtab)
|
|
667
|
|
- forM_ (moduleEnvToList symtab) $ \(mod,namesEnv) -> do
|
|
|
671
|
+ forM_ (moduleEnvToList symtab) $ \(mod,names) -> do
|
|
668
|
672
|
put_ bh mod
|
|
669
|
|
- put_ bh (sizeUDFM namesEnv)
|
|
670
|
|
- forM_ (eltsDNameEnv namesEnv) $ \(table_ix, name) -> do
|
|
|
673
|
+ put_ bh (length names) -- todo: don't use length?
|
|
|
674
|
+ forM_ names $ \(table_ix, name) -> do
|
|
671
|
675
|
let occ = assertPpr (isExternalName name) (ppr name) (nameOccName name)
|
|
672
|
676
|
put_ bh table_ix
|
|
673
|
677
|
put_ bh occ
|
| ... |
... |
@@ -680,11 +684,9 @@ getSymbolTable bh name_cache = do |
|
680
|
684
|
updateNameCache' name_cache $ \cache0 -> do
|
|
681
|
685
|
mut_arr <- newArray_ (0, sz-1) :: IO (IOArray Int Name)
|
|
682
|
686
|
mods_sz <- get bh :: IO Int
|
|
683
|
|
- let
|
|
684
|
|
- go_mod_name cache1 _mods_ix = do
|
|
685
|
|
- mod <- get bh :: IO Module
|
|
686
|
|
- mod_nms_sz <- get bh :: IO Int
|
|
687
|
|
- foldGet' (fromIntegral mod_nms_sz) bh cache1 $ \_mod_nms_ix (table_ix, occ) cache2 -> do
|
|
|
687
|
+ cache <-
|
|
|
688
|
+ foldGet' (fromIntegral mods_sz) bh cache0 $ \_mod_ix (mod,mod_nms_sz) cache1 -> do
|
|
|
689
|
+ foldGet' (fromIntegral (mod_nms_sz::Int)) bh cache1 $ \_mod_nms_ix (table_ix, occ) cache2 -> do
|
|
688
|
690
|
case lookupOrigNameCache cache2 mod occ of
|
|
689
|
691
|
Just name -> do
|
|
690
|
692
|
writeArray mut_arr table_ix name
|
| ... |
... |
@@ -693,9 +695,8 @@ getSymbolTable bh name_cache = do |
|
693
|
695
|
uniq <- takeUniqFromNameCache name_cache
|
|
694
|
696
|
let name = mkExternalName uniq mod occ noSrcSpan
|
|
695
|
697
|
cache3 = extendOrigNameCache cache2 mod occ name
|
|
696
|
|
- writeArray mut_arr table_ix name
|
|
|
698
|
+ writeArray mut_arr table_ix name -- todo: are these being forced? experiment and measure
|
|
697
|
699
|
return cache3
|
|
698
|
|
- cache <- foldM go_mod_name cache0 [0..mods_sz-1]
|
|
699
|
700
|
arr <- unsafeFreeze mut_arr
|
|
700
|
701
|
return (cache, arr)
|
|
701
|
702
|
|
| ... |
... |
@@ -721,6 +722,7 @@ getSymbolTable bh name_cache = do |
|
721
|
722
|
putName :: BinSymbolTable -> WriteBinHandle -> Name -> IO ()
|
|
722
|
723
|
putName BinSymbolTable{
|
|
723
|
724
|
bin_symtab_map = symtab_map_ref,
|
|
|
725
|
+ bin_symtab_tbl = symtab_tbl_ref,
|
|
724
|
726
|
bin_symtab_next = symtab_next }
|
|
725
|
727
|
bh name
|
|
726
|
728
|
| isKnownKeyName name
|
| ... |
... |
@@ -732,21 +734,20 @@ putName BinSymbolTable{ |
|
732
|
734
|
|
|
733
|
735
|
| otherwise
|
|
734
|
736
|
= do symtab_map <- readIORef symtab_map_ref
|
|
735
|
|
- let mod = nameModule name
|
|
736
|
|
- case lookupModuleEnv symtab_map mod of
|
|
737
|
|
- Just nm_env ->
|
|
738
|
|
- case lookupDNameEnv nm_env name of
|
|
739
|
|
- Just (off,_) -> put_ bh (fromIntegral off :: Word32)
|
|
740
|
|
- Nothing -> do
|
|
741
|
|
- off <- freshIndex
|
|
742
|
|
- writeIORef symtab_map_ref
|
|
743
|
|
- $! extendModuleEnv symtab_map mod (extendDNameEnv nm_env name (off,name))
|
|
744
|
|
- put_ bh (fromIntegral off :: Word32)
|
|
|
737
|
+ case lookupNameEnv symtab_map name of
|
|
|
738
|
+ Just off -> put_ bh (fromIntegral off :: Word32)
|
|
745
|
739
|
Nothing -> do
|
|
746
|
|
- off <- freshIndex
|
|
747
|
|
- writeIORef symtab_map_ref
|
|
748
|
|
- $! extendModuleEnv symtab_map mod (extendDNameEnv emptyDNameEnv name (off,name))
|
|
749
|
|
- put_ bh (fromIntegral off :: Word32)
|
|
|
740
|
+ off <- freshIndex
|
|
|
741
|
+ let mod = nameModule name
|
|
|
742
|
+ symtab_tbl <- readIORef symtab_tbl_ref
|
|
|
743
|
+ let mod_nms = fromMaybe [] (lookupModuleEnv symtab_tbl mod)
|
|
|
744
|
+
|
|
|
745
|
+ writeIORef symtab_tbl_ref $!
|
|
|
746
|
+ extendModuleEnv symtab_tbl mod ((off,name):mod_nms)
|
|
|
747
|
+
|
|
|
748
|
+ writeIORef symtab_map_ref
|
|
|
749
|
+ $! extendNameEnv symtab_map name off
|
|
|
750
|
+ put_ bh (fromIntegral off :: Word32)
|
|
750
|
751
|
where
|
|
751
|
752
|
freshIndex :: IO Int
|
|
752
|
753
|
freshIndex = do
|