put the @N suffix on stdcall foreign calls in .cmm code
authorSimon Marlow <simonmar@microsoft.com>
Tue, 4 Sep 2007 14:28:53 +0000 (14:28 +0000)
committerSimon Marlow <simonmar@microsoft.com>
Tue, 4 Sep 2007 14:28:53 +0000 (14:28 +0000)
This applies to EnterCriticalSection and LeaveCriticalSection in the RTS

compiler/cmm/CLabel.hs
compiler/cmm/CmmParse.y
rts/HeapStackCheck.cmm
rts/PrimOps.cmm
rts/StgMiscClosures.cmm

index 6d8018a..28c43e1 100644 (file)
@@ -89,6 +89,7 @@ module CLabel (
        mkRtsApFastLabel,
 
        mkForeignLabel,
+        addLabelSize,
 
        mkCCLabel, mkCCSLabel,
 
@@ -364,6 +365,12 @@ mkApEntryLabel upd off             = RtsLabel (RtsApEntry   upd off)
 mkForeignLabel :: FastString -> Maybe Int -> Bool -> CLabel
 mkForeignLabel str mb_sz  is_dynamic = ForeignLabel str mb_sz is_dynamic
 
+addLabelSize :: CLabel -> Int -> CLabel
+addLabelSize (ForeignLabel str _ is_dynamic) sz
+  = ForeignLabel str (Just sz) is_dynamic
+addLabelSize label _
+  = label
+
        -- Cost centres etc.
 
 mkCCLabel      cc              = CC_Label cc
index 4cdb6eb..5a379c8 100644 (file)
@@ -823,8 +823,8 @@ newLocal kind ty name = do
 -- classifies these labels as dynamic, hence the code generator emits the
 -- PIC code for them.
 newImport :: FastString -> ExtFCode ()
-newImport name =
-       addVarDecl name (CmmLit (CmmLabel (mkForeignLabel name Nothing True)))
+newImport name
+   = addVarDecl name (CmmLit (CmmLabel (mkForeignLabel name Nothing True)))
 
 newLabel :: FastString -> ExtFCode BlockId
 newLabel name = do
@@ -909,15 +909,29 @@ foreignCall conv_string results_code expr_code args_code vols safety ret
           case convention of
             -- Temporary hack so at least some functions are CmmSafe
             CmmCallConv -> code (stmtC (CmmCall (CmmCallee expr convention) results args safety ret))
-            _ -> case safety of
+            _ -> 
+             let expr' = adjCallTarget convention expr args in
+             case safety of
              CmmUnsafe ->
                 code (emitForeignCall' PlayRisky results 
-                   (CmmCallee expr convention) args vols NoC_SRT ret)
+                   (CmmCallee expr' convention) args vols NoC_SRT ret)
               CmmSafe srt ->
                 code (emitForeignCall' (PlaySafe unused) results 
-                   (CmmCallee expr convention) args vols NoC_SRT ret) where
+                   (CmmCallee expr' convention) args vols NoC_SRT ret) where
                unused = panic "not used by emitForeignCall'"
 
+adjCallTarget :: CCallConv -> CmmExpr -> [(CmmExpr,MachHint)] -> CmmExpr
+#ifdef mingw32_TARGET_OS
+-- On Windows, we have to add the '@N' suffix to the label when making
+-- a call with the stdcall calling convention.
+adjCallTarget StdCallConv (CmmLit (CmmLabel lbl)) args
+  = CmmLit (CmmLabel (addLabelSize lbl (sum (map size args))))
+  where size (e,_) = max wORD_SIZE (machRepByteWidth (cmmExprRep e))
+                 -- c.f. CgForeignCall.emitForeignCall
+#endif
+adjCallTarget _ expr _
+  = expr
+
 primCall
        :: [ExtFCode (CmmFormal,MachHint)]
        -> FastString
index 753e671..11af7c7 100644 (file)
@@ -13,6 +13,8 @@
 #include "Cmm.h"
 
 #ifdef __PIC__
+import EnterCriticalSection
+import LeaveCriticalSection
 import pthread_mutex_unlock;
 #endif
 
index d465709..805e1a4 100644 (file)
@@ -47,6 +47,8 @@ import __gmpz_com;
 import base_GHCziIOBase_NestedAtomically_closure;
 import pthread_mutex_lock;
 import pthread_mutex_unlock;
+import EnterCriticalSection
+import LeaveCriticalSection
 #endif
 
 /*-----------------------------------------------------------------------------
index 43efa78..afd302a 100644 (file)
@@ -14,6 +14,8 @@
 
 #ifdef __PIC__
 import pthread_mutex_lock;
+import EnterCriticalSection
+import LeaveCriticalSection
 import base_GHCziBase_Czh_static_info;
 import base_GHCziBase_Izh_static_info;
 #endif