{-# LANGUAGE GADTs #-} module Llvm.Data.Ast ( module Llvm.Data.Ast , module Llvm.Data.Shared , module Llvm.Data.Type ) where import Llvm.Data.Shared import Llvm.Data.Type import qualified Data.Map as M import Data.Word (Word32) -- | quotation does not change a label value -- | it's still unclear when a quoted verion is used -- | we keep the original format to make llvm-as happy data LabelId = LabelString String -- Lstring | LabelDqString String -- Lstring -- a string enclosed by double quotes | LabelNumber Word32 -- Int | LabelDqNumber Word32 -- Int -- a number enclosed by double quotes deriving (Eq,Ord,Show) data BlockLabel = ExplicitBlockLabel LabelId | ImplicitBlockLabel (String, Int, Int) deriving (Eq, Ord, Show) data PercentLabel = PercentLabel LabelId deriving (Eq, Ord, Show) data TargetLabel = TargetLabel PercentLabel deriving (Eq,Ord,Show) data IbinOp = Add | Sub | Mul | Udiv | Sdiv | Urem | Srem | Shl | Lshr | Ashr | And | Or | Xor deriving (Eq,Ord,Show) ibinOpMap :: M.Map IbinOp String ibinOpMap = M.fromList [(Add, "add"), (Sub, "sub"), (Mul, "mul") ,(Udiv, "udiv"), (Sdiv, "sdiv") ,(Urem, "urem"), (Srem, "srem") ,(Shl, "shl"), (Lshr, "lshr"), (Ashr, "ashr") ,(And, "and"), (Or, "or"), (Xor, "xor") ] data FbinOp = Fadd | Fsub | Fmul | Fdiv | Frem deriving (Eq,Ord,Show) fbinOpMap :: M.Map FbinOp String fbinOpMap = M.fromList [(Fadd, "fadd"), (Fsub, "fsub"), (Fmul, "fmul"), (Fdiv, "fdiv"), (Frem, "frem")] data TrapFlag = Nuw | Nsw | Exact deriving (Eq,Ord,Show) trapFlagMap :: M.Map TrapFlag String trapFlagMap = M.fromList [(Nuw, "nuw"), (Nsw, "nsw"), (Exact, "exact")] -- | Binary Operations data IbinExpr v = IbinExpr IbinOp [TrapFlag] Type v v deriving (Eq,Ord,Show) data FbinExpr v = FbinExpr FbinOp FastMathFlags Type v v deriving (Eq,Ord,Show) data BinExpr v = Ie (IbinExpr v) | Fe (FbinExpr v) deriving (Eq, Ord, Show) data GetElementPtr v = GetElementPtr (IsOrIsNot InBounds) (Pointer (Typed v)) [Typed v] deriving (Eq,Ord,Show) data Select v = Select (Typed v) (Typed v) (Typed v) deriving (Eq,Ord,Show) data Icmp v = Icmp IcmpOp Type v v deriving (Eq,Ord,Show) data Fcmp v = Fcmp FcmpOp Type v v deriving (Eq,Ord,Show) -- | Vector Operations data ExtractElement v = ExtractElement (Typed v) (Typed v) deriving (Eq,Ord,Show) data InsertElement v = InsertElement (Typed v) (Typed v) (Typed v) deriving (Eq,Ord,Show) data ShuffleVector v = ShuffleVector (Typed v) (Typed v) (Typed v) deriving (Eq,Ord,Show) -- | Aggregate Operations data ExtractValue v = ExtractValue (Typed v) [Word32] deriving (Eq,Ord,Show) data InsertValue v = InsertValue (Typed v) (Typed v) [Word32] deriving (Eq,Ord,Show) -- | Conversion Operations data Conversion v = Conversion ConvertOp (Typed v) Type deriving (Eq,Ord,Show) data ConvertOp = Trunc | Zext | Sext | FpTrunc | FpExt | FpToUi | FpToSi | UiToFp | SiToFp | PtrToInt | IntToPtr | Bitcast | AddrSpaceCast deriving (Eq,Ord,Show) convertOpMap :: M.Map ConvertOp String convertOpMap = M.fromList [(Trunc, "trunc"), (Zext, "zext"), (Sext, "sext") ,(FpTrunc, "fptrunc"), (FpExt, "fpext"), (FpToUi, "fptoui") ,(FpToSi, "fptosi"), (UiToFp, "uitofp"), (SiToFp, "sitofp") ,(PtrToInt, "ptrtoint"), (IntToPtr, "inttoptr"), (Bitcast, "bitcast") ,(AddrSpaceCast, "addrspacecast")] -- | Complex Constants data ComplexConstant = Cstruct Packing [TypedConstOrNull] | Carray [TypedConstOrNull] | Cvector [TypedConstOrNull] deriving (Eq,Ord,Show) -- | Constants data Const = C_simple SimpleConstant | C_complex ComplexConstant | C_localId LocalId | C_labelId LabelId -- | Addresses of Basic Block | C_blockAddress GlobalId PercentLabel | C_binexp (BinExpr Const) | C_conv (Conversion Const) | C_gep (GetElementPtr Const) | C_select (Select Const) | C_icmp (Icmp Const) | C_fcmp (Fcmp Const) | C_shufflevector (ShuffleVector Const) | C_extractvalue (ExtractValue Const) | C_insertvalue (InsertValue Const) | C_extractelement (ExtractElement Const) | C_insertelement (InsertElement Const) | C_null deriving (Eq,Ord,Show) data Prefix = Prefix (TypedConstOrNull) deriving (Eq, Ord, Show) data Prologue = Prologue (TypedConstOrNull) deriving (Eq, Ord, Show) data MdVar = MdVar String deriving (Eq,Ord,Show) data MdNode = MdNode String deriving (Eq,Ord,Show) data MetaConst = McStruct [MetaKindedConst] | McString DqString | McMn MdNode | McMv MdVar | McRef LocalId | McSimple Const deriving (Eq,Ord,Show) data MetaKindedConst = MetaKindedConst MetaKind MetaConst | UnmetaKindedNull deriving (Eq, Ord, Show) data GetResult = GetResult (Typed Value) String deriving (Eq, Ord, Show) data Expr = EgEp (GetElementPtr Value) | EiC (Icmp Value) | EfC (Fcmp Value) | Eb (BinExpr Value) | Ec (Conversion Value) | Es (Select Value) deriving (Eq,Ord,Show) -- | Memory Access and Addressing Operations data MemOp = Alloca (IsOrIsNot InAllocaAttr) Type (Maybe (Typed Value)) (Maybe Alignment) | Load (IsOrIsNot Volatile) (Pointer (Typed Value)) (Maybe Alignment) (Maybe Nontemporal) (Maybe InvariantLoad) (Maybe Nonnull) | LoadAtomic Atomicity (IsOrIsNot Volatile) (Pointer (Typed Value)) (Maybe Alignment) | Store (IsOrIsNot Volatile) (Typed Value) (Pointer (Typed Value)) (Maybe Alignment) (Maybe Nontemporal) | StoreAtomic Atomicity (IsOrIsNot Volatile) (Typed Value) (Pointer (Typed Value)) (Maybe Alignment) | Fence (IsOrIsNot SingleThread) AtomicMemoryOrdering | CmpXchg (IsOrIsNot Weak) (IsOrIsNot Volatile) (Pointer (Typed Value)) (Typed Value) (Typed Value) (IsOrIsNot SingleThread) AtomicMemoryOrdering AtomicMemoryOrdering | AtomicRmw (IsOrIsNot Volatile) AtomicOp (Pointer (Typed Value)) (Typed Value) (IsOrIsNot SingleThread) AtomicMemoryOrdering deriving (Eq,Ord,Show) data Pointer v = Pointer v deriving (Eq, Ord, Show) instance Functor Pointer where fmap f (Pointer x) = Pointer (f x) data FunName = FunNameGlobal GlobalOrLocalId | FunNameString String deriving (Eq,Ord,Show) data CallSite = CsFun (Maybe CallConv) [ParamAttr] Type FunName [ActualParam] [FunAttr] | CsAsm Type (Maybe SideEffect) (Maybe AlignStack) AsmDialect DqString DqString [ActualParam] [FunAttr] | CsConversion [ParamAttr] Type (Conversion Const) [ActualParam] [FunAttr] deriving (Eq,Ord,Show) data Clause = Catch (Typed Value) | Filter TypedConstOrNull | Cco (Conversion Value) deriving (Eq,Ord,Show) data TypedConstOrNull = TypedConst (Typed Const) | UntypedNull deriving (Eq, Ord, Show) data PersFn = PersFnId GlobalOrLocalId | PersFnCast (Conversion GlobalOrLocalId) | PersFnUndef | PersFnNull | PersFnConst Const deriving (Eq, Ord, Show) data Rhs = RmO MemOp | Re Expr | Call TailCall CallSite | ReE (ExtractElement Value) | RiE (InsertElement Value) | RsV (ShuffleVector Value) | ReV (ExtractValue Value) | RiV (InsertValue Value) | RvA VaArg | RlP LandingPad deriving (Eq,Ord,Show) data VaArg = VaArg (Typed Value) Type deriving (Eq, Ord, Show) data LandingPad = LandingPad Type Type PersFn (Maybe Cleanup) [Clause] deriving (Eq, Ord, Show) data Dbg = Dbg MdVar MetaConst deriving (Eq,Show) data PhiInst = PhiInst (Maybe LocalId) Type [(Value, PercentLabel)] deriving (Eq,Show) data PhiInstWithDbg = PhiInstWithDbg PhiInst [Dbg] deriving (Eq, Show) data ComputingInst = ComputingInst (Maybe LocalId) Rhs deriving (Eq,Show) data ComputingInstWithDbg = ComputingInstWithDbg ComputingInst [Dbg] | ComputingInstWithComment String deriving (Eq,Show) -- | Terminator Instructions data TerminatorInst = -- | RetVoid | Return [(Typed Value)] -- | | Br TargetLabel -- | | Cbr Value TargetLabel TargetLabel -- | | Switch (Typed Value) TargetLabel [((Typed Value), TargetLabel)] -- | | IndirectBr (Typed Value) [TargetLabel] -- | | Invoke (Maybe LocalId) CallSite TargetLabel TargetLabel -- | | Unwind -- | | Resume (Typed Value) -- | | Unreachable deriving (Eq,Show) data TerminatorInstWithDbg = TerminatorInstWithDbg TerminatorInst [Dbg] deriving (Eq,Show) data ActualParam = ActualParamData Type [ParamAttr] (Maybe Alignment) Value [ParamAttr] | ActualParamMeta MetaKindedConst deriving (Eq,Ord,Show) data Value = Val_local LocalId | Val_const Const deriving (Eq,Ord,Show) data Typed v = Typed Type v deriving (Eq, Ord, Show) data Aliasee = AtV (Typed Value) | Ac (Conversion Const) | AgEp (GetElementPtr Const) deriving (Eq,Show) data FunctionPrototype = FunctionPrototype (Maybe Linkage) (Maybe Visibility) (Maybe DllStorageClass) (Maybe CallConv) [ParamAttr] Type GlobalId FormalParamList (Maybe AddrNaming) [FunAttr] (Maybe Section) (Maybe Comdat) (Maybe Alignment) (Maybe Gc) (Maybe Prefix) (Maybe Prologue) deriving (Eq,Ord,Show) data Toplevel = ToplevelTriple TlTriple | ToplevelDataLayout TlDataLayout | ToplevelAlias TlAlias | ToplevelDbgInit TlDbgInit | ToplevelStandaloneMd TlStandaloneMd | ToplevelNamedMd TlNamedMd | ToplevelDeclare TlDeclare | ToplevelDefine TlDefine | ToplevelGlobal TlGlobal | ToplevelTypeDef TlTypeDef | ToplevelDepLibs TlDepLibs | ToplevelUnamedType TlUnamedType | ToplevelModuleAsm TlModuleAsm | ToplevelAttribute TlAttribute | ToplevelComdat TlComdat deriving (Eq,Show) data TlTriple = TlTriple TargetTriple deriving (Eq, Show) data TlDataLayout = TlDataLayout DataLayout deriving (Eq, Show) data TlAlias = TlAlias GlobalId (Maybe Visibility) (Maybe DllStorageClass) (Maybe ThreadLocalStorage) AddrNaming (Maybe Linkage) Aliasee deriving (Eq, Show) data TlDbgInit = TlDbgInit String Word32 deriving (Eq, Show) data TlStandaloneMd = TlStandaloneMd String MetaKindedConst deriving (Eq, Show) data TlNamedMd = TlNamedMd MdVar [MdNode] deriving (Eq, Show) data TlDeclare = TlDeclare FunctionPrototype deriving (Eq, Show) data TlDefine = TlDefine FunctionPrototype [Block] deriving (Eq, Show) data TlGlobal = TlGlobal (Maybe GlobalId) (Maybe Linkage) (Maybe Visibility) (Maybe DllStorageClass) (Maybe ThreadLocalStorage) AddrNaming (Maybe AddrSpace) (IsOrIsNot ExternallyInitialized) GlobalType Type (Maybe Const) (Maybe Section) (Maybe Comdat) (Maybe Alignment) deriving (Eq, Show) data TlTypeDef = TlTypeDef LocalId Type deriving (Eq, Show) data TlDepLibs = TlDepLibs [DqString] deriving (Eq, Show) data TlUnamedType = TlUnamedType Word32 Type deriving (Eq, Show) data TlModuleAsm = TlModuleAsm DqString deriving (Eq, Show) data TlAttribute = TlAttribute Word32 [FunAttr] deriving (Eq, Show) data TlComdat = TlComdat DollarId SelectionKind deriving (Eq, Show) data Block = Block BlockLabel [PhiInstWithDbg] [ComputingInstWithDbg] TerminatorInstWithDbg deriving (Eq,Show) blockLabel :: Block -> BlockLabel blockLabel (Block v _ _ _) = v data Module = Module [Toplevel] deriving (Eq,Show) dataLayoutOfModule :: Module -> DataLayoutInfo dataLayoutOfModule (Module tl) = let [ToplevelDataLayout (TlDataLayout dl)] = filter (\x -> case x of ToplevelDataLayout _ -> True _ -> False ) tl in getDataLayoutInfo dl