Ben Gamari pushed to branch wip/bco-docs at Glasgow Haskell Compiler / GHC
Commits:
-
acd08fcd
by Ben Gamari at 2025-05-15T13:05:59-04:00
-
882ffdec
by Ben Gamari at 2025-05-15T13:06:02-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 |