X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FLiteral.lhs;h=f2d09f37334b2017848dc6af92255f7a1b6a5c46;hb=9208de5cd7f22942c0a72d34f9716427cda97bbe;hp=76b7e488952d1398f24e4f1a51c230cd891133cd;hpb=0171936c9092666692c69a7f93fa75af976330cb;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/Literal.lhs b/ghc/compiler/basicTypes/Literal.lhs index 76b7e48..f2d09f3 100644 --- a/ghc/compiler/basicTypes/Literal.lhs +++ b/ghc/compiler/basicTypes/Literal.lhs @@ -36,13 +36,14 @@ import CStrings ( pprFSInCStyle ) import Outputable import FastTypes +import FastString import Binary import Util ( thenCmp ) import Ratio ( numerator ) import FastString ( uniqueOfFS, lengthFS ) -import Int ( Int8, Int16, Int32 ) -import Word ( Word8, Word16, Word32 ) +import DATA_INT ( Int8, Int16, Int32 ) +import DATA_WORD ( Word8, Word16, Word32 ) import Char ( ord, chr ) \end{code} @@ -98,7 +99,7 @@ data Literal = ------------------ -- First the primitive guys MachChar Int -- Char# At least 31 bits - | MachStr FAST_STRING + | MachStr FastString | MachAddr Integer -- Whatever this machine thinks is a "pointer" @@ -114,13 +115,13 @@ data Literal -- "foreign label" declaration. -- string argument is the name of a symbol. This literal -- refers to the *address* of the label. - | MachLabel FAST_STRING -- always an Addr# + | MachLabel FastString -- always an Addr# -- lit-lits only work for via-C compilation, hence they -- are deprecated. The string is emitted verbatim into -- the C file, and can therefore be any C expression, -- macro call, #defined constant etc. - | MachLitLit FAST_STRING Type -- Type might be Addr# or Int# etc + | MachLitLit FastString Type -- Type might be Addr# or Int# etc \end{code} Binary instance: must do this manually, because we don't want the type @@ -288,8 +289,11 @@ litIsDupable (MachStr _) = False litIsDupable other = True litSize :: Literal -> Int - -- used by CoreUnfold.sizeExpr -litSize (MachStr str) = lengthFS str `div` 4 +-- Used by CoreUnfold.sizeExpr +litSize (MachStr str) = 1 + (lengthFS str `div` 4) + -- Every literal has size at least 1, otherwise + -- f "x" + -- might be too small litSize _other = 1 \end{code} @@ -367,7 +371,6 @@ pprLit lit = getPprStyle $ \ sty -> let code_style = codeStyle sty - iface_style = ifaceStyle sty in case lit of MachChar ch | code_style -> hcat [ptext SLIT("(C_)"), text (show ch)] @@ -392,23 +395,28 @@ pprLit lit MachWord64 w | code_style -> pprHexVal w | otherwise -> ptext SLIT("__word64") <+> integer w - MachFloat f | code_style -> ptext SLIT("(StgFloat)") <> rational f + MachFloat f | code_style -> ptext SLIT("(StgFloat)") <> code_rational f | otherwise -> ptext SLIT("__float") <+> rational f - MachDouble d | iface_style && d < 0 -> parens (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 - MachLabel l | code_style -> ptext SLIT("(&") <> ptext l <> char ')' + MachLabel l | code_style -> ptext SLIT("(&") <> ftext l <> char ')' | otherwise -> ptext SLIT("__label") <+> pprHsString l - MachLitLit s ty | code_style -> ptext s + MachLitLit s ty | code_style -> ftext s | otherwise -> parens (hsep [ptext SLIT("__litlit"), pprHsString s, pprParendType ty]) +-- negative floating literals in code style need parentheses to avoid +-- interacting with surrounding syntax. +code_rational d | d < 0 = parens (rational d) + | otherwise = rational d + pprIntVal :: Integer -> SDoc -- Print negative integers with parens to be sure it's unambiguous pprIntVal i | i < 0 = parens (integer i) @@ -459,6 +467,6 @@ hashInteger i = 1 + abs (fromInteger (i `rem` 10000)) -- The 1+ is to avoid zero, which is a Bad Number -- since we use * to combine hash values -hashFS :: FAST_STRING -> Int +hashFS :: FastString -> Int hashFS s = iBox (uniqueOfFS s) \end{code}