From: Ian Lynagh Date: Fri, 9 Apr 2010 10:42:07 +0000 (+0000) Subject: Handle IND_STATIC in isRetainer X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=129e7b91d1cd0fc583b6bba01e39d10c30db18be Handle IND_STATIC in isRetainer 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. --- diff --git a/rts/RetainerProfile.c b/rts/RetainerProfile.c index d14ba06..07a3db4 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 cbbb8b6..f69c81d 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.