diff options
Diffstat (limited to 'rts')
-rw-r--r-- | rts/RetainerProfile.c | 2 | ||||
-rw-r--r-- | rts/sm/Compact.c | 2 | ||||
-rw-r--r-- | rts/sm/Evac.c | 4 | ||||
-rw-r--r-- | rts/sm/Sanity.c | 2 | ||||
-rw-r--r-- | rts/sm/Scav.c | 4 |
5 files changed, 8 insertions, 6 deletions
diff --git a/rts/RetainerProfile.c b/rts/RetainerProfile.c index 67a6da93cd..5a4530a8aa 100644 --- a/rts/RetainerProfile.c +++ b/rts/RetainerProfile.c @@ -1908,7 +1908,7 @@ resetStaticObjectForRetainerProfiling( StgClosure *static_objects ) break; case FUN_STATIC: maybeInitRetainerSet(p); - p = (StgClosure*)*FUN_STATIC_LINK(p); + p = (StgClosure*)*STATIC_LINK(p); break; case CONSTR: case CONSTR_1_0: diff --git a/rts/sm/Compact.c b/rts/sm/Compact.c index 0e2fea8990..f252e89161 100644 --- a/rts/sm/Compact.c +++ b/rts/sm/Compact.c @@ -212,7 +212,7 @@ thread_static( StgClosure* p ) p = *THUNK_STATIC_LINK(p); continue; case FUN_STATIC: - p = *FUN_STATIC_LINK(p); + p = *STATIC_LINK(info,p); continue; case CONSTR: case CONSTR_NOCAF: diff --git a/rts/sm/Evac.c b/rts/sm/Evac.c index a8559e7e00..e8baebe553 100644 --- a/rts/sm/Evac.c +++ b/rts/sm/Evac.c @@ -542,8 +542,8 @@ loop: return; case FUN_STATIC: - if (info->srt != 0) { - evacuate_static_object(FUN_STATIC_LINK((StgClosure *)q), q); + if (info->srt != 0 || info->layout.payload.ptrs != 0) { + evacuate_static_object(STATIC_LINK(info,(StgClosure *)q), q); } return; diff --git a/rts/sm/Sanity.c b/rts/sm/Sanity.c index 7a0ad1672f..defefa3f01 100644 --- a/rts/sm/Sanity.c +++ b/rts/sm/Sanity.c @@ -677,7 +677,7 @@ checkStaticObjects ( StgClosure* static_objects ) break; case FUN_STATIC: - p = *FUN_STATIC_LINK((StgClosure *)p); + p = *STATIC_LINK(info,(StgClosure *)p); break; case CONSTR: diff --git a/rts/sm/Scav.c b/rts/sm/Scav.c index 79adcaa826..5db0acbbee 100644 --- a/rts/sm/Scav.c +++ b/rts/sm/Scav.c @@ -1722,7 +1722,9 @@ scavenge_static(void) case FUN_STATIC: scavenge_fun_srt(info); - break; + // fallthrough: a FUN_STATIC can also be an SRT, so it may have pointer + // fields. See Note [SRTs] in CmmBuildInfoTables, specifically the [FUN] + // optimisation. case CONSTR: case CONSTR_NOCAF: |