summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rts/RetainerProfile.c6
-rw-r--r--rts/sm/GCAux.c4
2 files changed, 8 insertions, 2 deletions
diff --git a/rts/RetainerProfile.c b/rts/RetainerProfile.c
index d14ba06bf6..07a3db435b 100644
--- a/rts/RetainerProfile.c
+++ b/rts/RetainerProfile.c
@@ -1054,6 +1054,10 @@ isRetainer( StgClosure *c )
case PAP:
// indirection
case IND_PERM:
+ // IND_STATIC used to be an error, but at the moment it can happen
+ // as isAlive doesn't look through IND_STATIC as it ignores static
+ // closures. See trac #3956 for a program that hit this error.
+ case IND_STATIC:
case BLACKHOLE:
// static objects
case CONSTR_STATIC:
@@ -1069,8 +1073,6 @@ isRetainer( StgClosure *c )
//
// Error case
//
- // IND_STATIC cannot be *c, *cp, *r in the retainer profiling loop.
- case IND_STATIC:
// CONSTR_NOCAF_STATIC
// cannot be *c, *cp, *r in the retainer profiling loop.
case CONSTR_NOCAF_STATIC:
diff --git a/rts/sm/GCAux.c b/rts/sm/GCAux.c
index cbbb8b636f..f69c81d5e0 100644
--- a/rts/sm/GCAux.c
+++ b/rts/sm/GCAux.c
@@ -45,6 +45,10 @@ isAlive(StgClosure *p)
// ignore static closures
//
+ // ToDo: This means we never look through IND_STATIC, which means
+ // isRetainer needs to handle the IND_STATIC case rather than
+ // raising an error.
+ //
// ToDo: for static closures, check the static link field.
// Problem here is that we sometimes don't set the link field, eg.
// for static closures with an empty SRT or CONSTR_STATIC_NOCAFs.