From e7c08550be472eb94a383d4c6115c83e103fcd28 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Wed, 1 Aug 2007 14:02:31 +0000 Subject: [PATCH] FIX recent PPC crashes introduced by the pointer-tagging patch (I hope) 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 | 3 +-- includes/mkDerivedConstants.c | 4 ---- rts/HeapStackCheck.cmm | 24 +++++------------------- 3 files changed, 6 insertions(+), 25 deletions(-) diff --git a/includes/Closures.h b/includes/Closures.h index df53cee..64582ba 100644 --- a/includes/Closures.h +++ b/includes/Closures.h @@ -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; diff --git a/includes/mkDerivedConstants.c b/includes/mkDerivedConstants.c index aa3c673..2fe99b6 100644 --- a/includes/mkDerivedConstants.c +++ b/includes/mkDerivedConstants.c @@ -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); diff --git a/rts/HeapStackCheck.cmm b/rts/HeapStackCheck.cmm index 3c66e78..5579e92 100644 --- a/rts/HeapStackCheck.cmm +++ b/rts/HeapStackCheck.cmm @@ -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, -- 1.7.10.4