-- GENERATED by C->Haskell Compiler, version 0.16.5 Crystal Seed, 24 Jan 2009 (Haskell)
-- Edit the ORIGNAL .chs file instead!


{-# LINE 1 "src/Data/LLVM/Types/Attributes.chs" #-}module Data.LLVM.Types.Attributes (
  -- * Types
  ArithFlags(..),
  defaultArithFlags,
  CmpPredicate(..),
  CallingConvention(..),
  defaultCallingConvention,
  LinkageType(..),
  defaultLinkage,
  VisibilityStyle(..),
  defaultVisibility,
  ParamAttribute(..),
  FunctionAttribute(..),
  TargetTriple(..),
  Assembly(..),
  AtomicOperation(..),
  LandingPadClause(..),
  AtomicOrdering(..),
  defaultAtomicOrdering,
  SynchronizationScope(..),
  defaultSynchronizationScope
  ) where


import Control.DeepSeq
import Data.Text ( Text, unpack )

-- | Types of symbol linkage.  Note that LTLinkerPrivateWeakDefAuto is
-- only available in llvm < 3.2.
data LinkageType = LTExternal
                 | LTAvailableExternally
                 | LTLinkOnceAny
                 | LTLinkOnceODR
                 | LTWeakAny
                 | LTWeakODR
                 | LTAppending
                 | LTInternal
                 | LTPrivate
                 | LTLinkerPrivate
                 | LTLinkerPrivateWeak
                 | LTLinkerPrivateWeakDefAuto
                 | LTDLLImport
                 | LTDLLExport
                 | LTExternalWeak
                 | LTCommon
                 deriving (Enum,Eq)

