packages feed

pec-0.2.0: LLVM.grm

data Module
  | Module DefineList

data Define
  | Define "define" Type lident "(" TVarList ")" "{" StmtList "}"
  | Declare "declare" Type lident "(" TypeList ")"
  | TypeD lident "=" "type" Type
  | StringD lident "= private constant [" number "x i8 ] c" "" "\"" "" lident "" "\\00\""

data Stmt
  | LetS lident "=" Exp
  | StoreS "store" Atom "" "," TVar
  | CallS "call" TVar "(" AtomList ")"
  | SwitchS "switch" Atom "" ", label %" "" lident "[" SwitchAltList "]"
  | ReturnS "ret" Atom
  | LabelS lident "" ":"
  | BrS "br i1" UAtom "" ", label %" "" lident "" ", label %" "" lident
  | Br0S "br label %" "" lident
  | TagS "store" Atom "" "," 
  | NoOpS ";"

data Exp
  | CallE "call" TVar "(" AtomList ")"
  | CastE Cast TVar "to" Type
  | AllocaE "alloca" Type
  | LoadE "load" TVar
  | AtomE Atom
  | BinOpE BinOp Type UAtom "" "," UAtom
  | IdxE "getelementptr inbounds" TVar "" ", i32 0," Atom

data Cast
  | Bitcast "bitcast"
  | Sitofp "sitofp"
  | Uitofp "uitofp"
  | Fptosi "fptosi"
  | Fptoui "fptoui"
  | Trunc "trunc"
  | Zext "zext"
  | Sext "sext"
  | Fptrunc "fptrunc"
  | Fpext "fpext"

data BinOp
  | Icmp "icmp" ICond
  | Fcmp "fcmp" FCond
  | Add "add nuw nsw"
  | Fadd "fadd"
  | Sub "sub nuw nsw"
  | Fsub "fsub"
  | Mul "mul nuw nsw"
  | Fmul "fmul"
  | Udiv "udiv"
  | Sdiv "sdiv"
  | Fdiv "fdiv"
  | Urem "urem"
  | Srem "srem"
  | Frem "frem"
  | Shl "shl"
  | Lshr "lshr"
  -- | Ashr "ashr"
  | And "and"
  | Or "or"
  | Xor "xor"

data Atom
  | LitA TLit
  | VarA TVar

data UAtom
  | LitUA Lit
  | VarUA lident

data ICond
  | Equ "eq"
  | Neq "ne"
  | Ugt "ugt"
  | Sgt "sgt"
  | Uge "uge"
  | Sge "sge"
  | Ult "ult"
  | Slt "slt"
  | Ule "ule"
  | Sle "sle"

data FCond
  | Ogt "ogt"
  | Oge "oge"
  | Olt "olt"
  | Ole "ole"
  -- | Oeq "oeq"
  -- | One "one"

data SwitchAlt | SwitchAlt TLit "" ", label %" "" lident

data Lit
  | NmbrL number
  | FalseL "false"
  | TrueL "true"
  | StringL "getelementptr inbounds ([" number "x i8 ]*" lident "" ", i32 0, i32 0)"
  | VoidL

data TVar | TVar Type lident

data TLit | TLit Type Lit

data FieldT | FieldT uident "::" Type

data ConC | ConC uident Type

data Type
  | PtrT Type "" "*"
  | IntT "i" "" number
  | FloatT "float"
  | DoubleT "double"
  | VoidT "void"
  | FunT Type "(" TypeList ")"
  | VarArgsT "..."
  | UserT lident
  | StructT "{" TypeList "}"
  | ArrayT "[" number "x" Type "]"
  | CharT "i8"

list ConCList ConC nonempty separator "|" horiz
list FieldTList FieldT nonempty separator "," horiz
list TypeList Type empty separator "," horiz
list ExpList Exp nonempty separator "," horiz
list AtomList Atom nonempty separator "," horiz
list TVarList TVar nonempty separator "," horiz
list SwitchAltList SwitchAlt empty terminator "" vert
list StmtList Stmt empty terminator "" vert
list DefineList Define empty terminator "" vert