Rodrigo Mesquita pushed to branch wip/romes/27401-2 at Glasgow Haskell Compiler / GHC

Commits:

2 changed files:

Changes:

  • compiler/GHC/Iface/Binary.hs
    ... ... @@ -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
    

  • utils/haddock/haddock-api/src/Haddock/InterfaceFile.hs
    ... ... @@ -40,6 +40,7 @@ import Data.Coerce (coerce)
    40 40
     import Data.Function ((&))
    
    41 41
     import Data.IORef
    
    42 42
     import Data.Map (Map)
    
    43
    +import Data.Maybe (fromMaybe)
    
    43 44
     import Data.Version
    
    44 45
     import Data.Word
    
    45 46
     import GHC hiding (NoLink)
    
    ... ... @@ -172,11 +173,13 @@ writeInterfaceFile filename iface = do
    172 173
     
    
    173 174
       -- Make some intial state
    
    174 175
       symtab_next <- newFastMutInt 0
    
    175
    -  symtab_map <- newIORef emptyModuleEnv
    
    176
    +  symtab_tbl <- newIORef emptyModuleEnv
    
    177
    +  symtab_map <- newIORef emptyNameEnv
    
    176 178
       let bin_symtab =
    
    177 179
             BinSymbolTable
    
    178 180
               { bin_symtab_next = symtab_next
    
    179 181
               , bin_symtab_map = symtab_map
    
    182
    +          , bin_symtab_tbl = symtab_tbl
    
    180 183
               }
    
    181 184
       dict_next_ref <- newFastMutInt 0
    
    182 185
       dict_map_ref <- newIORef emptyUFM
    
    ... ... @@ -212,8 +215,8 @@ writeInterfaceFile filename iface = do
    212 215
     
    
    213 216
       -- write the symbol table itself
    
    214 217
       symtab_next' <- readFastMutInt symtab_next
    
    215
    -  symtab_map' <- readIORef symtab_map
    
    216
    -  putSymbolTable bh symtab_next' symtab_map'
    
    218
    +  symtab_tbl' <- readIORef symtab_tbl
    
    219
    +  putSymbolTable bh symtab_next' symtab_tbl'
    
    217 220
     
    
    218 221
       -- write the dictionary pointer at the fornt of the file
    
    219 222
       dict_p <- tellBinWriter bh
    
    ... ... @@ -265,26 +268,26 @@ putName :: BinSymbolTable -> WriteBinHandle -> Name -> IO ()
    265 268
     putName
    
    266 269
       BinSymbolTable
    
    267 270
         { bin_symtab_map = symtab_map_ref
    
    271
    +    , bin_symtab_tbl = symtab_tbl_ref
    
    268 272
         , bin_symtab_next = symtab_next
    
    269 273
         }
    
    270 274
       bh
    
    271 275
       name =
    
    272 276
         do
    
    273 277
           symtab_map <- readIORef symtab_map_ref
    
    274
    -      let mod' = nameModule name
    
    275
    -      case lookupModuleEnv symtab_map mod' of
    
    276
    -        Just nm_env ->
    
    277
    -          case lookupDNameEnv nm_env name of
    
    278
    -            Just (off, _) -> put_ bh (fromIntegral off :: Word32)
    
    279
    -            Nothing -> do
    
    280
    -              off <- freshIndex
    
    281
    -              writeIORef symtab_map_ref $!
    
    282
    -                extendModuleEnv symtab_map mod' (extendDNameEnv nm_env name (off, name))
    
    283
    -              put_ bh (fromIntegral off :: Word32)
    
    278
    +      case lookupNameEnv symtab_map name of
    
    279
    +        Just off -> put_ bh (fromIntegral off :: Word32)
    
    284 280
             Nothing -> do
    
    285 281
               off <- freshIndex
    
    282
    +          let mod' = nameModule name
    
    283
    +          symtab_tbl <- readIORef symtab_tbl_ref
    
    284
    +          let mod_nms = fromMaybe [] (lookupModuleEnv symtab_tbl mod')
    
    285
    +
    
    286
    +          writeIORef symtab_tbl_ref $!
    
    287
    +            extendModuleEnv symtab_tbl mod' ((off, name) : mod_nms)
    
    288
    +
    
    286 289
               writeIORef symtab_map_ref $!
    
    287
    -            extendModuleEnv symtab_map mod' (extendDNameEnv emptyDNameEnv name (off, name))
    
    290
    +            extendNameEnv symtab_map name off
    
    288 291
               put_ bh (fromIntegral off :: Word32)
    
    289 292
       where
    
    290 293
         freshIndex :: IO Int
    
    ... ... @@ -295,8 +298,10 @@ putName
    295 298
     
    
    296 299
     data BinSymbolTable = BinSymbolTable
    
    297 300
       { bin_symtab_next :: !FastMutInt -- The next index to use
    
    298
    -  , bin_symtab_map :: !(IORef (ModuleEnv (DNameEnv (Int, Name))))
    
    299
    -  -- indexed by Name
    
    301
    +  , bin_symtab_map :: !(IORef (NameEnv Int))
    
    302
    +  -- ^ Deduplication indexed by Name
    
    303
    +  , bin_symtab_tbl :: !(IORef (ModuleEnv [(Int, Name)]))
    
    304
    +  -- ^ Group table data by module for serialization
    
    300 305
       }
    
    301 306
     
    
    302 307
     putFastString :: BinDictionary -> WriteBinHandle -> FastString -> IO ()