Marge Bot pushed to branch wip/marge_bot_batch_merge_job at Glasgow Haskell Compiler / GHC
Commits:
-
944b4a78
by Ben Gamari at 2025-05-19T13:09:35-04:00
-
777ff2e9
by Ben Gamari at 2025-05-19T13:09:35-04:00
4 changed files:
- compiler/GHC/ByteCode/Asm.hs
- compiler/GHC/ByteCode/Linker.hs
- rts/PrimOps.cmm
- rts/include/rts/storage/Closures.h
Changes:
| ... | ... | @@ -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
|
| ... | ... | @@ -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
|
| ... | ... | @@ -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);
|
| ... | ... | @@ -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 |