-----------------------------------------------------------------------
-- |
-- Module           : Lang.Crucible.LLVM.Extension
-- Description      : LLVM interface for Crucible
-- Copyright        : (c) Galois, Inc 2015-2016
-- License          : BSD3
-- Maintainer       : rdockins@galois.com
-- Stability        : provisional
--
-- Syntax extension definitions for LLVM
------------------------------------------------------------------------

{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE EmptyDataDeriving #-}
{-# LANGUAGE TypeFamilies #-}

module Lang.Crucible.LLVM.Extension
  ( module Lang.Crucible.LLVM.Extension.Arch
  , module Lang.Crucible.LLVM.Extension.Syntax
  , LLVM
  ) where

import Data.Data (Data)
import Data.Typeable (Typeable)
import GHC.Generics ( Generic )

import Lang.Crucible.CFG.Extension

import Lang.Crucible.LLVM.Extension.Arch
import Lang.Crucible.LLVM.Extension.Syntax

-- | The Crucible extension type marker for LLVM.
data LLVM
  deriving (Typeable LLVM
Typeable LLVM =>
(forall (c :: Type -> Type).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> LLVM -> c LLVM)
-> (forall (c :: Type -> Type).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c LLVM)
-> (LLVM -> Constr)
-> (LLVM -> DataType)
-> (forall (t :: Type -> Type) (c :: Type -> Type).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c LLVM))
-> (forall (t :: Type -> Type -> Type) (c :: Type -> Type).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c LLVM))
-> ((forall b. Data b => b -> b) -> LLVM -> LLVM)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> LLVM -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> LLVM -> r)
-> (forall u. (forall d. Data d => d -> u) -> LLVM -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> LLVM -> u)
-> (forall (m :: Type -> Type).
    Monad m =>
    (forall d. Data d => d -> m d) -> LLVM -> m LLVM)
-> (forall (m :: Type -> Type).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> LLVM -> m LLVM)
-> (forall (m :: Type -> Type).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> LLVM -> m LLVM)
-> Data LLVM
LLVM -> Constr
LLVM -> DataType
(forall b. Data b => b -> b) -> LLVM -> LLVM
forall a.
Typeable a =>
(forall (c :: Type -> Type).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: Type -> Type).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: Type -> Type) (c :: Type -> Type).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: Type -> Type -> Type) (c :: Type -> Type).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: Type -> Type).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: Type -> Type).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: Type -> Type).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> LLVM -> u
forall u. (forall d. Data d => d -> u) -> LLVM -> [u]
forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> LLVM -> r
forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> LLVM -> r
forall (m :: Type -> Type).
Monad m =>
(forall d. Data d => d -> m d) -> LLVM -> m LLVM
forall (m :: Type -> Type).
MonadPlus m =>
(forall d. Data d => d -> m d) -> LLVM -> m LLVM
forall (c :: Type -> Type).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c LLVM
forall (c :: Type -> Type).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> LLVM -> c LLVM
forall (t :: Type -> Type) (c :: Type -> Type).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c LLVM)
forall (t :: Type -> Type -> Type) (c :: Type -> Type).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c LLVM)
$cgfoldl :: forall (c :: Type -> Type).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> LLVM -> c LLVM
gfoldl :: forall (c :: Type -> Type).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> LLVM -> c LLVM
$cgunfold :: forall (c :: Type -> Type).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c LLVM
gunfold :: forall (c :: Type -> Type).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c LLVM
$ctoConstr :: LLVM -> Constr
toConstr :: LLVM -> Constr
$cdataTypeOf :: LLVM -> DataType
dataTypeOf :: LLVM -> DataType
$cdataCast1 :: forall (t :: Type -> Type) (c :: Type -> Type).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c LLVM)
dataCast1 :: forall (t :: Type -> Type) (c :: Type -> Type).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c LLVM)
$cdataCast2 :: forall (t :: Type -> Type -> Type) (c :: Type -> Type).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c LLVM)
dataCast2 :: forall (t :: Type -> Type -> Type) (c :: Type -> Type).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c LLVM)
$cgmapT :: (forall b. Data b => b -> b) -> LLVM -> LLVM
gmapT :: (forall b. Data b => b -> b) -> LLVM -> LLVM
$cgmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> LLVM -> r
gmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> LLVM -> r
$cgmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> LLVM -> r
gmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> LLVM -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> LLVM -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> LLVM -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> LLVM -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> LLVM -> u
$cgmapM :: forall (m :: Type -> Type).
Monad m =>
(forall d. Data d => d -> m d) -> LLVM -> m LLVM
gmapM :: forall (m :: Type -> Type).
Monad m =>
(forall d. Data d => d -> m d) -> LLVM -> m LLVM
$cgmapMp :: forall (m :: Type -> Type).
MonadPlus m =>
(forall d. Data d => d -> m d) -> LLVM -> m LLVM
gmapMp :: forall (m :: Type -> Type).
MonadPlus m =>
(forall d. Data d => d -> m d) -> LLVM -> m LLVM
$cgmapMo :: forall (m :: Type -> Type).
MonadPlus m =>
(forall d. Data d => d -> m d) -> LLVM -> m LLVM
gmapMo :: forall (m :: Type -> Type).
MonadPlus m =>
(forall d. Data d => d -> m d) -> LLVM -> m LLVM
Data, LLVM -> LLVM -> Bool
(LLVM -> LLVM -> Bool) -> (LLVM -> LLVM -> Bool) -> Eq LLVM
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: LLVM -> LLVM -> Bool
== :: LLVM -> LLVM -> Bool
$c/= :: LLVM -> LLVM -> Bool
/= :: LLVM -> LLVM -> Bool
Eq, (forall x. LLVM -> Rep LLVM x)
-> (forall x. Rep LLVM x -> LLVM) -> Generic LLVM
forall x. Rep LLVM x -> LLVM
forall x. LLVM -> Rep LLVM x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. LLVM -> Rep LLVM x
from :: forall x. LLVM -> Rep LLVM x
$cto :: forall x. Rep LLVM x -> LLVM
to :: forall x. Rep LLVM x -> LLVM
Generic , Eq LLVM
Eq LLVM =>
(LLVM -> LLVM -> Ordering)
-> (LLVM -> LLVM -> Bool)
-> (LLVM -> LLVM -> Bool)
-> (LLVM -> LLVM -> Bool)
-> (LLVM -> LLVM -> Bool)
-> (LLVM -> LLVM -> LLVM)
-> (LLVM -> LLVM -> LLVM)
-> Ord LLVM
LLVM -> LLVM -> Bool
LLVM -> LLVM -> Ordering
LLVM -> LLVM -> LLVM
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: LLVM -> LLVM -> Ordering
compare :: LLVM -> LLVM -> Ordering
$c< :: LLVM -> LLVM -> Bool
< :: LLVM -> LLVM -> Bool
$c<= :: LLVM -> LLVM -> Bool
<= :: LLVM -> LLVM -> Bool
$c> :: LLVM -> LLVM -> Bool
> :: LLVM -> LLVM -> Bool
$c>= :: LLVM -> LLVM -> Bool
>= :: LLVM -> LLVM -> Bool
$cmax :: LLVM -> LLVM -> LLVM
max :: LLVM -> LLVM -> LLVM
$cmin :: LLVM -> LLVM -> LLVM
min :: LLVM -> LLVM -> LLVM
Ord, Typeable)

-- -----------------------------------------------------------------------
-- ** Syntax

type instance ExprExtension LLVM = LLVMExtensionExpr
type instance StmtExtension LLVM = LLVMStmt

instance IsSyntaxExtension LLVM