diff options
author | Simon Marlow <simonmar@microsoft.com> | 2007-08-01 14:02:31 +0000 |
---|---|---|
committer | Simon Marlow <simonmar@microsoft.com> | 2007-08-01 14:02:31 +0000 |
commit | e7c08550be472eb94a383d4c6115c83e103fcd28 (patch) | |
tree | 843eea44aa8668d85d2477f3ef38d215455bc415 /rts/HeapStackCheck.cmm | |
parent | ef0628b3922b9b1eb3570705c4b8c52172dd2bdc (diff) | |
download | haskell-e7c08550be472eb94a383d4c6115c83e103fcd28.tar.gz |
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.
Diffstat (limited to 'rts/HeapStackCheck.cmm')
-rw-r--r-- | rts/HeapStackCheck.cmm | 24 |
1 files changed, 5 insertions, 19 deletions
diff --git a/rts/HeapStackCheck.cmm b/rts/HeapStackCheck.cmm index 3c66e7806f..5579e9238a 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, |