Add a missing UNTAG_CLOSURE, causing bus errors on Sparc
authorSimon Marlow <marlowsd@gmail.com>
Mon, 24 May 2010 10:55:47 +0000 (10:55 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Mon, 24 May 2010 10:55:47 +0000 (10:55 +0000)
We just about got away with this on x86 which isn't
alignment-sensitive.  The result of the memory load is compared
against a few different values, but there is a fallback case that
happened to be the right thing when the pointer was tagged.  A good
bug to find, nonetheless.

rts/Messages.c

index 5a1e5bd..91ee9a6 100644 (file)
@@ -183,9 +183,10 @@ nat messageBlackHole(Capability *cap, MessageBlackHole *msg)
         return 0;
     }
 
-    // we know at this point that the closure 
+    // The blackhole must indirect to a TSO, a BLOCKING_QUEUE, an IND,
+    // or a value.
 loop:
-    p = ((StgInd*)bh)->indirectee;
+    p = UNTAG_CLOSURE(((StgInd*)bh)->indirectee);
     info = p->header.info;
 
     if (info == &stg_IND_info)