summaryrefslogtreecommitdiff
path: root/rts/HeapStackCheck.cmm
diff options
context:
space:
mode:
authorSimon Marlow <simonmar@microsoft.com>2007-08-01 14:02:31 +0000
committerSimon Marlow <simonmar@microsoft.com>2007-08-01 14:02:31 +0000
commite7c08550be472eb94a383d4c6115c83e103fcd28 (patch)
tree843eea44aa8668d85d2477f3ef38d215455bc415 /rts/HeapStackCheck.cmm
parentef0628b3922b9b1eb3570705c4b8c52172dd2bdc (diff)
downloadhaskell-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.cmm24
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,