summaryrefslogtreecommitdiff
path: root/compiler/llvmGen/Llvm/PpLlvm.hs
diff options
context:
space:
mode:
authorErik de Castro Lopo <erikd@mega-nerd.com>2015-10-09 08:21:55 +1100
committerErik de Castro Lopo <erikd@mega-nerd.com>2015-10-10 10:42:27 +1100
commit5dc3db743ec477978b9727a313951be44dbd170f (patch)
treebd0c10d74e138d0b77e2c848aca434fb23d87f11 /compiler/llvmGen/Llvm/PpLlvm.hs
parente5baf62dfac7fd81acc2bd570ba7d3b1fedd8363 (diff)
downloadhaskell-5dc3db743ec477978b9727a313951be44dbd170f.tar.gz
Switch to LLVM version 3.7
Diffstat (limited to 'compiler/llvmGen/Llvm/PpLlvm.hs')
-rw-r--r--compiler/llvmGen/Llvm/PpLlvm.hs31
1 files changed, 18 insertions, 13 deletions
diff --git a/compiler/llvmGen/Llvm/PpLlvm.hs b/compiler/llvmGen/Llvm/PpLlvm.hs
index 8476b9d585..e032a51eec 100644
--- a/compiler/llvmGen/Llvm/PpLlvm.hs
+++ b/compiler/llvmGen/Llvm/PpLlvm.hs
@@ -117,6 +117,7 @@ ppLlvmMeta (MetaNamed n m)
-- | Print out an LLVM metadata value.
ppLlvmMetaExpr :: MetaExpr -> SDoc
+ppLlvmMetaExpr (MetaVar (LMLitVar (LMNullLit _))) = text "null"
ppLlvmMetaExpr (MetaStr s ) = text "!" <> doubleQuotes (ftext s)
ppLlvmMetaExpr (MetaNode n ) = text "!" <> int n
ppLlvmMetaExpr (MetaVar v ) = ppr v
@@ -273,17 +274,12 @@ ppCall ct fptr args attrs = case fptr of
++ "local var of pointer function type."
where
- ppCall' (LlvmFunctionDecl _ _ cc ret argTy params _) =
+ ppCall' (LlvmFunctionDecl _ _ cc ret _ _ _) =
let tc = if ct == TailCall then text "tail " else empty
ppValues = hsep $ punctuate comma $ map ppCallMetaExpr args
- ppArgTy = (ppCommaJoin $ map fst params) <>
- (case argTy of
- VarArgs -> text ", ..."
- FixedArgs -> empty)
- fnty = space <> lparen <> ppArgTy <> rparen <> char '*'
attrDoc = ppSpaceJoin attrs
in tc <> text "call" <+> ppr cc <+> ppr ret
- <> fnty <+> ppName fptr <> lparen <+> ppValues
+ <+> ppName fptr <> lparen <+> ppValues
<+> rparen <+> attrDoc
-- Metadata needs to be marked as having the `metadata` type when used
@@ -362,8 +358,11 @@ ppCmpXChg addr old new s_ord f_ord =
-- of specifying alignment.
ppLoad :: LlvmVar -> SDoc
-ppLoad var = text "load" <+> ppr var <> align
+ppLoad var = text "load" <+> derefType <+> ppr var <> align
where
+ derefType = case getVarType var of
+ LMPointer x -> ppr x <> comma
+ _ -> empty
align | isVector . pLower . getVarType $ var = text ", align 1"
| otherwise = empty
@@ -373,7 +372,10 @@ ppALoad ord st var = sdocWithDynFlags $ \dflags ->
align = text ", align" <+> ppr alignment
sThreaded | st = text " singlethread"
| otherwise = empty
- in text "load atomic" <+> ppr var <> sThreaded <+> ppSyncOrdering ord <> align
+ derefType = case getVarType var of
+ LMPointer x -> ppr x <> comma
+ _ -> empty
+ in text "load atomic" <+> derefType <+> ppr var <> sThreaded <+> ppSyncOrdering ord <> align
ppStore :: LlvmVar -> LlvmVar -> SDoc
ppStore val dst
@@ -386,10 +388,10 @@ ppStore val dst
ppCast :: LlvmCastOp -> LlvmVar -> LlvmType -> SDoc
-ppCast op from to
- = ppr op
+ppCast op from to
+ = ppr op
<+> ppr (getVarType from) <+> ppName from
- <+> text "to"
+ <+> text "to"
<+> ppr to
@@ -409,7 +411,10 @@ ppGetElementPtr :: Bool -> LlvmVar -> [LlvmVar] -> SDoc
ppGetElementPtr inb ptr idx =
let indexes = comma <+> ppCommaJoin idx
inbound = if inb then text "inbounds" else empty
- in text "getelementptr" <+> inbound <+> ppr ptr <> indexes
+ derefType = case getVarType ptr of
+ LMPointer x -> ppr x <> comma
+ _ -> error "ppGetElementPtr"
+ in text "getelementptr" <+> inbound <+> derefType <+> ppr ptr <> indexes
ppReturn :: Maybe LlvmVar -> SDoc