pec-0.2.0: Language/LLVM/Abs.hs
{-# LANGUAGE DeriveDataTypeable #-}
module Language.LLVM.Abs where
import Control.DeepSeq
import Data.Generics
import Grm.Prims
import Grm.Lex
import Text.PrettyPrint.Leijen
myLexemes = ["\"","(",")","*",",",", i32 0,",", i32 0, i32 0)",", label %","...",":","::",";","=","= private constant [","[","\\00\"","]","add nuw nsw","alloca","and","bitcast","br i1","br label %","call","declare","define","double","eq","fadd","false","fcmp","fdiv","float","fmul","fpext","fptosi","fptoui","fptrunc","frem","fsub","getelementptr inbounds","getelementptr inbounds ([","i","i8","icmp","load","lshr","mul nuw nsw","ne","oge","ogt","ole","olt","or","ret","sdiv","sext","sge","sgt","shl","sitofp","sle","slt","srem","store","sub nuw nsw","switch","to","true","trunc","type","udiv","uge","ugt","uitofp","ule","ult","urem","void","x","x i8 ] c","x i8 ]*","xor","zext","{","|","}"]
grmLexFilePath = lexFilePath myLexemes
grmLexContents = lexContents myLexemes
data Module
= Module DefineList
deriving (Show,Eq,Ord,Data,Typeable)
data Define
= Define Type Lident TVarList StmtList
| Declare Type Lident TypeList
| TypeD Lident Type
| StringD Lident Number Lident
deriving (Show,Eq,Ord,Data,Typeable)
data Stmt
= LetS Lident Exp
| StoreS Atom TVar
| CallS TVar AtomList
| SwitchS Atom Lident SwitchAltList
| ReturnS Atom
| LabelS Lident
| BrS UAtom Lident Lident
| Br0S Lident
| TagS Atom
| NoOpS
deriving (Show,Eq,Ord,Data,Typeable)
data Exp
= CallE TVar AtomList
| CastE Cast TVar Type
| AllocaE Type
| LoadE TVar
| AtomE Atom
| BinOpE BinOp Type UAtom UAtom
| IdxE TVar Atom
deriving (Show,Eq,Ord,Data,Typeable)
data Cast
= Bitcast
| Sitofp
| Uitofp
| Fptosi
| Fptoui
| Trunc
| Zext
| Sext
| Fptrunc
| Fpext
deriving (Show,Eq,Ord,Data,Typeable)
data BinOp
= Icmp ICond
| Fcmp FCond
| Add
| Fadd
| Sub
| Fsub
| Mul
| Fmul
| Udiv
| Sdiv
| Fdiv
| Urem
| Srem
| Frem
| Shl
| Lshr
| And
| Or
| Xor
deriving (Show,Eq,Ord,Data,Typeable)
data Atom
= LitA TLit
| VarA TVar
deriving (Show,Eq,Ord,Data,Typeable)
data UAtom
= LitUA Lit
| VarUA Lident
deriving (Show,Eq,Ord,Data,Typeable)
data ICond
= Equ
| Neq
| Ugt
| Sgt
| Uge
| Sge
| Ult
| Slt
| Ule
| Sle
deriving (Show,Eq,Ord,Data,Typeable)
data FCond
= Ogt
| Oge
| Olt
| Ole
deriving (Show,Eq,Ord,Data,Typeable)
data SwitchAlt
= SwitchAlt TLit Lident
deriving (Show,Eq,Ord,Data,Typeable)
data Lit
= NmbrL Number
| FalseL
| TrueL
| StringL Number Lident
| VoidL
deriving (Show,Eq,Ord,Data,Typeable)
data TVar
= TVar Type Lident
deriving (Show,Eq,Ord,Data,Typeable)
data TLit
= TLit Type Lit
deriving (Show,Eq,Ord,Data,Typeable)
data FieldT
= FieldT Uident Type
deriving (Show,Eq,Ord,Data,Typeable)
data ConC
= ConC Uident Type
deriving (Show,Eq,Ord,Data,Typeable)
data Type
= PtrT Type
| IntT Number
| FloatT
| DoubleT
| VoidT
| FunT Type TypeList
| VarArgsT
| UserT Lident
| StructT TypeList
| ArrayT Number Type
| CharT
deriving (Show,Eq,Ord,Data,Typeable)
type ConCList = [ConC ]
type FieldTList = [FieldT ]
type TypeList = [Type ]
type ExpList = [Exp ]
type AtomList = [Atom ]
type TVarList = [TVar ]
type SwitchAltList = [SwitchAlt ]
type StmtList = [Stmt ]
type DefineList = [Define ]
instance Pretty (Module ) where
pretty = ppModule
ppModule x = case x of
Module v1 -> ppDefineList v1
instance Pretty (Define ) where
pretty = ppDefine
ppDefine x = case x of
Define v1 v2 v3 v4 -> text "define" <+> ppType v1 <+> ppLident v2 <+> text "(" <+> ppTVarList v3 <+> text ")" <+> text "{" <+> ppStmtList v4 <+> text "}"
Declare v1 v2 v3 -> text "declare" <+> ppType v1 <+> ppLident v2 <+> text "(" <+> ppTypeList v3 <+> text ")"
TypeD v1 v2 -> ppLident v1 <+> text "=" <+> text "type" <+> ppType v2
StringD v1 v2 v3 -> ppLident v1 <+> text "= private constant [" <+> ppNumber v2 <+> text "x i8 ] c" <> text "\"" <> ppLident v3 <> text "\\00\""
instance Pretty (Stmt ) where
pretty = ppStmt
ppStmt x = case x of
LetS v1 v2 -> ppLident v1 <+> text "=" <+> ppExp v2
StoreS v1 v2 -> text "store" <+> ppAtom v1 <> text "," <+> ppTVar v2
CallS v1 v2 -> text "call" <+> ppTVar v1 <+> text "(" <+> ppAtomList v2 <+> text ")"
SwitchS v1 v2 v3 -> text "switch" <+> ppAtom v1 <> text ", label %" <> ppLident v2 <+> text "[" <+> ppSwitchAltList v3 <+> text "]"
ReturnS v1 -> text "ret" <+> ppAtom v1
LabelS v1 -> ppLident v1 <> text ":"
BrS v1 v2 v3 -> text "br i1" <+> ppUAtom v1 <> text ", label %" <> ppLident v2 <> text ", label %" <> ppLident v3
Br0S v1 -> text "br label %" <> ppLident v1
TagS v1 -> text "store" <+> ppAtom v1 <> text ","
NoOpS -> text ";"
instance Pretty (Exp ) where
pretty = ppExp
ppExp x = case x of
CallE v1 v2 -> text "call" <+> ppTVar v1 <+> text "(" <+> ppAtomList v2 <+> text ")"
CastE v1 v2 v3 -> ppCast v1 <+> ppTVar v2 <+> text "to" <+> ppType v3
AllocaE v1 -> text "alloca" <+> ppType v1
LoadE v1 -> text "load" <+> ppTVar v1
AtomE v1 -> ppAtom v1
BinOpE v1 v2 v3 v4 -> ppBinOp v1 <+> ppType v2 <+> ppUAtom v3 <> text "," <+> ppUAtom v4
IdxE v1 v2 -> text "getelementptr inbounds" <+> ppTVar v1 <> text ", i32 0," <+> ppAtom v2
instance Pretty (Cast ) where
pretty = ppCast
ppCast x = case x of
Bitcast -> text "bitcast"
Sitofp -> text "sitofp"
Uitofp -> text "uitofp"
Fptosi -> text "fptosi"
Fptoui -> text "fptoui"
Trunc -> text "trunc"
Zext -> text "zext"
Sext -> text "sext"
Fptrunc -> text "fptrunc"
Fpext -> text "fpext"
instance Pretty (BinOp ) where
pretty = ppBinOp
ppBinOp x = case x of
Icmp v1 -> text "icmp" <+> ppICond v1
Fcmp v1 -> text "fcmp" <+> ppFCond v1
Add -> text "add nuw nsw"
Fadd -> text "fadd"
Sub -> text "sub nuw nsw"
Fsub -> text "fsub"
Mul -> text "mul nuw nsw"
Fmul -> text "fmul"
Udiv -> text "udiv"
Sdiv -> text "sdiv"
Fdiv -> text "fdiv"
Urem -> text "urem"
Srem -> text "srem"
Frem -> text "frem"
Shl -> text "shl"
Lshr -> text "lshr"
And -> text "and"
Or -> text "or"
Xor -> text "xor"
instance Pretty (Atom ) where
pretty = ppAtom
ppAtom x = case x of
LitA v1 -> ppTLit v1
VarA v1 -> ppTVar v1
instance Pretty (UAtom ) where
pretty = ppUAtom
ppUAtom x = case x of
LitUA v1 -> ppLit v1
VarUA v1 -> ppLident v1
instance Pretty (ICond ) where
pretty = ppICond
ppICond x = case x of
Equ -> text "eq"
Neq -> text "ne"
Ugt -> text "ugt"
Sgt -> text "sgt"
Uge -> text "uge"
Sge -> text "sge"
Ult -> text "ult"
Slt -> text "slt"
Ule -> text "ule"
Sle -> text "sle"
instance Pretty (FCond ) where
pretty = ppFCond
ppFCond x = case x of
Ogt -> text "ogt"
Oge -> text "oge"
Olt -> text "olt"
Ole -> text "ole"
instance Pretty (SwitchAlt ) where
pretty = ppSwitchAlt
ppSwitchAlt x = case x of
SwitchAlt v1 v2 -> ppTLit v1 <> text ", label %" <> ppLident v2
instance Pretty (Lit ) where
pretty = ppLit
ppLit x = case x of
NmbrL v1 -> ppNumber v1
FalseL -> text "false"
TrueL -> text "true"
StringL v1 v2 -> text "getelementptr inbounds ([" <+> ppNumber v1 <+> text "x i8 ]*" <+> ppLident v2 <> text ", i32 0, i32 0)"
VoidL -> Text.PrettyPrint.Leijen.empty
instance Pretty (TVar ) where
pretty = ppTVar
ppTVar x = case x of
TVar v1 v2 -> ppType v1 <+> ppLident v2
instance Pretty (TLit ) where
pretty = ppTLit
ppTLit x = case x of
TLit v1 v2 -> ppType v1 <+> ppLit v2
instance Pretty (FieldT ) where
pretty = ppFieldT
ppFieldT x = case x of
FieldT v1 v2 -> ppUident v1 <+> text "::" <+> ppType v2
instance Pretty (ConC ) where
pretty = ppConC
ppConC x = case x of
ConC v1 v2 -> ppUident v1 <+> ppType v2
instance Pretty (Type ) where
pretty = ppType
ppType x = case x of
PtrT v1 -> ppType v1 <> text "*"
IntT v1 -> text "i" <> ppNumber v1
FloatT -> text "float"
DoubleT -> text "double"
VoidT -> text "void"
FunT v1 v2 -> ppType v1 <+> text "(" <+> ppTypeList v2 <+> text ")"
VarArgsT -> text "..."
UserT v1 -> ppLident v1
StructT v1 -> text "{" <+> ppTypeList v1 <+> text "}"
ArrayT v1 v2 -> text "[" <+> ppNumber v1 <+> text "x" <+> ppType v2 <+> text "]"
CharT -> text "i8"
ppConCList = ppList ppConC Separator "|" Horiz
ppFieldTList = ppList ppFieldT Separator "," Horiz
ppTypeList = ppList ppType Separator "," Horiz
ppExpList = ppList ppExp Separator "," Horiz
ppAtomList = ppList ppAtom Separator "," Horiz
ppTVarList = ppList ppTVar Separator "," Horiz
ppSwitchAltList = ppList ppSwitchAlt Terminator "" Vert
ppStmtList = ppList ppStmt Terminator "" Vert
ppDefineList = ppList ppDefine Terminator "" Vert