{-# LINE 31 "src/Data/LLVM/Types/Attributes.chs" #-}
instance Show LinkageType where
  show LTExternal = ""
  show LTAvailableExternally = "available_externally"
  show LTLinkOnceAny = "linkonce"
  show LTLinkOnceODR = "linkonce_odr"
  show LTWeakAny = "weak"
  show LTWeakODR = "weak_odr"
  show LTAppending = "appending"
  show LTInternal = "internal"
  show LTPrivate = "private"
  show LTLinkerPrivate = "linker_private"
  show LTLinkerPrivateWeak = "linker_private_weak"
  show LTLinkerPrivateWeakDefAuto = "linker_private_weak_def_auto"
  show LTDLLImport = "dllimport"
  show LTDLLExport = "dllexport"
  show LTExternalWeak = "extern_weak"
  show LTCommon = "common"

instance NFData LinkageType
defaultLinkage :: LinkageType
defaultLinkage = LTExternal

data VisibilityStyle = VisibilityDefault
                     | VisibilityHidden
                     | VisibilityProtected
                     deriving (Enum,Eq)

{-# LINE 54 "src/Data/LLVM/Types/Attributes.chs" #-}

instance Show VisibilityStyle where
  show VisibilityDefault = ""
  show VisibilityHidden = "hidden"
  show VisibilityProtected = "protected"

instance NFData VisibilityStyle
defaultVisibility :: VisibilityStyle
defaultVisibility = VisibilityDefault

data AtomicOrdering = OrderNotAtomic
                    | OrderUnordered
                    | OrderMonotonic
                    | OrderAcquire
                    | OrderRelease
                    | OrderAcquireRelease
                    | OrderSequentiallyConsistent
                    deriving (Enum,Eq)

{-# LINE 65 "src/Data/LLVM/Types/Attributes.chs" #-}

instance Show AtomicOrdering where
  show OrderNotAtomic = ""
  show OrderUnordered = "unordered"
  show OrderMonotonic = "monotonic"
  show OrderAcquire = "acquire"
  show OrderRelease = "release"
  show OrderAcquireRelease = "acq_rel"
  show OrderSequentiallyConsistent = "seq_cst"

instance NFData AtomicOrdering
defaultAtomicOrdering :: AtomicOrdering
defaultAtomicOrdering = OrderNotAtomic

data SynchronizationScope = SSSingleThread
                          | SSCrossThread
                          deriving (Enum,Eq)

{-# LINE 80 "src/Data/LLVM/Types/Attributes.chs" #-}

instance Show SynchronizationScope where
  show SSSingleThread = "singlethread"
  show SSCrossThread = ""

instance NFData SynchronizationScope
defaultSynchronizationScope :: SynchronizationScope
defaultSynchronizationScope = SSCrossThread

data AtomicOperation = AOXchg
                     | AOAdd
                     | AOSub
                     | AOAnd
                     | AONand
                     | AOOr
                     | AOXor
                     | AOMax
                     | AOMin
                     | AOUMax
                     | AOUMin
                     deriving (Enum,Eq)

{-# LINE 90 "src/Data/LLVM/Types/Attributes.chs" #-}

instance Show AtomicOperation where
  show AOXchg = "xchg"
  show AOAdd = "add"
  show AOSub = "sub"
  show AOAnd = "and"
  show AONand = "nand"
  show AOOr = "or"
  show AOXor = "xor"
  show AOMax = "max"
  show AOMin = "min"
  show AOUMax = "umax"
  show AOUMin = "umin"

instance NFData AtomicOperation

data LandingPadClause = LPCatch
                      | LPFilter
                      deriving (Enum,Eq)

{-# LINE 107 "src/Data/LLVM/Types/Attributes.chs" #-}

instance Show LandingPadClause where
  show LPCatch = "catch"
  show LPFilter = "filter"

instance NFData LandingPadClause

data ArithFlags = ArithNone
                | ArithNUW
                | ArithNSW
                | ArithBoth
                deriving (Enum,Eq)

{-# LINE 115 "src/Data/LLVM/Types/Attributes.chs" #-}

instance Show ArithFlags where
  show ArithNone = ""
  show ArithNUW = "nuw"
  show ArithNSW = "nsw"
  show ArithBoth = "nuw nsw"

instance NFData ArithFlags
defaultArithFlags :: ArithFlags
defaultArithFlags = ArithNone

data CmpPredicate = FCmpFalse
                  | FCmpOeq
                  | FCmpOgt
                  | FCmpOge
                  | FCmpOlt
                  | FCmpOle
                  | FCmpOne
                  | FCmpOrd
                  | FCmpUno
                  | FCmpUeq
                  | FCmpUgt
                  | FCmpUge
                  | FCmpUlt
                  | FCmpUle
                  | FCmpUne
                  | FCmpTrue
                  | ICmpEq
                  | ICmpNe
                  | ICmpUgt
                  | ICmpUge
                  | ICmpUlt
                  | ICmpUle
                  | ICmpSgt
                  | ICmpSge
                  | ICmpSlt
                  | ICmpSle
                  deriving (Enum,Eq)

{-# LINE 127 "src/Data/LLVM/Types/Attributes.chs" #-}

instance Show CmpPredicate where
  show FCmpFalse = "false"
  show FCmpOeq = "oeq"
  show FCmpOgt = "ogt"
  show FCmpOge = "oge"
  show FCmpOlt = "olt"
  show FCmpOle = "ole"
  show FCmpOne = "one"
  show FCmpOrd = "ord"
  show FCmpUno = "uno"
  show FCmpUeq = "ueq"
  show FCmpUgt = "ugt"
  show FCmpUge = "uge"
  show FCmpUlt = "ult"
  show FCmpUle = "ule"
  show FCmpUne = "une"
  show FCmpTrue = "true"
  show ICmpEq = "eq"
  show ICmpNe = "ne"
  show ICmpUgt = "ugt"
  show ICmpUge = "uge"
  show ICmpUlt = "ult"
  show ICmpUle = "ule"
  show ICmpSgt = "sgt"
  show ICmpSge = "sge"
  show ICmpSlt = "slt"
  show ICmpSle = "sle"

instance NFData CmpPredicate


data CallingConvention = CC_C
                       | CC_FAST
                       | CC_COLD
                       | CC_GHC
                       | CC_X86_STDCALL
                       | CC_X86_FASTCALL
                       | CC_ARM_APCS
                       | CC_ARM_AAPCS
                       | CC_ARM_AAPCS_VFP
                       | CC_MSP430_INTR
                       | CC_X86_THISCALL
                       | CC_PTX_KERNEL
                       | CC_PTX_DEVICE
                       | CC_MBLAZE_INTR
                       | CC_MBLAZE_SVOL
                       deriving (Enum,Eq)

{-# LINE 160 "src/Data/LLVM/Types/Attributes.chs" #-}
instance Show CallingConvention where
  show CC_C = ""
  show CC_FAST = "fastcc"
  show CC_COLD = "coldcc"
  show CC_GHC = "cc 10"
  show CC_X86_STDCALL = "cc 64"
  show CC_X86_FASTCALL = "cc 65"
  show CC_ARM_APCS = "cc 66"
  show CC_ARM_AAPCS = "cc 67"
  show CC_ARM_AAPCS_VFP = "cc 68"
  show CC_MSP430_INTR = "cc 69"
  show CC_X86_THISCALL = "cc 70"
  show CC_PTX_KERNEL = "cc 71"
  show CC_PTX_DEVICE = "cc 72"
  show CC_MBLAZE_INTR = "cc 73"
  show CC_MBLAZE_SVOL = "cc 74"

instance NFData CallingConvention
defaultCallingConvention :: CallingConvention
defaultCallingConvention = CC_C

 -- Representing Assembly
data Assembly = Assembly !Text
                deriving (Eq, Ord)

instance Show Assembly where
  show (Assembly txt) = unpack txt

instance NFData Assembly where
  rnf a@(Assembly txt) = txt `seq` a `seq` ()


-- Param attributes

data ParamAttribute = PAZeroExt
                    | PASignExt
                    | PAInReg
                    | PAByVal
                    | PASRet
                    | PANoAlias
                    | PANoCapture
                    | PANest
                    | PAAlign !Int
                    deriving (Eq, Ord)

instance NFData ParamAttribute

instance Show ParamAttribute where
  show PAZeroExt = "zeroext"
  show PASignExt = "signext"
  show PAInReg = "inreg"
  show PAByVal = "byval"
  show PASRet = "sret"
  show PANoAlias = "noalias"
  show PANoCapture = "nocapture"
  show PANest = "nest"
  show (PAAlign i) = "align " ++ show i

-- Function Attributes

data FunctionAttribute = FAAlignStack !Int
                       | FAAlwaysInline
                       | FAHotPatch
                       | FAInlineHint
                       | FANaked
                       | FANoImplicitFloat
                       | FANoInline
                       | FANoRedZone
                       | FANoReturn
                       | FANoUnwind
                       | FAOptSize
                       | FAReadNone
                       | FAReadOnly
                       | FASSP
                       | FASSPReq
                       deriving (Eq, Ord)

instance NFData FunctionAttribute

instance Show FunctionAttribute where
  show (FAAlignStack n) = "alignstack(" ++ show n ++ ")"
  show FAAlwaysInline = "alwaysinline"
  show FAHotPatch = "hotpatch"
  show FAInlineHint = "inlinehint"
  show FANaked = "naked"
  show FANoImplicitFloat = "noimplicitfloat"
  show FANoInline = "noinline"
  show FANoRedZone = "noredzone"
  show FANoReturn = "noreturn"
  show FANoUnwind = "nounwind"
  show FAOptSize = "optsize"
  show FAReadNone = "readnone"
  show FAReadOnly = "readonly"
  show FASSP = "ssp"
  show FASSPReq = "sspreq"

data TargetTriple = TargetTriple Text
                    deriving (Eq)

instance Show TargetTriple where
  show (TargetTriple t) = unpack t

instance NFData TargetTriple where
  rnf t@(TargetTriple t') = t' `seq` t `seq` ()