FIX recent PPC crashes introduced by the pointer-tagging patch (I hope)
authorSimon Marlow <simonmar@microsoft.com>
Wed, 1 Aug 2007 14:02:31 +0000 (14:02 +0000)
committerSimon Marlow <simonmar@microsoft.com>
Wed, 1 Aug 2007 14:02:31 +0000 (14:02 +0000)
There was an accidental endian-dependency in changes related to RET_FUN.
The changes in question weren't strictly necessary - they were left
over from the original workaround for the compacting GC problems, so
I've just reverted those changes in this patch, which should hopefully
fix the PPC problems.

includes/Closures.h
includes/mkDerivedConstants.c
rts/HeapStackCheck.cmm

index df53cee..64582ba 100644 (file)
@@ -306,8 +306,7 @@ typedef struct {
  */
 typedef struct {
     const struct _StgInfoTable* info;
-    StgHalfWord    size;
-    StgHalfWord    tag;
+    StgWord        size;
     StgClosure *   fun;
     StgClosure *   payload[FLEXIBLE_ARRAY];
 } StgRetFun;
index aa3c673..2fe99b6 100644 (file)
@@ -403,10 +403,6 @@ main(int argc, char *argv[])
     struct_field(StgLargeBitmap, size);
     field_offset(StgLargeBitmap, bitmap);
 
-    struct_field(StgRetFun, size);
-    struct_field(StgRetFun, tag);
-    struct_field(StgRetFun, fun);
-
     struct_size(snEntry);
     struct_field(snEntry,sn_obj);
     struct_field(snEntry,addr);
index 3c66e78..5579e92 100644 (file)
@@ -551,8 +551,6 @@ INFO_TABLE_RET( stg_ut_1_0_unreg, RET_SMALL, "ptr" W_ unused )
         +---------------------+
          |      f_closure      |
         +---------------------+
-         |         tag         |
-        +- - - - - - - - - - -+
          |        size         |
         +---------------------+
          |   stg_gc_fun_info   |
@@ -569,10 +567,7 @@ __stg_gc_fun
     W_ size;
     W_ info;
     W_ type;
-    W_ tag;
-    W_ ret_fun;
 
-    tag  = GETTAG(R1);
     info = %GET_FUN_INFO(UNTAG(R1));
 
     // cache the size
@@ -596,11 +591,9 @@ __stg_gc_fun
 #ifdef NO_ARG_REGS
     // we don't have to save any registers away
     Sp_adj(-3);
+    Sp(2) = R1;
+    Sp(1) = size;
     Sp(0) = stg_gc_fun_info;
-    ret_fun = Sp;
-    StgRetFun_size(ret_fun) = HALF_W_(size);
-    StgRetFun_tag(ret_fun)  = HALF_W_(tag);
-    StgRetFun_fun(ret_fun)  = R1;
     GC_GENERIC
 #else
     W_ type;
@@ -609,11 +602,9 @@ __stg_gc_fun
     if (type == ARG_GEN || type == ARG_GEN_BIG) {
         // regs already saved by the heap check code
         Sp_adj(-3);
+        Sp(2) = R1;
+        Sp(1) = size;
         Sp(0) = stg_gc_fun_info;
-        ret_fun = Sp;
-        StgRetFun_size(ret_fun) = HALF_W_(size);
-        StgRetFun_tag(ret_fun)  = HALF_W_(tag);
-        StgRetFun_fun(ret_fun)  = R1;
         // DEBUG_ONLY(foreign "C" debugBelch("stg_fun_gc_gen(ARG_GEN)"););
         GC_GENERIC
     } else { 
@@ -633,12 +624,7 @@ __stg_gc_fun
 
 INFO_TABLE_RET( stg_gc_fun, RET_FUN )
 {
-    // Grab the fun, but remember to add in the tag.  The GC doesn't
-    // guarantee to retain the tag on the pointer, so we have to do
-    // it manually, because the function entry code assumes it.
-    W_ ret_fun;
-    ret_fun = Sp;
-    R1 = StgRetFun_fun(ret_fun) | TO_W_(StgRetFun_tag(ret_fun));
+    R1 = Sp(2);
     Sp_adj(3);
 #ifdef NO_ARG_REGS
     // Minor optimisation: there are no argument registers to load up,