From c9aa9bb5a8a1c5d80b4ec4a186bea3a3f00142cc Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Wed, 17 Oct 2007 14:40:07 +0000 Subject: [PATCH] re-instate missing parts of "put the @N suffix on stdcall foreign calls in .cmm code" These changes were apparently lost during "massive changes to add a 'zipper' representation of C-" --- compiler/cmm/CmmParse.y | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/compiler/cmm/CmmParse.y b/compiler/cmm/CmmParse.y index 1917055..7c55e19 100644 --- a/compiler/cmm/CmmParse.y +++ b/compiler/cmm/CmmParse.y @@ -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] -> FastString -- 1.7.10.4