Skip to content
This repository was archived by the owner on Nov 24, 2022. It is now read-only.

Commit 0807d87

Browse files
Andrea CondoluciTerrorJack
authored andcommitted
Scavenge & dirty closures
1 parent 3edb6b2 commit 0807d87

File tree

6 files changed

+78
-7
lines changed

6 files changed

+78
-7
lines changed

asterius/rts/rts.constants.mjs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export const offset_StgLargeBitmap_bitmap = 0x8;
4848
export const sizeof_StgMutArrPtrs = 0x18;
4949
export const offset_StgMutArrPtrs_ptrs = 0x8;
5050
export const offset_StgMutArrPtrs_payload = 0x18;
51+
export const offset_StgMutVar_var = 0x8;
5152
export const offset_StgMVar_head = 0x8;
5253
export const offset_StgMVar_tail = 0x10;
5354
export const offset_StgMVar_value = 0x18;
@@ -78,11 +79,13 @@ export const offset_StgThunk_payload = 0x10;
7879
export const offset_StgThunkInfoTable_i = 0x0;
7980
export const offset_StgThunkInfoTable_srt = 0x18;
8081
export const offset_StgTSO_id = 0x30;
82+
export const offset_StgTSO_dirty = 0x38;
8183
export const offset_StgTSO_stackobj = 0x18;
8284
export const offset_StgTSO_what_next = 0x20;
8385
export const offset_StgTSO_why_blocked = 0x22;
8486
export const offset_StgTSO_block_info = 0x28;
8587
export const offset_StgStack_stack_size = 0x8;
88+
export const offset_StgStack_dirty = 0xc;
8689
export const offset_StgStack_sp = 0x10;
8790
export const offset_StgStack_stack = 0x18;
8891
export const offset_StgUpdateFrame_updatee = 0x8;

asterius/rts/rts.gc.mjs

