diff --git a/ghc/includes/COptWraps.lh b/ghc/includes/COptWraps.lh index baf217b6635f342110b82151eb35f469425e52a5..5b6d2d9a2e791981e913f6f654e15f2a58903dfa 100644 --- a/ghc/includes/COptWraps.lh +++ b/ghc/includes/COptWraps.lh @@ -588,8 +588,17 @@ gets whatever it's after. #define WRAPPER_SETUP(f,ignore1,ignore2) SaveAllStgContext(); +/* we have to make sure the STG registers are restored. +GCC tries to restore the value the registers had in +the beginning of the current call, which we don't want. +We defeat it by saving the registers in the stack again. :-( */ + #define WRAPPER_RETURN(x) \ - do {RestoreAllStgRegs(); if(x) JMP_(EnterNodeCode);} while(0); + do {RestoreAllStgRegs(); if(x) JMP_(EnterNodeCode);} while(0); \ + __asm__ volatile ( \ + "cal 1,136(1)\n" \ + "\tstm 13,-76(1)\n" \ + "\tstu 1,-136(1)"); #define SEPARATE_WRAPPER_RESTORE /* none */