hLLVM-0.5.0.0: src/Llvm/Syntax/Printer/IrPrint.hs
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
module Llvm.Syntax.Printer.IrPrint
(module Llvm.Syntax.Printer.IrPrint
,module Llvm.Syntax.Printer.Common
) where
import Llvm.Data.Ir
import Llvm.Query.IrCxt
import Llvm.Syntax.Printer.Common
import Llvm.Syntax.Printer.SharedEntityPrint (integral)
import qualified Llvm.Syntax.Printer.SharedEntityPrint as P
import qualified Compiler.Hoopl as H
import qualified Data.Map as M (Map, toList)
import qualified Data.Set as S (Set, toList)
class IrPrint a where
printIr :: a -> Doc
instance IrPrint v => IrPrint (H.LabelMap v) where
printIr lm = let ls = H.mapToList lm
in vcat $ fmap (\(k,v) -> printIr k <+> text "::=>" <+> printIr v) ls
instance (IrPrint t1, IrPrint t2) => IrPrint (t1, t2) where
printIr (v1, v2) = parens (printIr v1 <> comma <+> printIr v2)
instance IrPrint x => IrPrint [x] where
printIr l = vcat $ fmap printIr l
instance (IrPrint k, IrPrint v) => IrPrint (M.Map k v) where
printIr mp = let l = M.toList mp
in printIr l
instance IrPrint v => IrPrint (S.Set v) where
printIr s = let l = S.toList s
in printIr l
instance IrPrint () where
printIr _ = text "()"
commaSepMaybe :: IrPrint a => Maybe a -> Doc
commaSepMaybe = maybe empty ((comma <+>) . printIr)
optSepToLlvm :: IrPrint a => Maybe a -> Doc -> Doc
optSepToLlvm (Nothing) _ = empty
optSepToLlvm (Just x) sep = printIr x <+> sep
instance IrPrint a => IrPrint (Maybe a) where
printIr (Just x) = printIr x
printIr Nothing = empty
instance IrPrint TlTriple where
printIr (TlTriple s) = hsep [text "target", text "triple", equals, printIr s]
instance IrPrint TlDataLayout where
printIr (TlDataLayout s) = hsep [text "target", text "datalayout", equals, printIr s]
instance IrPrint TlAlias where
printIr (TlAlias lhs vis dll tlm na link aliasee) =
hsep [printIr lhs, equals, printIr vis, printIr dll, printIr tlm, printIr na, text "alias", printIr link, printIr aliasee]
instance IrPrint TlDbgInit where
printIr (TlDbgInit s i) = hsep [text "dbginit", text s, integral i]
instance IrPrint TlStandaloneMd where
printIr (TlStandaloneMd s t) = char '!'<>(text s) <+> equals <+> printIr t
instance IrPrint TlNamedMd where
printIr (TlNamedMd mv nds) = printIr mv <+> equals <+> char '!'<>(braces (hsep $ punctuate comma $ fmap printIr nds))
instance IrPrint TlDeclare where
printIr (TlDeclare fproto) = text "declare" <+> printIr fproto
instance IrPrint a => IrPrint (TlDefine a) where
printIr (TlDefine fproto entry graph) = text "define" <+> printIr fproto $$
text "; the entry label is" <+>
printIr entry $$
printIr graph
instance IrPrint TlGlobal where
printIr x = case x of
(TlGlobalDtype lhs linkage vis dll tlm un addrspace externali gty ty c section comdat align) ->
hsep [optSepToLlvm lhs equals, printIr linkage, printIr vis, printIr dll, printIr tlm, printIr un, optSepToLlvm addrspace empty
, printIr externali, printIr gty, printIr ty, printIr c, commaSepNonEmpty [printIr section, printIr comdat, printIr align]]
(TlGlobalOpaque lhs linkage vis dll tlm un addrspace externali gty ty c section comdat align) ->
hsep [optSepToLlvm lhs equals, printIr linkage, printIr vis, printIr dll, printIr tlm, printIr un, optSepToLlvm addrspace empty
, printIr externali, printIr gty, printIr ty, printIr c, commaSepNonEmpty [printIr section, printIr comdat, printIr align]]
instance IrPrint TlTypeDef where
printIr x = case x of
(TlDatTypeDef n t) -> hsep [printIr n, equals, text "data type", printIr t]
(TlOpqTypeDef n t) -> hsep [printIr n, equals, text "opaque type", printIr t]
(TlFunTypeDef n t) -> hsep [printIr n, equals, text "function type", printIr t]
instance IrPrint TlDepLibs where
printIr (TlDepLibs l) = hsep [text "deplibs", equals, brackets (hsep $ punctuate comma $ fmap printIr l)]
instance IrPrint TlUnamedType where
printIr (TlUnamedType x t) = text "type" <+> printIr t <+> text("; " ++ (show x))
instance IrPrint TlModuleAsm where
printIr (TlModuleAsm qs) = hsep [text "module", text "asm", printIr qs]
instance IrPrint TlAttribute where
printIr (TlAttribute n l) = hsep [text "attributes", char '#' <> (integral n), braces (hsep $ fmap printIr l)]
instance IrPrint TlComdat where
printIr (TlComdat l s) = hsep [printIr l, equals, printIr s]
instance IrPrint a => IrPrint (Toplevel a) where
printIr (ToplevelTriple x) = printIr x
printIr (ToplevelDataLayout x) = printIr x
printIr (ToplevelAlias x) = printIr x
printIr (ToplevelDbgInit x) = printIr x
printIr (ToplevelStandaloneMd x) = printIr x
printIr (ToplevelNamedMd x) = printIr x
printIr (ToplevelDeclare x) = printIr x
printIr (ToplevelDefine x) = printIr x
printIr (ToplevelGlobal x) = printIr x
printIr (ToplevelTypeDef x) = printIr x
printIr (ToplevelDepLibs x) = printIr x
printIr (ToplevelUnamedType x) = printIr x
printIr (ToplevelModuleAsm x) = printIr x
printIr (ToplevelAttribute x) = printIr x
printIr (ToplevelComdat x) = printIr x
instance IrPrint TypeEnv where
printIr (TypeEnv dl tt td) = text "datalayout:" <+> printIr dl
$+$ text "triple:" <+> printIr tt
$+$ text "typedefs:" <+> printIr td
instance IrPrint GlobalCxt where
printIr (GlobalCxt te gl) = text "typeEnv:" <+> printIr te
$+$ text "globals:" <+> printIr gl
instance IrPrint FunCxt where
printIr (FunCxt fn p) = text "funName:" <+> text fn
$+$ text "funParameters:" <+> printIr p
instance IrPrint IrCxt where
printIr (IrCxt g l) = text "globalCxt:" <+> printIr g
$+$ text "funCxt:" <+> printIr l
instance IrPrint a => IrPrint (Module a) where
printIr (Module tops) = fcat $ fmap printIr tops
instance IrPrint a => IrPrint (Node a e x) where
printIr (Nlabel lbl) = printIr lbl
printIr (Pinst i) = printIr i
printIr (Cinst c) = printIr c
printIr (Tinst t) = printIr t
printIr (Comment s) = text s
printIr (Additional a) = printIr a
instance IrPrint a => IrPrint (H.Graph (Node a) H.C H.C) where
printIr g = braces (H.foldGraphNodes (\n -> \s -> s $$ (printIr n)) g empty)
instance IrPrint Label where
printIr l = text (show l)
instance IrPrint Exact where
printIr Exact = text "exact"
instance IrPrint NoWrap where
printIr Nsw = text "nsw"
printIr Nuw = text "nuw"
printIr Nsuw = text "nsw nuw"
printX :: (String, Doc, T Utype Const, T Utype Const) -> Doc
printX (op, cs, s1, s2) = text op <+> cs <+> parens (printIr s1 <> comma <+> printIr s2)
printF :: (String, Doc, T Utype Const, T Utype Const) -> Doc
printF (op, cs, s1, s2) = text op <+> cs <+> parens (printIr s1 <> comma <+> printIr s2)
printConversion :: IrPrint x => Conversion s x -> (Doc -> Doc) -> Doc
printConversion x p = case x of
Trunc fv dt -> text "trunc" <+> p (printIr fv <+> text "to" <+> printIr dt)
Zext fv dt -> text "zext" <+> p (printIr fv <+> text "to" <+> printIr dt)
Sext fv dt -> text "sext" <+> p (printIr fv <+> text "to" <+> printIr dt)
FpTrunc fv dt -> text "fptrunc" <+> p (printIr fv <+> text "to" <+> printIr dt)
FpExt fv dt -> text "fpext" <+> p (printIr fv <+> text "to" <+> printIr dt)
FpToUi fv dt -> text "fptoui" <+> p (printIr fv <+> text "to" <+> printIr dt)
FpToSi fv dt -> text "fptosi" <+> p (printIr fv <+> text "to" <+> printIr dt)
UiToFp fv dt -> text "uitofp" <+> p (printIr fv <+> text "to" <+> printIr dt)
SiToFp fv dt -> text "sitofp" <+> p (printIr fv <+> text "to" <+> printIr dt)
PtrToInt fv dt -> text "ptrtoint" <+> p (printIr fv <+> text "to" <+> printIr dt)
IntToPtr fv dt -> text "inttoptr" <+> p (printIr fv <+> text "to" <+> printIr dt)
Bitcast fv dt -> text "bitcast" <+> p (printIr fv <+> text "to" <+> printIr dt)
AddrSpaceCast fv dt -> text "addrspacecast" <+> p (printIr fv <+> text "to" <+> printIr dt)
instance IrPrint (Conversion s Const) where
printIr x = printConversion x parens
instance IrPrint (GetElementPtr s Const) where
printIr (GetElementPtr b base indices) =
hsep [text "getelementptr", printIr b, parens (commaSepList ((printIr base):fmap printIr indices))]
instance IrPrint (Select s r Const) where
printIr (Select cnd tc1 tc2) = text "select" <+> (parens (commaSepList [printIr cnd, printIr tc1, printIr tc2]))
instance (IrPrint a, IrPrint b) => IrPrint (Either a b) where
printIr (Left a) = printIr a
printIr (Right b) = printIr b
instance IrPrint (Icmp ScalarB Const) where
printIr (Icmp op t c1 c2) =
text "icmp" <+> printIr op <+> parens (commaSepList [printIr (T t c1), printIr (T t c2)])
instance IrPrint (Icmp VectorB Const) where
printIr (Icmp op t c1 c2) =
text "icmp" <+> printIr op <+> parens (commaSepList [printIr (T t c1), printIr (T t c2)])
instance IrPrint (Fcmp s Const) where
printIr (Fcmp op t c1 c2) =
text "fcmp" <+> printIr op <+> parens (commaSepList [printIr (T t c1), printIr (T t c2)])
instance IrPrint (ShuffleVector r Const) where
printIr (ShuffleVector tc1 tc2 mask) =
text "shufflevector" <+> parens (commaSepList [printIr tc1, printIr tc2, printIr mask])
instance IrPrint (ExtractValue Const) where
printIr (ExtractValue tc indices) =
hsep [text "extractvalue", parens (commaSepList ((printIr tc:(fmap integral indices))))]
instance IrPrint (InsertValue Const) where
printIr (InsertValue vect tc indices) =
hsep [text "insertvalue", parens (commaSepList ((printIr vect:printIr tc:(fmap integral indices))))]
instance IrPrint (ExtractElement r Const) where
printIr (ExtractElement tc index) =
hsep [text "extractelement", parens (printIr tc <> comma <+> printIr index)]
instance IrPrint (InsertElement r Const) where
printIr (InsertElement tc1 tc2 index) =
hsep [text "insertelement", parens (printIr tc1 <> comma <+> printIr tc2 <> comma <+> printIr index)]
instance IrPrint Const where
printIr cst = case cst of
C_u8 v -> integral v
C_u16 v -> integral v
C_u32 v -> integral v
C_u64 v -> integral v
C_u96 v -> integral v
C_u128 v -> integral v
C_s8 v -> integral v
C_s16 v -> integral v
C_s32 v -> integral v
C_s64 v -> integral v
C_s96 v -> integral v
C_s128 v -> integral v
C_int i -> text i
C_uhex_int i -> text "u0x" <> (text i)
C_shex_int i -> text "s0x" <> (text i)
C_float s -> text s
C_null -> text "null"
C_undef -> text "undef"
C_true -> text "true"
C_false -> text "false"
C_zeroinitializer -> text "zeroinitializer"
C_globalAddr g -> printIr g
C_str s -> char 'c'<> (doubleQuotes $ text s)
(C_struct b ts) -> let v = (braces (commaSepList $ fmap printIr ts))
in case b of
Packed -> angleBrackets v
Unpacked -> v
(C_vector ts) -> angleBrackets (commaSepList $ fmap printIr ts)
(C_array ts) -> brackets (commaSepList $ fmap printIr ts)
C_vectorN n e -> angleBrackets (commaSepList $ fmap (\x -> printIr e) [1..n])
C_arrayN n e -> brackets (commaSepList $ fmap (\x -> printIr e) [1..n])
C_localId l -> printIr l
C_labelId l -> printIr l
C_block g a -> text "blockaddress" <+> parens (printIr g <> comma <+> printIr a)
C_add x t v1 v2 -> printX ("add", printIr x, T (ucast t) v1, T (ucast t) v2)
C_sub x t v1 v2 -> printX ("sub", printIr x, T (ucast t) v1, T (ucast t) v2)
C_mul x t v1 v2 -> printX ("mul", printIr x, T (ucast t) v1, T (ucast t) v2)
C_udiv x t v1 v2 -> printX ("udiv", printIr x, T (ucast t) v1, T (ucast t) v2)
C_sdiv x t v1 v2 -> printX ("sdiv", printIr x, T (ucast t) v1, T (ucast t) v2)
C_urem t v1 v2 -> printX ("urem", empty, T (ucast t) v1, T (ucast t) v2)
C_srem t v1 v2 -> printX ("srem", empty, T (ucast t) v1, T (ucast t) v2)
C_shl x t v1 v2 -> printX ("shl", printIr x, T (ucast t) v1, T (ucast t) v2)
C_lshr x t v1 v2 -> printX ("lshr", printIr x, T (ucast t) v1, T (ucast t) v2)
C_ashr x t v1 v2 -> printX ("ashr", printIr x, T (ucast t) v1, T (ucast t) v2)
C_and t v1 v2 -> printX ("and", empty, T (ucast t) v1, T (ucast t) v2)
C_or t v1 v2 -> printX ("or", empty, T (ucast t) v1, T (ucast t) v2)
C_xor t v1 v2 -> printX ("xor", empty, T (ucast t) v1, T (ucast t) v2)
C_add_V x t v1 v2 -> printX ("add", printIr x, T (ucast t) v1, T (ucast t) v2)
C_sub_V x t v1 v2 -> printX ("sub", printIr x, T (ucast t) v1, T (ucast t) v2)
C_mul_V x t v1 v2 -> printX ("mul", printIr x, T (ucast t) v1, T (ucast t) v2)
C_udiv_V x t v1 v2 -> printX ("udiv", printIr x, T (ucast t) v1, T (ucast t) v2)
C_sdiv_V x t v1 v2 -> printX ("sdiv", printIr x, T (ucast t) v1, T (ucast t) v2)
C_urem_V t v1 v2 -> printX ("urem", empty, T (ucast t) v1, T (ucast t) v2)
C_srem_V t v1 v2 -> printX ("srem", empty, T (ucast t) v1, T (ucast t) v2)
C_shl_V x t v1 v2 -> printX ("shl", printIr x, T (ucast t) v1, T (ucast t) v2)
C_lshr_V x t v1 v2 -> printX ("lshr", printIr x, T (ucast t) v1, T (ucast t) v2)
C_ashr_V x t v1 v2 -> printX ("ashr", printIr x, T (ucast t) v1, T (ucast t) v2)
C_and_V t v1 v2 -> printX ("and", empty, T (ucast t) v1, T (ucast t) v2)
C_or_V t v1 v2 -> printX ("or", empty, T (ucast t) v1, T (ucast t) v2)
C_xor_V t v1 v2 -> printX ("xor", empty, T (ucast t) v1, T (ucast t) v2)
C_fadd x t v1 v2 -> printF ("fadd", printIr x, T (ucast t) v1, T (ucast t) v2)
C_fsub x t v1 v2 -> printF ("fsub", printIr x, T (ucast t) v1, T (ucast t) v2)
C_fmul x t v1 v2 -> printF ("fmul", printIr x, T (ucast t) v1, T (ucast t) v2)
C_fdiv x t v1 v2 -> printF ("fdiv", printIr x, T (ucast t) v1, T (ucast t) v2)
C_frem x t v1 v2 -> printF ("frem", printIr x, T (ucast t) v1, T (ucast t) v2)
C_fadd_V x t v1 v2 -> printF ("fadd", printIr x, T (ucast t) v1, T (ucast t) v2)
C_fsub_V x t v1 v2 -> printF ("fsub", printIr x, T (ucast t) v1, T (ucast t) v2)
C_fmul_V x t v1 v2 -> printF ("fmul", printIr x, T (ucast t) v1, T (ucast t) v2)
C_fdiv_V x t v1 v2 -> printF ("fdiv", printIr x, T (ucast t) v1, T (ucast t) v2)
C_frem_V x t v1 v2 -> printF ("frem", printIr x, T (ucast t) v1, T (ucast t) v2)
{- conversion -}
C_trunc fv dt -> text "trunc" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_zext fv dt -> text "zext" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_sext fv dt -> text "sext" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_fptrunc fv dt -> text "fptrunc" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_fpext fv dt -> text "fpext" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_fptoui fv dt -> text "fptoui" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_fptosi fv dt -> text "fptosi" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_uitofp fv dt -> text "uitofp" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_sitofp fv dt -> text "sitofp" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_ptrtoint fv dt -> text "ptrtoint" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_inttoptr fv dt -> text "inttoptr" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_addrspacecast fv dt -> text "addrspacecast" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_bitcast fv dt -> text "bitcast" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_trunc_V fv dt -> text "trunc" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_zext_V fv dt -> text "zext" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_sext_V fv dt -> text "sext" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_fptrunc_V fv dt -> text "fptrunc" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_fpext_V fv dt -> text "fpext" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_fptoui_V fv dt -> text "fptoui" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_fptosi_V fv dt -> text "fptosi" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_uitofp_V fv dt -> text "uitofp" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_sitofp_V fv dt -> text "sitofp" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_ptrtoint_V fv dt -> text "ptrtoint" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_inttoptr_V fv dt -> text "inttoptr" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_addrspacecast_V fv dt -> text "addrspacecast" <+> parens (printIr fv <+> text "to" <+> printIr dt)
C_getelementptr b base indices ->
hsep [text "getelementptr", printIr b, parens (commaSepList ((printIr base):fmap printIr indices))]
C_getelementptr_V b base indices ->
hsep [text "getelementptr", printIr b, parens (commaSepList ((printIr base):fmap printIr indices))]
C_select_I a -> printIr a
C_select_F a -> printIr a
C_select_P a -> printIr a
C_select_First cnd t f -> hsep [text "select", printIr cnd, printIr t, printIr f]
C_select_VI a -> printIr a
C_select_VF a -> printIr a
C_select_VP a -> printIr a
C_icmp a -> printIr a
C_icmp_V a -> printIr a
C_fcmp a -> printIr a
C_fcmp_V a -> printIr a
C_shufflevector_I a -> printIr a
C_shufflevector_F a -> printIr a
C_shufflevector_P a -> printIr a
C_extractelement_I a -> printIr a
C_extractelement_F a -> printIr a
C_extractelement_P a -> printIr a
C_insertelement_I a -> printIr a
C_insertelement_F a -> printIr a
C_insertelement_P a -> printIr a
C_extractvalue a -> printIr a
C_insertvalue a -> printIr a
instance IrPrint MdVar where
printIr (MdVar s) = char '!' <> (text s)
instance IrPrint MdNode where
printIr (MdNode s) = char '!' <> (text s)
instance IrPrint MetaConst where
printIr (McStruct c) = char '!' <> braces (commaSepList (fmap printIr c))
printIr (McString s) = char '!' <> (printIr s)
printIr (McMn n) = printIr n
printIr (McMv v) = printIr v
printIr (McRef s) = text $ show s
printIr (McSimple sc) = printIr sc
instance IrPrint (GetElementPtr s Value) where
printIr (GetElementPtr ib tv tcs) =
hsep [text "getelementptr", printIr ib, printIr tv, (commaSepList $ fmap printIr tcs)]
instance IrPrint (Icmp ScalarB Value) where
printIr (Icmp op t v1 v2) = hsep [text "icmp", printIr op, printIr t, printIr v1 <> comma, printIr v2]
instance IrPrint (Icmp VectorB Value) where
printIr (Icmp op t v1 v2) = hsep [text "icmp", printIr op, printIr t, printIr v1 <> comma, printIr v2]
instance IrPrint (Fcmp s Value) where
printIr (Fcmp op t v1 v2) = hsep [text "fcmp", printIr op, printIr t, printIr v1 <> comma, printIr v2]
instance IrPrint (Conversion s Value) where
printIr x = printConversion x id
instance IrPrint (Select s r Value) where
printIr (Select c t f) = text "select" <+> (commaSepList [printIr c, printIr t, printIr f])
instance IrPrint Value where
printIr (Val_ssa i) = printIr i
printIr (Val_const c) = printIr c
instance IrPrint TypedConstOrNull where
printIr (TypedConst tc) = printIr tc
printIr UntypedNull = text "null"
instance (IrPrint t, IrPrint x) => IrPrint (T t x) where
printIr (T t v) = printIr t <+> printIr v
instance IrPrint FunName where
printIr (FunNameGlobal s) = printIr s
printIr (FunNameString s) = text s
instance IrPrint CallSiteType where
printIr (CallSiteRet e) = printIr e
printIr (CallSiteFun e as) = printIr (Tpointer (ucast e) as)
instance IrPrint CallSite where
printIr (CsFun cc ra rt ident params fa) =
hsep [printIr cc, hsep $ fmap printIr ra, printIr rt, printIr ident, parens (commaSepList $ fmap printIr params), hsep $ fmap printIr fa]
printIr (CsAsm t se as dia s1 s2 params fa) =
hsep [printIr t, text "asm", printIr se, printIr as, printIr dia, printIr s1 <> comma
, printIr s2, parens (commaSepList $ fmap printIr params), hsep $ fmap printIr fa]
printIr (CsConversion ra t convert params fa) =
hsep [hsep $ fmap printIr ra, printIr t, printIr convert, parens (hsep $ fmap printIr params), hsep $ fmap printIr fa]
printIr (CsConversionV ra t convert params fa) =
hsep [hsep $ fmap printIr ra, printIr t, printIr convert, parens (hsep $ fmap printIr params), hsep $ fmap printIr fa]
instance IrPrint Clause where
printIr (Catch tv) = text "catch" <+> printIr tv
printIr (Filter tc) = text "filter" <+> printIr tc
printIr (CcoS c) = printIr c
printIr (CcoV c) = printIr c
instance IrPrint (Conversion s GlobalOrLocalId) where
printIr x = printConversion x parens
instance IrPrint PersFn where
printIr (PersFnId g) = printIr g
printIr (PersFnCastS c) = printIr c
printIr (PersFnCastV c) = printIr c
printIr PersFnUndef = text "undef"
printIr PersFnNull = text "null"
printIr (PersFnConst c) = printIr c
instance IrPrint (ExtractElement r Value) where
printIr (ExtractElement tv1 tv2) = hsep [text "extractelement", printIr tv1 <> comma, printIr tv2]
instance IrPrint (InsertElement r Value) where
printIr (InsertElement vect tv idx) =
hsep [text "insertelement", printIr vect <> comma, printIr tv <> comma, printIr idx]
instance IrPrint (ShuffleVector r Value) where
printIr (ShuffleVector vect1 vect2 mask) =
hsep [text "shufflevector", printIr vect1 <> comma, printIr vect2 <> comma, printIr mask]
instance IrPrint (ExtractValue Value) where
printIr (ExtractValue tv idxs) =
hsep [text "extractvalue", printIr tv <> comma, (commaSepList $ fmap integral idxs)]
instance IrPrint (InsertValue Value) where
printIr (InsertValue vect tv idx) = text "insertvalue" <+> hsep (punctuate comma ((printIr vect):(printIr tv):(fmap integral idx)))
instance IrPrint ActualParam where
printIr x = case x of
(ActualParamData t att1 align v att2) ->
hsep [printIr t, hsep $ fmap printIr att1, printIr align, printIr v, hsep $ fmap printIr att2]
(ActualParamMeta mc) -> printIr mc
instance IrPrint Dbg where
printIr (Dbg mv meta) = printIr mv <+> printIr meta
instance IrPrint PhiInst where
printIr (PhiInst lhs t pairs) = printIr lhs <+> equals <+> text "phi"
<+> printIr t <+> (commaSepList $ fmap tvToLLvm pairs)
where tvToLLvm (h1,h2) = brackets (printIr h1 <+> comma <+> printIr h2)
instance IrPrint CInst where
printIr x = case x of
(I_alloca ma t s a lhs) ->
hsep [printIr lhs, equals, text "alloca", printIr ma, printIr t, commaSepMaybe s, commaSepMaybe a]
(I_load v ptr align nonterm invar nonull lhs) ->
hsep [printIr lhs, equals, text "load", printIr v, printIr ptr
, commaSepNonEmpty [printIr align, printIr nonterm, printIr invar, printIr nonull]]
(I_loadatomic (Atomicity st ord) v ptr align lhs) ->
hsep [printIr lhs, equals, text "load atomic", printIr v, printIr ptr, printIr st, printIr ord, commaSepMaybe align]
(I_store b v addr align nonterm) ->
hsep [text "store", printIr b, printIr v <> comma, printIr addr, commaSepMaybe align, commaSepMaybe nonterm]
(I_storeatomic (Atomicity st ord) b v ptr align) ->
hsep [text "store atomic", printIr b, printIr v <> comma, printIr ptr, printIr st, printIr ord <> commaSepMaybe align]
(I_fence b order) -> hsep [text "fence", printIr b, printIr order]
(I_cmpxchg_I wk v p c n st sord ford lhs) ->
hsep [printIr lhs, equals, text "cmpxchg", printIr wk, printIr v, printIr p <> comma
, printIr c <> comma, printIr n, printIr st, printIr sord, printIr ford]
(I_cmpxchg_F wk v p c n st sord ford lhs) ->
hsep [printIr lhs, equals, text "cmpxchg", printIr wk, printIr v, printIr p <> comma
, printIr c <> comma, printIr n, printIr st, printIr sord, printIr ford]
(I_cmpxchg_P wk v p c n st sord ford lhs) ->
hsep [printIr lhs, equals, text "cmpxchg", printIr wk, printIr v, printIr p <> comma
, printIr c <> comma, printIr n, printIr st, printIr sord, printIr ford]
(I_atomicrmw v op p vl st ord lhs) ->
hsep [printIr lhs, equals, text "atomicrmw", printIr v, printIr op, printIr p <> comma, printIr vl, printIr st, printIr ord]
(I_call_fun tc cc pa cstype callee actparams fna lhs) -> hsep [optSepToLlvm lhs equals, printIr tc,
printIr (CsFun cc pa cstype callee actparams fna)]
(I_call_other tc cs lhs) -> hsep [optSepToLlvm lhs equals, printIr tc, printIr cs]
(I_extractelement_I tv idx lhs) -> hsep [printIr lhs, equals, text "extractelement_i", printIr tv, printIr idx]
(I_extractelement_F tv idx lhs) -> hsep [printIr lhs, equals, text "extractelement_f", printIr tv, printIr idx]
(I_extractelement_P tv idx lhs) -> hsep [printIr lhs, equals, text "extractelement_p", printIr tv, printIr idx]
(I_insertelement_I tv v idx lhs) -> hsep [printIr lhs, equals, text "insertelement_i", printIr tv, printIr v, printIr idx]
(I_insertelement_F tv v idx lhs) -> hsep [printIr lhs, equals, text "insertelement_f", printIr tv, printIr v, printIr idx]
(I_insertelement_P tv v idx lhs) -> hsep [printIr lhs, equals, text "insertelement_p", printIr tv, printIr v, printIr idx]
(I_shufflevector_I v1 v2 v3 lhs) -> hsep [printIr lhs, equals, text "shufflevector_i", printIr v1, printIr v2, printIr v3]
(I_shufflevector_F v1 v2 v3 lhs) -> hsep [printIr lhs, equals, text "shufflevector_f", printIr v1, printIr v2, printIr v3]
(I_shufflevector_P v1 v2 v3 lhs) -> hsep [printIr lhs, equals, text "shufflevector_p", printIr v1, printIr v2, printIr v3]
(I_extractvalue v idx lhs) -> hsep ([printIr lhs, equals, text "extractvalue", printIr v] ++ fmap integral idx)
(I_insertvalue vv v idx lhs) -> hsep ([printIr lhs, equals, text "insertvalue", printIr vv, printIr v] ++ fmap integral idx)
I_va_arg dv t lhs -> hsep [printIr lhs, equals, text "va_arg", printIr dv, printIr t]
I_va_start tv -> text "call" <+> text "void" <+> text "@llvm.va_start" <+> parens(printIr tv)
I_va_end tv -> text "call" <+> text "void" <+> text "@llvm.va_end" <+> parens(printIr tv)
I_landingpad rt pt tgl b clauses lhs ->
hsep ([printIr lhs, equals, text "landingpad", printIr rt, text "personality", printIr pt, printIr tgl, printIr b] ++ fmap printIr clauses)
I_getelementptr b base indices lhs -> hsep [printIr lhs, equals, text "getelementptr", printIr b, parens (commaSepList ((printIr base):fmap printIr indices))]
I_getelementptr_V b base indices lhs -> hsep [printIr lhs, equals, text "getelementptr_v", printIr b, parens (commaSepList ((printIr base):fmap printIr indices))]
(I_icmp op t v1 v2 lhs) -> hsep [printIr lhs, equals, text "icmp", printIr op, printIr t, printIr v1, printIr v2]
(I_icmp_V op t v1 v2 lhs) -> hsep [printIr lhs, equals, text "icmp_v", printIr op, printIr t, printIr v1, printIr v2]
(I_fcmp op t v1 v2 lhs) -> hsep [printIr lhs, equals, text "fcmp", printIr op, printIr t, printIr v1, printIr v2]
(I_fcmp_V op t v1 v2 lhs) -> hsep [printIr lhs, equals, text "fcmp_v", printIr op, printIr t, printIr v1, printIr v2]
(I_add n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "add", printIr n, printIr t, printIr v1, printIr v2]
(I_sub n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "sub", printIr n, printIr t, printIr v1, printIr v2]
(I_mul n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "mul", printIr n, printIr t, printIr v1, printIr v2]
(I_udiv n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "udiv", printIr n, printIr t, printIr v1, printIr v2]
(I_sdiv n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "sdiv", printIr n, printIr t, printIr v1, printIr v2]
(I_urem t v1 v2 lhs) -> hsep [printIr lhs, equals, text "urem", printIr t, printIr v1, printIr v2]
(I_srem t v1 v2 lhs) -> hsep [printIr lhs, equals, text "sdiv", printIr t, printIr v1, printIr v2]
(I_shl n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "shl", printIr n, printIr t, printIr v1, printIr v2]
(I_lshr n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "lshr", printIr n, printIr t, printIr v1, printIr v2]
(I_ashr n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "ashr", printIr n, printIr t, printIr v1, printIr v2]
(I_and t v1 v2 lhs) -> hsep [printIr lhs, equals, text "and", printIr t, printIr v1, printIr v2]
(I_or t v1 v2 lhs) -> hsep [printIr lhs, equals, text "or", printIr t, printIr v1, printIr v2]
(I_xor t v1 v2 lhs) -> hsep [printIr lhs, equals, text "xor", printIr t, printIr v1, printIr v2]
(I_add_V n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "add_v", printIr n, printIr t, printIr v1, printIr v2]
(I_sub_V n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "sub_v", printIr n, printIr t, printIr v1, printIr v2]
(I_mul_V n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "mul_v", printIr n, printIr t, printIr v1, printIr v2]
(I_udiv_V n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "udiv_v", printIr n, printIr t, printIr v1, printIr v2]
(I_sdiv_V n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "sdiv_v", printIr n, printIr t, printIr v1, printIr v2]
(I_urem_V t v1 v2 lhs) -> hsep [printIr lhs, equals, text "urem_v", printIr t, printIr v1, printIr v2]
(I_srem_V t v1 v2 lhs) -> hsep [printIr lhs, equals, text "sdiv_v", printIr t, printIr v1, printIr v2]
(I_shl_V n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "shl_v", printIr n, printIr t, printIr v1, printIr v2]
(I_lshr_V n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "lshr_v", printIr n, printIr t, printIr v1, printIr v2]
(I_ashr_V n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "ashr_v", printIr n, printIr t, printIr v1, printIr v2]
(I_and_V t v1 v2 lhs) -> hsep [printIr lhs, equals, text "and_v", printIr t, printIr v1, printIr v2]
(I_or_V t v1 v2 lhs) -> hsep [printIr lhs, equals, text "or_v", printIr t, printIr v1, printIr v2]
(I_xor_V t v1 v2 lhs) -> hsep [printIr lhs, equals, text "xor_v", printIr t, printIr v1, printIr v2]
(I_fadd n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "fadd", printIr n, printIr t, printIr v1, printIr v2]
(I_fsub n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "fsub", printIr n, printIr t, printIr v1, printIr v2]
(I_fmul n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "fmul", printIr n, printIr t, printIr v1, printIr v2]
(I_fdiv n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "fdiv", printIr n, printIr t, printIr v1, printIr v2]
(I_frem n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "frem", printIr n, printIr t, printIr v1, printIr v2]
(I_fadd_V n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "fadd_v", printIr n, printIr t, printIr v1, printIr v2]
(I_fsub_V n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "fsub_v", printIr n, printIr t, printIr v1, printIr v2]
(I_fmul_V n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "fmul_v", printIr n, printIr t, printIr v1, printIr v2]
(I_fdiv_V n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "fdiv_v", printIr n, printIr t, printIr v1, printIr v2]
(I_frem_V n t v1 v2 lhs) -> hsep [printIr lhs, equals, text "frem_v", printIr n, printIr t, printIr v1, printIr v2]
(I_trunc tv dt lhs) -> hsep [printIr lhs, equals, text "trunc", printIr tv, text "to", printIr dt]
(I_zext tv dt lhs) -> hsep [printIr lhs, equals, text "zext", printIr tv, text "to", printIr dt]
(I_sext tv dt lhs) -> hsep [printIr lhs, equals, text "sext", printIr tv, text "to", printIr dt]
(I_fptrunc tv dt lhs) -> hsep [printIr lhs, equals, text "fptrunc", printIr tv, text "to", printIr dt]
(I_fpext tv dt lhs) -> hsep [printIr lhs, equals, text "fpext", printIr tv, text "to", printIr dt]
(I_fptoui tv dt lhs) -> hsep [printIr lhs, equals, text "fptoui", printIr tv, text "to", printIr dt]
(I_fptosi tv dt lhs) -> hsep [printIr lhs, equals, text "fptosi", printIr tv, text "to", printIr dt]
(I_uitofp tv dt lhs) -> hsep [printIr lhs, equals, text "uitofp", printIr tv, text "to", printIr dt]
(I_sitofp tv dt lhs) -> hsep [printIr lhs, equals, text "sitofp", printIr tv, text "to", printIr dt]
(I_ptrtoint tv dt lhs) -> hsep [printIr lhs, equals, text "ptrtoint", printIr tv, text "to", printIr dt]
(I_inttoptr tv dt lhs) -> hsep [printIr lhs, equals, text "inttoptr", printIr tv, text "to", printIr dt]
(I_addrspacecast tv dt lhs) -> hsep [printIr lhs, equals, text "addrspacecast", printIr tv, text "to", printIr dt]
(I_bitcast tv dt lhs) -> hsep [printIr lhs, equals, text "bitcast", printIr tv, text "to", printIr dt]
(I_bitcast_D tv dt lhs) -> hsep [printIr lhs, equals, text "bitcast_D", printIr tv, text "to", printIr dt]
(I_trunc_V tv dt lhs) -> hsep [printIr lhs, equals, text "trunc_v", printIr tv, text "to", printIr dt]
(I_zext_V tv dt lhs) -> hsep [printIr lhs, equals, text "zext_v", printIr tv, text "to", printIr dt]
(I_sext_V tv dt lhs) -> hsep [printIr lhs, equals, text "sext_v", printIr tv, text "to", printIr dt]
(I_fptrunc_V tv dt lhs) -> hsep [printIr lhs, equals, text "fptrunc_v", printIr tv, text "to", printIr dt]
(I_fpext_V tv dt lhs) -> hsep [printIr lhs, equals, text "fpext_v", printIr tv, text "to", printIr dt]
(I_fptoui_V tv dt lhs) -> hsep [printIr lhs, equals, text "fptoui_v", printIr tv, text "to", printIr dt]
(I_fptosi_V tv dt lhs) -> hsep [printIr lhs, equals, text "fptosi_v", printIr tv, text "to", printIr dt]
(I_uitofp_V tv dt lhs) -> hsep [printIr lhs, equals, text "uitofp_v", printIr tv, text "to", printIr dt]
(I_sitofp_V tv dt lhs) -> hsep [printIr lhs, equals, text "sitofp_v", printIr tv, text "to", printIr dt]
(I_ptrtoint_V tv dt lhs) -> hsep [printIr lhs, equals, text "ptrtoint_v", printIr tv, text "to", printIr dt]
(I_inttoptr_V tv dt lhs) -> hsep [printIr lhs, equals, text "inttoptr_v", printIr tv, text "to", printIr dt]
(I_addrspacecast_V tv dt lhs) -> hsep [printIr lhs, equals, text "addrspacecast_v", printIr tv, text "to", printIr dt]
(I_select_I cnd t f lhs) -> hsep [printIr lhs, equals, text "select", printIr cnd, printIr t, printIr f]
(I_select_F cnd t f lhs) -> hsep [printIr lhs, equals, text "select", printIr cnd, printIr t, printIr f]
(I_select_P cnd t f lhs) -> hsep [printIr lhs, equals, text "select", printIr cnd, printIr t, printIr f]
(I_select_First cnd t f lhs) -> hsep [printIr lhs, equals, text "select", printIr cnd, printIr t, printIr f]
(I_select_VI cnd t f lhs) -> hsep [printIr lhs, equals, text "select", printIr cnd, printIr t, printIr f]
(I_select_VF cnd t f lhs) -> hsep [printIr lhs, equals, text "select", printIr cnd, printIr t, printIr f]
(I_select_VP cnd t f lhs) -> hsep [printIr lhs, equals, text "select", printIr cnd, printIr t, printIr f]
I_llvm_memcpy mod tv1 tv2 tv3 tv4 tv5 -> text "I_llvm_memcpy" <+> printIr mod <+> parens (hsep [printIr tv1, printIr tv2, printIr tv3, printIr tv4, printIr tv5])
I_llvm_dbg_declare aps -> text "I_llvm_dbg_declare" <> parens (hsep (fmap printIr aps))
I_llvm_dbg_value aps -> text "I_llvm_dbg_value" <> parens (hsep (fmap printIr aps))
{-
I_dbaseOf tv lhs -> hsep [printIr lhs, equals, text "dbaseOf", printIr tv]
I_dsizeOf tv lhs -> hsep [printIr lhs, equals, text "dsizeOf", printIr tv]
I_inspect_va_start_offset lhs -> hsep [printIr lhs, equals, text "inspect_va_start_offset"]
I_inspect_va_start_mbase lhs -> hsep [printIr lhs, equals, text "inspect_va_start_mbase"]
I_inspect_va_start_msize lhs -> hsep [printIr lhs, equals, text "inspect_va_start_msize"]
-}
instance IrPrint MemLen where
printIr m = case m of
MemLenI32 -> text "i32"
MemLenI64 -> text "i64"
instance IrPrint TerminatorInst where
printIr RetVoid = text "ret" <+> text "void"
printIr (Return x) = text "ret" <+> (commaSepList $ fmap printIr x)
printIr (Br a) = text "br" <+> printIr a
printIr (Cbr v t f) = text "br i1" <+> (commaSepList [printIr v, printIr t, printIr f])
printIr (IndirectBr v l) = hsep [text "indirectbr", printIr v <> comma, brackets (commaSepList $ fmap printIr l)]
printIr (Switch v d tbl) =
hsep [text "switch", printIr v <> comma, printIr d, brackets (hsep $ fmap (\(p1,p2) -> printIr p1 <> comma <+> printIr p2) tbl)]
printIr (Invoke callSite toL unwindL lhs) =
hsep [optSepToLlvm lhs equals, text "invoke", printIr callSite, text "to", printIr toL, text "unwind", printIr unwindL]
printIr (InvokeCmd callSite toL unwindL) =
hsep [text "invoke", printIr callSite, text "to", printIr toL, text "unwind", printIr unwindL]
printIr Unreachable = text "unreachable"
printIr (Resume a) = text "resume" <+> printIr a
printIr Unwind = text "unwind"
instance IrPrint PhiInstWithDbg where
printIr (PhiInstWithDbg ins dbgs) = commaSepList ((printIr ins):fmap printIr dbgs)
instance IrPrint TerminatorInstWithDbg where
printIr (TerminatorInstWithDbg ins dbgs) = commaSepList ((printIr ins):fmap printIr dbgs)
instance IrPrint CInstWithDbg where
printIr (CInstWithDbg ins dbgs) = commaSepList ((printIr ins):fmap printIr dbgs)
instance IrPrint Aliasee where
printIr (AtV tv ) = printIr tv
printIr (Ac c) = printIr c
printIr (AcV c) = printIr c
printIr (Agep a) = printIr a
printIr (AgepV a) = printIr a
instance IrPrint FunctionPrototype where
printIr (FunctionPrototype fhLinkage fhVisibility fhDllStorageClass fhCCoonc fhAttr fhRetType fhName fhParams
fhd fhAttr1 fhSection fhCmd fhAlign fhGc fhPrefix fhPrologue) =
hsep [printIr fhLinkage, printIr fhVisibility, printIr fhDllStorageClass, printIr fhCCoonc, hsep $ fmap printIr fhAttr
, printIr fhRetType, printIr fhName, printIr fhParams, printIr fhd, hsep $ fmap printIr fhAttr1
, printIr fhSection, printIr fhCmd, printIr fhAlign, printIr fhGc, printIr fhPrefix, printIr fhPrologue]
instance IrPrint MetaKind where
printIr a = case a of
Mtype t -> printIr t
Mmetadata -> text "metadata"
instance IrPrint MetaKindedConst where
printIr x = case x of
(MetaKindedConst mk mc) -> printIr mk <+> printIr mc
UnmetaKindedNull -> text "null"
instance IrPrint (Type s x) where
printIr a = case a of
TpI i -> text "i" <> integral i
TpF f -> text "f" <> integral f
TpV v -> text "v" <> integral v
TpHalf -> text "half"
TpFloat -> text "float"
TpDouble -> text "double"
TpFp128 -> text "fp128"
TpX86Fp80 -> text "x86_fp80"
TpPpcFp128 -> text "ppc_fp128"
TpX86Mmx -> text "x86_mmx"
TpLabel -> text "label"
Tvoid -> text "void"
Topaque -> text "opaque"
TpNull -> text "null"
TnameScalarI s -> char '%' <> text s
TquoteNameScalarI s -> char '%'<> (doubleQuotes $ text s)
TnoScalarI i -> char '%'<> integral i
TnameScalarF s -> char '%' <> text s
TquoteNameScalarF s -> char '%'<> (doubleQuotes $ text s)
TnoScalarF i -> char '%'<> integral i
TnameScalarP s -> char '%' <> text s
TquoteNameScalarP s -> char '%'<> (doubleQuotes $ text s)
TnoScalarP i -> char '%'<> integral i
TnameVectorI s -> char '%' <> text s
TquoteNameVectorI s -> char '%'<> (doubleQuotes $ text s)
TnoVectorI i -> char '%'<> integral i
TnameVectorF s -> char '%' <> text s
TquoteNameVectorF s -> char '%'<> (doubleQuotes $ text s)
TnoVectorF i -> char '%'<> integral i
TnameVectorP s -> char '%' <> text s
TquoteNameVectorP s -> char '%'<> (doubleQuotes $ text s)
TnoVectorP i -> char '%'<> integral i
TnameRecordD s -> char '%' <> text s
TquoteNameRecordD s -> char '%'<> (doubleQuotes $ text s)
TnoRecordD i -> char '%'<> integral i
TnameCodeFunX s -> char '%' <> text s
TquoteNameCodeFunX s -> char '%'<> (doubleQuotes $ text s)
TnoCodeFunX i -> char '%'<> integral i
Tarray i t -> brackets (integral i <+> char 'x' <+> printIr t)
TvectorI i t -> char '<' <> integral i <+> char 'x' <+> printIr t <> char '>'
TvectorF i t -> char '<' <> integral i <+> char 'x' <+> printIr t <> char '>'
TvectorP i t -> char '<' <> integral i <+> char 'x' <+> printIr t <> char '>'
Tstruct b ts -> let (start, end) = case b of
Packed -> (char '<', char '>')
Unpacked -> (empty, empty)
in start <+> braces (hsep $ punctuate comma $ fmap printIr ts) <+> end
Tpointer t addr -> printIr t <+> integral addr <+> text "*"
Tfunction t fp atts -> printIr t <+> printIr fp <+> (hsep $ punctuate comma $ fmap printIr atts)
instance IrPrint FormalParam where
printIr x = case x of
(FormalParamData t att1 align id att2) ->
(printIr t) <+> (hsep $ fmap printIr att1) <> (maybe empty ((comma <+>) . printIr) align)
<+> (printIr id) <+> (hsep $ fmap printIr att2)
(FormalParamMeta e lv) -> printIr e <+> printIr lv
instance IrPrint FormalParamList where
printIr (FormalParamList params var atts) =
parens (commaSepNonEmpty ((fmap printIr params) ++ [maybe empty printIr var])) <+> (hsep $ fmap printIr atts)
instance IrPrint TypeParamList where
printIr (TypeParamList params b) = parens (commaSepNonEmpty ((fmap printIr params) ++ [maybe empty printIr b]))
instance IrPrint Utype where
printIr x = case x of
UtypeScalarI e -> printIr e
UtypeScalarF e -> printIr e
UtypeScalarP e -> printIr e
UtypeVectorI e -> printIr e
UtypeVectorF e -> printIr e
UtypeVectorP e -> printIr e
UtypeFirstClassD e -> printIr e
UtypeRecordD e -> printIr e
UtypeOpaqueD e -> printIr e
UtypeVoidU e -> printIr e
UtypeFunX e -> printIr e
instance IrPrint Etype where
printIr x = case x of
EtypeScalarI e -> printIr e
EtypeScalarF e -> printIr e
EtypeScalarP e -> printIr e
EtypeVectorI e -> printIr e
EtypeVectorF e -> printIr e
EtypeVectorP e -> printIr e
EtypeFirstClassD e -> printIr e
EtypeRecordD e -> printIr e
EtypeOpaqueD e -> printIr e
EtypeFunX e -> printIr e
instance IrPrint Ftype where
printIr x = case x of
FtypeScalarI e -> printIr e
FtypeScalarF e -> printIr e
FtypeScalarP e -> printIr e
FtypeVectorI e -> printIr e
FtypeVectorF e -> printIr e
FtypeVectorP e -> printIr e
FtypeFirstClassD e -> printIr e
instance IrPrint Dtype where
printIr x = case x of
DtypeScalarI e -> printIr e
DtypeScalarF e -> printIr e
DtypeScalarP e -> printIr e
DtypeVectorI e -> printIr e
DtypeVectorF e -> printIr e
DtypeVectorP e -> printIr e
DtypeFirstClassD e -> printIr e
DtypeRecordD e -> printIr e
instance IrPrint Rtype where
printIr x = case x of
RtypeScalarI e -> printIr e
RtypeScalarF e -> printIr e
RtypeScalarP e -> printIr e
RtypeVectorI e -> printIr e
RtypeVectorF e -> printIr e
RtypeVectorP e -> printIr e
RtypeFirstClassD e -> printIr e
RtypeRecordD e -> printIr e
RtypeVoidU e -> printIr e
instance IrPrint ScalarType where
printIr x = case x of
ScalarTypeI e -> printIr e
ScalarTypeF e -> printIr e
ScalarTypeP e -> printIr e
instance IrPrint (IntOrPtrType ScalarB) where
printIr x = case x of
IntOrPtrTypeI e -> printIr e
IntOrPtrTypeP e -> printIr e
instance IrPrint (IntOrPtrType VectorB) where
printIr x = case x of
IntOrPtrTypeI e -> printIr e
IntOrPtrTypeP e -> printIr e
instance IrPrint Prefix where
printIr (Prefix n) = text "prefix" <+> printIr n
instance IrPrint Prologue where
printIr (Prologue n) = text "prologue" <+> printIr n
instance IrPrint IcmpOp where
printIr = P.print
instance IrPrint FcmpOp where
printIr = P.print
instance IrPrint Linkage where
printIr = P.print
instance IrPrint CallConv where
printIr = P.print
instance IrPrint Visibility where
printIr = P.print
instance IrPrint DllStorageClass where
printIr = P.print
instance IrPrint ThreadLocalStorage where
printIr = P.print
instance IrPrint ParamAttr where
printIr = P.print
instance IrPrint FunAttr where
printIr = P.print
instance IrPrint SelectionKind where
printIr = P.print
instance IrPrint AddrNaming where
printIr = P.print
instance IrPrint DqString where
printIr = P.print
instance IrPrint Section where
printIr = P.print
instance IrPrint Alignment where
printIr = P.print
instance IrPrint Gc where
printIr = P.print
instance IrPrint GlobalType where
printIr = P.print
instance IrPrint GlobalOrLocalId where
printIr = P.print
instance IrPrint LocalId where
printIr = P.print
instance IrPrint GlobalId where
printIr = P.print
instance IrPrint BinaryConstant where
printIr = P.print
instance IrPrint AtomicMemoryOrdering where
printIr = P.print
instance IrPrint AtomicOp where
printIr = P.print
instance IrPrint Integer where
printIr = integer
instance IrPrint AddrSpace where
printIr = integral
instance IrPrint Fparam where
printIr = P.print
instance IrPrint InAllocaAttr where
printIr = P.print
instance IrPrint Volatile where
printIr = P.print
instance IrPrint Weak where
printIr = P.print
instance IrPrint SingleThread where
printIr = P.print
instance IrPrint InBounds where
printIr = P.print
instance (P.Print a, IrPrint a) => IrPrint (IsOrIsNot a) where
printIr = P.print
instance IrPrint Nontemporal where
printIr = P.print
instance IrPrint InvariantLoad where
printIr = P.print
instance IrPrint Nonnull where
printIr = P.print
instance IrPrint TailCall where
printIr = P.print
instance IrPrint DollarId where
printIr = P.print
instance IrPrint Comdat where
printIr = P.print
instance IrPrint FastMathFlag where
printIr = P.print
instance IrPrint FastMathFlags where
printIr = P.print
instance IrPrint ExternallyInitialized where
printIr = P.print
instance IrPrint AsmDialect where
printIr = P.print
instance IrPrint Endianness where
printIr = P.print
instance IrPrint LayoutAddrSpace where
printIr = P.print
instance IrPrint SizeInBit where
printIr = P.print
instance IrPrint AlignInBit where
printIr = P.print
instance IrPrint StackAlign where
printIr = P.print
instance IrPrint Mangling where
printIr = P.print
instance IrPrint AbiAlign where
printIr = P.print
instance IrPrint PrefAlign where
printIr = P.print
instance IrPrint LayoutSpec where
printIr = P.print
instance IrPrint DataLayout where
printIr = P.print
instance IrPrint SideEffect where
printIr = P.print
instance IrPrint AlignStack where
printIr = P.print
instance IrPrint Cleanup where
printIr = P.print
instance IrPrint TargetTriple where
printIr = P.print
instance IrPrint DataLayoutInfo where
printIr = P.print
instance IrPrint VarArgParam where
printIr = P.print