import MachOp ( MachOp(..) )
import PrimRep ( PrimRep(..), getPrimRepSizeInBytes )
import UniqSupply ( returnUs, thenUs, getUniqueUs, UniqSM )
-import Constants ( mIN_INTLIKE, mIN_CHARLIKE, uF_UPDATEE, bLOCK_SIZE,
+import Constants ( mIN_INTLIKE, mIN_CHARLIKE, bLOCK_SIZE,
rESERVED_STACK_WORDS )
import CLabel ( mkIntlikeClosureLabel, mkCharlikeClosureLabel,
- mkMAP_FROZEN_infoLabel,
mkForeignLabel )
import ForeignCall ( ForeignCall(..), CCallSpec(..), CCallTarget(..),
CCallConv(..), playSafe, playThreadSafe )
import Util ( notNull )
import FastString
import FastTypes
+import Char
#include "NCG.h"
\end{code}
%* *
%************************************************************************
-First, the dreaded @ccall@. We can't handle @casm@s.
+First, the dreaded @ccall@.
Usually, this compiles to an assignment, but when the left-hand side
is empty, we just perform the call and ignore the result.
-btw Why not let programmer use casm to provide assembly code instead
-of C code? ADR
-
ToDo: saving/restoring of volatile regs around ccalls.
JRS, 001113: always do the call of suspendThread and resumeThread as a ccall
StaticTarget nm -> (rhs, Left nm)
DynamicTarget | notNull rhs -- an assertion
-> (tail rhs, Right (amodeToStix (head rhs)))
- CasmTarget _
- -> ncgPrimopMoan "Native code generator can't handle foreign call"
- (ppr call)
stix_args = map amodeToStix' cargs
amodeToStix (CCharLike (CLit (MachChar c)))
= StIndex Word8Rep cHARLIKE_closure (StInt (toInteger off))
where
- off = charLikeSize * (c - mIN_CHARLIKE)
+ off = charLikeSize * (ord c - mIN_CHARLIKE)
amodeToStix (CCharLike x)
= panic "amodeToStix.CCharLike"
amodeToStix (CLit core)
= case core of
- MachChar c -> StInt (toInteger c)
+ MachChar c -> StInt (toInteger (ord c))
MachStr s -> StString s
MachNullAddr -> StInt 0
MachInt i -> StInt i
MachWord w -> case word2IntLit core of MachInt iw -> StInt iw
- MachLitLit s _ -> litLitErr
-- dreadful, but rare.
MachLabel l (Just x) -> StCLbl (mkForeignLabel (mkFastString (unpackFS l ++ '@':show x)) False)
MachLabel l _ -> StCLbl (mkForeignLabel l False{-ToDo: dynamic-})
amodeToStix other
= pprPanic "StixPrim.amodeToStix" (pprAmode other)
-
-litLitErr
- = ncgPrimopMoan "native code generator can't handle lit-lits" empty
\end{code}
Sizes of the CharLike and IntLike closures that are arranged as arrays
cHARLIKE_closure :: StixExpr
cHARLIKE_closure = StCLbl mkCharlikeClosureLabel
-mutArrPtrsFrozen_info = StCLbl mkMAP_FROZEN_infoLabel
-
-- these are the sizes of charLike and intLike closures, in _bytes_.
charLikeSize = (fixedHdrSize + 1) * (getPrimRepSizeInBytes PtrRep)
intLikeSize = (fixedHdrSize + 1) * (getPrimRepSizeInBytes PtrRep)