Lines changed: 62 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -823,11 +823,18 @@ export class GC {
823823
this.scavengePointersFirst(c + 8, ptrs);
824824
return (1 + ptrs + non_ptrs) << 3;
825825
}
826+
case ClosureTypes.MUT_VAR_CLEAN: {
827+
this.scavengeClosureAt(c + rtsConstants.offset_StgMutVar_var);
828+
return rtsConstants.offset_StgMutVar_var + 8;
829+
}
830+
case ClosureTypes.MUT_VAR_DIRTY: {
831+
this.memory.i64Store(c, this.symbolTable["stg_MUT_VAR_CLEAN_info"]);
832+
this.scavengeClosureAt(c + rtsConstants.offset_StgMutVar_var);
833+
return rtsConstants.offset_StgMutVar_var + 8;
834+
}
826835
case ClosureTypes.CONSTR:
827836
case ClosureTypes.CONSTR_NOCAF:
828837
case ClosureTypes.BLACKHOLE:
829-
case ClosureTypes.MUT_VAR_CLEAN:
830-
case ClosureTypes.MUT_VAR_DIRTY:
831838
case ClosureTypes.PRIM:
832839
case ClosureTypes.MUT_PRIM:
833840
case ClosureTypes.COMPACT_NFDATA: {
@@ -917,8 +924,14 @@ export class GC {
917924
this.scavengeClosureAt(c + rtsConstants.offset_StgIndStatic_indirectee);
918925
return; // size not important, this object won't be moved
919926
}
920-
case ClosureTypes.MVAR_CLEAN:
927+
case ClosureTypes.MVAR_CLEAN: {
928+
this.scavengeClosureAt(c + rtsConstants.offset_StgMVar_head);
929+
this.scavengeClosureAt(c + rtsConstants.offset_StgMVar_tail);
930+
this.scavengeClosureAt(c + rtsConstants.offset_StgMVar_value);
931+
return rtsConstants.offset_StgMVar_value + 8;
932+
}
921933
case ClosureTypes.MVAR_DIRTY: {
934+
this.memory.i64Store(c, this.symbolTable["stg_MVAR_CLEAN_info"]);
922935
this.scavengeClosureAt(c + rtsConstants.offset_StgMVar_head);
923936
this.scavengeClosureAt(c + rtsConstants.offset_StgMVar_tail);
924937
this.scavengeClosureAt(c + rtsConstants.offset_StgMVar_value);
@@ -936,8 +949,6 @@ export class GC {
936949
);
937950
}
938951
case ClosureTypes.MUT_ARR_PTRS_CLEAN:
939-
case ClosureTypes.MUT_ARR_PTRS_DIRTY:
940-
case ClosureTypes.MUT_ARR_PTRS_FROZEN_DIRTY:
941952
case ClosureTypes.MUT_ARR_PTRS_FROZEN_CLEAN: {
942953
const ptrs = Number(
943954
this.memory.i64Load(c + rtsConstants.offset_StgMutArrPtrs_ptrs)
@@ -948,6 +959,28 @@ export class GC {
948959
);
949960
return rtsConstants.sizeof_StgMutArrPtrs + (ptrs << 3);
950961
}
962+
case ClosureTypes.MUT_ARR_PTRS_DIRTY: {
963+
this.memory.i64Store(c, this.symbolTable["stg_MUT_ARR_PTRS_CLEAN_info"]);
964+
const ptrs = Number(
965+
this.memory.i64Load(c + rtsConstants.offset_StgMutArrPtrs_ptrs)
966+
);
967+
this.scavengePointersFirst(
968+
c + rtsConstants.offset_StgMutArrPtrs_payload,
969+
ptrs
970+
);
971+
return rtsConstants.sizeof_StgMutArrPtrs + (ptrs << 3);
972+
}
973+
case ClosureTypes.MUT_ARR_PTRS_FROZEN_DIRTY: {
974+
this.memory.i64Store(c, this.symbolTable["stg_MUT_ARR_PTRS_FROZEN_CLEAN_info"]);
975+
const ptrs = Number(
976+
this.memory.i64Load(c + rtsConstants.offset_StgMutArrPtrs_ptrs)
977+
);
978+
this.scavengePointersFirst(
979+
c + rtsConstants.offset_StgMutArrPtrs_payload,
980+
ptrs
981+
);
982+
return rtsConstants.sizeof_StgMutArrPtrs + (ptrs << 3);
983+
}
951984
case ClosureTypes.WEAK: {
952985
this.scavengeClosureAt(c + rtsConstants.offset_StgWeak_cfinalizers);
953986
this.scavengeClosureAt(c + rtsConstants.offset_StgWeak_key);
@@ -956,10 +989,12 @@ export class GC {
956989
return rtsConstants.offset_StgWeak_link + 8;
957990
}
958991
case ClosureTypes.TSO: {
992+
this.memory.i32Store(c + rtsConstants.offset_StgTSO_dirty, 0);
959993
this.scavengeClosureAt(c + rtsConstants.offset_StgTSO_stackobj);
960994
return; // size not important, this object won't be moved
961995
}
962996
case ClosureTypes.STACK: {
997+
this.memory.i32Store(c + rtsConstants.offset_StgStack_dirty, 0);
963998
const
964999
stack_size =
9651000
this.memory.i32Load(c + rtsConstants.offset_StgStack_stack_size) << 3,
@@ -969,8 +1004,6 @@ export class GC {
9691004
return rtsConstants.offset_StgStack_stack + stack_size;
9701005
}
9711006
case ClosureTypes.SMALL_MUT_ARR_PTRS_CLEAN:
972-
case ClosureTypes.SMALL_MUT_ARR_PTRS_DIRTY:
973-
case ClosureTypes.SMALL_MUT_ARR_PTRS_FROZEN_DIRTY:
9741007
case ClosureTypes.SMALL_MUT_ARR_PTRS_FROZEN_CLEAN: {
9751008
const ptrs = Number(
9761009
this.memory.i64Load(c + rtsConstants.offset_StgSmallMutArrPtrs_ptrs)
@@ -981,6 +1014,28 @@ export class GC {
9811014
);
9821015
return rtsConstants.offset_StgSmallMutArrPtrs_payload + (ptrs << 3);
9831016
}
1017+
case ClosureTypes.SMALL_MUT_ARR_PTRS_DIRTY: {
1018+
this.memory.i64Store(c, this.symbolTable["stg_SMALL_MUT_ARR_PTRS_CLEAN_info"]);
1019+
const ptrs = Number(
1020+
this.memory.i64Load(c + rtsConstants.offset_StgSmallMutArrPtrs_ptrs)
1021+
);
1022+
this.scavengePointersFirst(
1023+
c + rtsConstants.offset_StgSmallMutArrPtrs_payload,
1024+
ptrs
1025+
);
1026+
return rtsConstants.offset_StgSmallMutArrPtrs_payload + (ptrs << 3);
1027+
}
1028+
case ClosureTypes.SMALL_MUT_ARR_PTRS_FROZEN_DIRTY: {
1029+
this.memory.i64Store(c, this.symbolTable["stg_SMALL_MUT_ARR_PTRS_FROZEN_CLEAN_info"]);
1030+
const ptrs = Number(
1031+
this.memory.i64Load(c + rtsConstants.offset_StgSmallMutArrPtrs_ptrs)
1032+
);
1033+
this.scavengePointersFirst(
1034+
c + rtsConstants.offset_StgSmallMutArrPtrs_payload,
1035+
ptrs
1036+
);
1037+
return rtsConstants.offset_StgSmallMutArrPtrs_payload + (ptrs << 3);
1038+
}
9841039
default:
9851040
throw new WebAssembly.RuntimeError();
9861041
}

asterius/src/Asterius/JSGen/Constants.hs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ rtsConstants =
9494
("sizeof_StgMutArrPtrs", sizeof_StgMutArrPtrs),
9595
("offset_StgMutArrPtrs_ptrs", offset_StgMutArrPtrs_ptrs),
9696
("offset_StgMutArrPtrs_payload", offset_StgMutArrPtrs_payload),
97+
("offset_StgMutVar_var", offset_StgMutVar_var),
9798
("offset_StgMVar_head", offset_StgMVar_head),
9899
("offset_StgMVar_tail", offset_StgMVar_tail),
99100
("offset_StgMVar_value", offset_StgMVar_value),
@@ -128,11 +129,13 @@ rtsConstants =
128129
("offset_StgThunkInfoTable_i", offset_StgThunkInfoTable_i),
129130
("offset_StgThunkInfoTable_srt", offset_StgThunkInfoTable_srt),
130131
("offset_StgTSO_id", offset_StgTSO_id),
132+
("offset_StgTSO_dirty", offset_StgTSO_dirty),
131133
("offset_StgTSO_stackobj", offset_StgTSO_stackobj),
132134
("offset_StgTSO_what_next", offset_StgTSO_what_next),
133135
("offset_StgTSO_why_blocked", offset_StgTSO_why_blocked),
134136
("offset_StgTSO_block_info", offset_StgTSO_block_info),
135137
("offset_StgStack_stack_size", offset_StgStack_stack_size),
138+
("offset_StgStack_dirty", offset_StgStack_dirty),
136139
("offset_StgStack_sp", offset_StgStack_sp),
137140
("offset_StgStack_stack", offset_StgStack_stack),
138141
("offset_StgUpdateFrame_updatee", offset_StgUpdateFrame_updatee),

asterius/src/Asterius/Ld.hs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,12 @@ rtsUsedSymbols =
6666
"stg_BLACKHOLE_info",
6767
"stg_WHITEHOLE_info",
6868
"stg_IND_info",
69+
"stg_MVAR_CLEAN_info",
70+
"stg_MUT_ARR_PTRS_CLEAN_info",
71+
"stg_MUT_ARR_PTRS_FROZEN_CLEAN_info",
72+
"stg_MUT_VAR_CLEAN_info",
73+
"stg_SMALL_MUT_ARR_PTRS_CLEAN_info",
74+
"stg_SMALL_MUT_ARR_PTRS_FROZEN_CLEAN_info",
6975
"stg_DEAD_WEAK_info",
7076
"stg_marked_upd_frame_info",
7177
"stg_NO_FINALIZER_closure",

ghc-toolkit/cbits/ghc_constants.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,8 @@ HsInt offset_StgMutArrPtrs_payload() {
257257
return offsetof(StgMutArrPtrs, payload);
258258
}
259259

260+
HsInt offset_StgMutVar_var() { return offsetof(StgMutVar, var); }
261+
260262
HsInt offset_StgMVar_head() { return offsetof(StgMVar, head); }
261263

262264
HsInt offset_StgMVar_tail() { return offsetof(StgMVar, tail); }

ghc-toolkit/src/Language/Haskell/GHC/Toolkit/Constants.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,8 @@ foreign import ccall unsafe "offset_StgMutArrPtrs_size"
243243
foreign import ccall unsafe "offset_StgMutArrPtrs_payload"
244244
offset_StgMutArrPtrs_payload :: Int
245245

246+
foreign import ccall unsafe "offset_StgMutVar_var" offset_StgMutVar_var :: Int
247+
246248
foreign import ccall unsafe "offset_StgMVar_head" offset_StgMVar_head :: Int
247249

248250
foreign import ccall unsafe "offset_StgMVar_tail" offset_StgMVar_tail :: Int

0 commit comments

Comments
 (0)