[project @ 2005-08-02 14:04:19 by simonmar]
authorsimonmar <unknown>
Tue, 2 Aug 2005 14:04:19 +0000 (14:04 +0000)
committersimonmar <unknown>
Tue, 2 Aug 2005 14:04:19 +0000 (14:04 +0000)
save + restore caller-saves registers around foreign calls

ghc/compiler/nativeGen/AsmCodeGen.lhs

index 831accf..93b385f 100644 (file)
@@ -346,8 +346,14 @@ fixAssign (CmmAssign (CmmGlobal reg) src)
 
 fixAssign (CmmCall target results args vols)
   = mapAndUnzipUs fixResult results `thenUs` \ (results',stores) ->
-    returnUs (CmmCall target results' args vols : concat stores)
+    returnUs (caller_save ++
+             CmmCall target results' args vols :
+             caller_restore ++
+             concat stores)
   where
+       -- we also save/restore any caller-saves STG registers here
+       (caller_save, caller_restore) = callerSaveVolatileRegs vols
+
        fixResult g@(CmmGlobal reg,hint) = 
          case get_GlobalReg_reg_or_addr reg of
                Left realreg -> returnUs (g, [])