Ben Gamari pushed to branch wip/bco-docs at Glasgow Haskell Compiler / GHC

Commits:

4 changed files:

Changes:

  • compiler/GHC/ByteCode/Asm.hs
    ... ... @@ -266,7 +266,13 @@ assembleBCO platform
    266 266
     
    
    267 267
       let !insns_arr =  mkBCOByteArray $ final_isn_array
    
    268 268
           !bitmap_arr = mkBCOByteArray $ mkBitmapArray bsize bitmap
    
    269
    -      ul_bco = UnlinkedBCO nm arity insns_arr bitmap_arr (fromSmallArray final_lit_array) (fromSmallArray final_ptr_array)
    
    269
    +      ul_bco = UnlinkedBCO { unlinkedBCOName = nm
    
    270
    +                           , unlinkedBCOArity = arity
    
    271
    +                           , unlinkedBCOInstrs = insns_arr
    
    272
    +                           , unlinkedBCOBitmap = bitmap_arr
    
    273
    +                           , unlinkedBCOLits = fromSmallArray final_lit_array
    
    274
    +                           , unlinkedBCOPtrs = fromSmallArray final_ptr_array
    
    275
    +                           }
    
    270 276
     
    
    271 277
       -- 8 Aug 01: Finalisers aren't safe when attached to non-primitive
    
    272 278
       -- objects, since they might get run too early.  Disable this until
    
    ... ... @@ -275,6 +281,7 @@ assembleBCO platform
    275 281
     
    
    276 282
       return ul_bco
    
    277 283
     
    
    284
    +-- | Construct a word-array containing an @StgLargeBitmap@.
    
    278 285
     mkBitmapArray :: Word -> [StgWord] -> UArray Int Word
    
    279 286
     -- Here the return type must be an array of Words, not StgWords,
    
    280 287
     -- because the underlying ByteArray# will end up as a component
    

  • compiler/GHC/ByteCode/Linker.hs
    ... ... @@ -65,11 +65,13 @@ linkBCO interp pkgs_loaded le bco_ix
    65 65
       (lits :: [Word]) <- mapM (fmap fromIntegral . lookupLiteral interp pkgs_loaded le) (elemsFlatBag lits0)
    
    66 66
       ptrs <- mapM (resolvePtr interp pkgs_loaded le bco_ix) (elemsFlatBag ptrs0)
    
    67 67
       let lits' = listArray (0 :: Int, fromIntegral (sizeFlatBag lits0)-1) lits
    
    68
    -  return (ResolvedBCO isLittleEndian arity
    
    69
    -              insns
    
    70
    -              bitmap
    
    71
    -              (mkBCOByteArray lits')
    
    72
    -              (addListToSS emptySS ptrs))
    
    68
    +  return $ ResolvedBCO { resolvedBCOIsLE   = isLittleEndian
    
    69
    +                       , resolvedBCOArity  = arity
    
    70
    +                       , resolvedBCOInstrs = insns
    
    71
    +                       , resolvedBCOBitmap = bitmap
    
    72
    +                       , resolvedBCOLits   = mkBCOByteArray lits'
    
    73
    +                       , resolvedBCOPtrs   = addListToSS emptySS ptrs
    
    74
    +                       }
    
    73 75
     
    
    74 76
     lookupLiteral :: Interp -> PkgsLoaded -> LinkerEnv -> BCONPtr -> IO Word
    
    75 77
     lookupLiteral interp pkgs_loaded le ptr = case ptr of
    

  • rts/PrimOps.cmm
    ... ... @@ -2440,6 +2440,7 @@ stg_newBCOzh ( P_ instrs,
    2440 2440
                    W_ arity,
    
    2441 2441
                    P_ bitmap_arr )
    
    2442 2442
     {
    
    2443
    +    // N.B. bitmap_arr contains a full StgLargeBitmap object.
    
    2443 2444
         W_ bco, bytes, words;
    
    2444 2445
     
    
    2445 2446
         words = BYTES_TO_WDS(SIZEOF_StgBCO) + BYTE_ARR_WDS(bitmap_arr);
    

  • rts/include/rts/storage/Closures.h
    ... ... @@ -427,7 +427,7 @@ typedef struct {
    427 427
         StgArrBytes   *literals; // literals used by the instructions
    
    428 428
         StgMutArrPtrs *ptrs; // free variables
    
    429 429
         StgHalfWord   arity; // arity of this BCO
    
    430
    -    StgHalfWord   size;  // size of the bitmap
    
    430
    +    StgHalfWord   size;  // size of the closure and bitmap
    
    431 431
         StgWord       bitmap[]; // an StgLargeBitmap
    
    432 432
     } StgBCO;
    
    433 433