Have Literal.Literal support the representation of NULL pointers only,
and not arbitrary pointer values.
(MachAddr <some-pointer-value-as-an-Integer>) wasn't being used,
except to handle nullAddr#. It (MachAddr) is a potential source of
problems should the compiler start doing constant folding or other
interesting operations over MachAddrs (think: interface files +
cross-compilation), so we might as well scale back the representation
of raw pointer values.
MachChar Int -- Char# At least 31 bits
| MachStr FastString
MachChar Int -- Char# At least 31 bits
| MachStr FastString
- | MachAddr Integer -- Whatever this machine thinks is a "pointer"
+ | MachNullAddr -- the NULL pointer, the only pointer value
+ -- that can be represented as a Literal.
| MachInt Integer -- Int# At least WORD_SIZE_IN_BITS bits
| MachInt64 Integer -- Int64# At least 64 bits
| MachInt Integer -- Int# At least WORD_SIZE_IN_BITS bits
| MachInt64 Integer -- Int64# At least 64 bits
instance Binary Literal where
put_ bh (MachChar aa) = do putByte bh 0; put_ bh aa
put_ bh (MachStr ab) = do putByte bh 1; put_ bh ab
instance Binary Literal where
put_ bh (MachChar aa) = do putByte bh 0; put_ bh aa
put_ bh (MachStr ab) = do putByte bh 1; put_ bh ab
- put_ bh (MachAddr ac) = do putByte bh 2; put_ bh ac
+ put_ bh (MachNullAddr) = do putByte bh 2
put_ bh (MachInt ad) = do putByte bh 3; put_ bh ad
put_ bh (MachInt64 ae) = do putByte bh 4; put_ bh ae
put_ bh (MachWord af) = do putByte bh 5; put_ bh af
put_ bh (MachInt ad) = do putByte bh 3; put_ bh ad
put_ bh (MachInt64 ae) = do putByte bh 4; put_ bh ae
put_ bh (MachWord af) = do putByte bh 5; put_ bh af
ab <- get bh
return (MachStr ab)
2 -> do
ab <- get bh
return (MachStr ab)
2 -> do
- ac <- get bh
- return (MachAddr ac)
3 -> do
ad <- get bh
return (MachInt ad)
3 -> do
ad <- get bh
return (MachInt ad)
double2FloatLit (MachDouble d) = MachFloat d
nullAddrLit :: Literal
double2FloatLit (MachDouble d) = MachFloat d
nullAddrLit :: Literal
-nullAddrLit = MachAddr 0
+nullAddrLit = MachNullAddr
literalType :: Literal -> Type
literalType (MachChar _) = charPrimTy
literalType (MachStr _) = addrPrimTy
literalType :: Literal -> Type
literalType (MachChar _) = charPrimTy
literalType (MachStr _) = addrPrimTy
-literalType (MachAddr _) = addrPrimTy
+literalType (MachNullAddr) = addrPrimTy
literalType (MachInt _) = intPrimTy
literalType (MachWord _) = wordPrimTy
literalType (MachInt64 _) = int64PrimTy
literalType (MachInt _) = intPrimTy
literalType (MachWord _) = wordPrimTy
literalType (MachInt64 _) = int64PrimTy
literalPrimRep (MachChar _) = CharRep
literalPrimRep (MachStr _) = AddrRep -- specifically: "char *"
literalPrimRep (MachChar _) = CharRep
literalPrimRep (MachStr _) = AddrRep -- specifically: "char *"
-literalPrimRep (MachAddr _) = AddrRep
+literalPrimRep (MachNullAddr) = AddrRep
literalPrimRep (MachInt _) = IntRep
literalPrimRep (MachWord _) = WordRep
literalPrimRep (MachInt64 _) = Int64Rep
literalPrimRep (MachInt _) = IntRep
literalPrimRep (MachWord _) = WordRep
literalPrimRep (MachInt64 _) = Int64Rep
\begin{code}
cmpLit (MachChar a) (MachChar b) = a `compare` b
cmpLit (MachStr a) (MachStr b) = a `compare` b
\begin{code}
cmpLit (MachChar a) (MachChar b) = a `compare` b
cmpLit (MachStr a) (MachStr b) = a `compare` b
-cmpLit (MachAddr a) (MachAddr b) = a `compare` b
+cmpLit (MachNullAddr) (MachNullAddr) = EQ
cmpLit (MachInt a) (MachInt b) = a `compare` b
cmpLit (MachWord a) (MachWord b) = a `compare` b
cmpLit (MachInt64 a) (MachInt64 b) = a `compare` b
cmpLit (MachInt a) (MachInt b) = a `compare` b
cmpLit (MachWord a) (MachWord b) = a `compare` b
cmpLit (MachInt64 a) (MachInt64 b) = a `compare` b
litTag (MachChar _) = _ILIT(1)
litTag (MachStr _) = _ILIT(2)
litTag (MachChar _) = _ILIT(1)
litTag (MachStr _) = _ILIT(2)
-litTag (MachAddr _) = _ILIT(3)
+litTag (MachNullAddr) = _ILIT(3)
litTag (MachInt _) = _ILIT(4)
litTag (MachWord _) = _ILIT(5)
litTag (MachInt64 _) = _ILIT(6)
litTag (MachInt _) = _ILIT(4)
litTag (MachWord _) = _ILIT(5)
litTag (MachInt64 _) = _ILIT(6)
Printing
~~~~~~~~
* MachX (i.e. unboxed) things are printed unadornded (e.g. 3, 'a', "foo")
Printing
~~~~~~~~
* MachX (i.e. unboxed) things are printed unadornded (e.g. 3, 'a', "foo")
- exceptions: MachFloat and MachAddr get an initial keyword prefix
+ exceptions: MachFloat gets an initial keyword prefix.
MachDouble d | code_style -> code_rational d
| otherwise -> rational d
MachDouble d | code_style -> code_rational d
| otherwise -> rational d
- MachAddr p | code_style -> ptext SLIT("(void*)") <> integer p
- | otherwise -> ptext SLIT("__addr") <+> integer p
+ MachNullAddr | code_style -> ptext SLIT("(void*)0")
+ | otherwise -> ptext SLIT("__NULL")
MachLabel l mb
| code_style -> ptext SLIT("(&") <> ftext l <> char ')'
MachLabel l mb
| code_style -> ptext SLIT("(&") <> ftext l <> char ')'
hashLiteral :: Literal -> Int
hashLiteral (MachChar c) = c + 1000 -- Keep it out of range of common ints
hashLiteral (MachStr s) = hashFS s
hashLiteral :: Literal -> Int
hashLiteral (MachChar c) = c + 1000 -- Keep it out of range of common ints
hashLiteral (MachStr s) = hashFS s
-hashLiteral (MachAddr i) = hashInteger i
+hashLiteral (MachNullAddr) = 0
hashLiteral (MachInt i) = hashInteger i
hashLiteral (MachInt64 i) = hashInteger i
hashLiteral (MachWord i) = hashInteger i
hashLiteral (MachInt i) = hashInteger i
hashLiteral (MachInt64 i) = hashInteger i
hashLiteral (MachWord i) = hashInteger i
MachChar i | i <= 0xff -> C.Lchar (chr i) t
MachChar i | otherwise -> C.Lint (toEnum i) t
MachStr s -> C.Lstring (unpackFS s) t
MachChar i | i <= 0xff -> C.Lchar (chr i) t
MachChar i | otherwise -> C.Lint (toEnum i) t
MachStr s -> C.Lstring (unpackFS s) t
- MachAddr i -> C.Lint i t
+ MachNullAddr -> C.Lint 0 t
MachInt i -> C.Lint i t
MachInt64 i -> C.Lint i t
MachWord i -> C.Lint i t
MachInt i -> C.Lint i t
MachInt64 i -> C.Lint i t
MachWord i -> C.Lint i t
pushLit env (MachFloat f) = text "ldc.r4" <+> rational f
pushLit env (MachDouble f) = text "ldc.r8" <+> rational f
pushLit env (MachLitLit _ _) = trace "WARNING: Cannot compile MachLitLit to ILX in IlxGen.lhs" (text "// MachLitLit!!! Not valid in ILX!!")
pushLit env (MachFloat f) = text "ldc.r4" <+> rational f
pushLit env (MachDouble f) = text "ldc.r8" <+> rational f
pushLit env (MachLitLit _ _) = trace "WARNING: Cannot compile MachLitLit to ILX in IlxGen.lhs" (text "// MachLitLit!!! Not valid in ILX!!")
-pushLit env (MachAddr w) = text "ldc.i4" <+> integer w <+> text "conv.i"
+pushLit env (MachNullAddr) = text "ldc.i4 0"
pushLit env (MachLabel l _) = trace "WARNING: Cannot compile MachLabel to ILX in IlxGen.lhs" (text "// MachLabel!!! Not valid in ILX!!")
pprIlxTopVar env v
pushLit env (MachLabel l _) = trace "WARNING: Cannot compile MachLabel to ILX in IlxGen.lhs" (text "// MachLabel!!! Not valid in ILX!!")
pprIlxTopVar env v
= case core of
MachChar c -> StInt (toInteger c)
MachStr s -> StString s
= case core of
MachChar c -> StInt (toInteger 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
MachInt i -> StInt i
MachWord w -> case word2IntLit core of MachInt iw -> StInt iw
MachLitLit s _ -> litLitErr