| Copyright | (c) Galois Inc 2015-2016 |
|---|---|
| License | BSD3 |
| Maintainer | Rob Dockins <rdockins@galois.com> |
| Stability | provisional |
| Safe Haskell | None |
| Language | Haskell2010 |
Lang.Crucible.LLVM.Intrinsics
Description
Synopsis
- data LLVM
- llvmIntrinsicTypes :: IsSymInterface sym => IntrinsicTypes sym
- data LLVMOverride p sym ext (args :: Ctx CrucibleType) (ret :: CrucibleType) = LLVMOverride {
- llvmOverride_declare :: Declare
- llvmOverride_args :: CtxRepr args
- llvmOverride_ret :: TypeRepr ret
- llvmOverride_def :: IsSymInterface sym => GlobalVar Mem -> Assignment (RegEntry sym) args -> forall rtp (args' :: Ctx CrucibleType) (ret' :: CrucibleType). OverrideSim p sym ext rtp args' ret' (RegValue sym ret)
- register_llvm_overrides :: forall sym (wptr :: Natural) (arch :: LLVMArch) p rtp (l :: Ctx CrucibleType) (a :: CrucibleType). (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr, wptr ~ ArchWidth arch, ?intrinsicsOpts :: IntrinsicsOptions, ?memOpts :: MemOptions) => Module -> [OverrideTemplate p sym LLVM arch] -> [OverrideTemplate p sym LLVM arch] -> LLVMContext arch -> OverrideSim p sym LLVM rtp l a ([SomeLLVMOverride p sym LLVM], [SomeLLVMOverride p sym LLVM])
- register_llvm_overrides_ :: forall sym (arch :: LLVMArch) p ext rtp (l :: Ctx CrucibleType) (a :: CrucibleType). (IsSymInterface sym, HasLLVMAnn sym) => LLVMContext arch -> [OverrideTemplate p sym ext arch] -> [Declare] -> OverrideSim p sym ext rtp l a [SomeLLVMOverride p sym ext]
- llvmDeclToFunHandleRepr :: forall (wptr :: Natural) a. HasPtrWidth wptr => FunDecl -> (forall (args :: Ctx CrucibleType) (ret :: CrucibleType). CtxRepr args -> TypeRepr ret -> a) -> a
- declare_overrides :: forall sym (wptr :: Natural) (arch :: LLVMArch) p. (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr, wptr ~ ArchWidth arch, ?lc :: TypeContext, ?intrinsicsOpts :: IntrinsicsOptions, ?memOpts :: MemOptions) => [OverrideTemplate p sym LLVM arch]
- data LLVMOverride p sym ext (args :: Ctx CrucibleType) (ret :: CrucibleType) = LLVMOverride {
- llvmOverride_declare :: Declare
- llvmOverride_args :: CtxRepr args
- llvmOverride_ret :: TypeRepr ret
- llvmOverride_def :: IsSymInterface sym => GlobalVar Mem -> Assignment (RegEntry sym) args -> forall rtp (args' :: Ctx CrucibleType) (ret' :: CrucibleType). OverrideSim p sym ext rtp args' ret' (RegValue sym ret)
- data SomeLLVMOverride p sym ext = SomeLLVMOverride (LLVMOverride p sym ext args ret)
- newtype MakeOverride p sym ext (arch :: LLVMArch) = MakeOverride {
- runMakeOverride :: Declare -> Maybe DecodedName -> LLVMContext arch -> Maybe (SomeLLVMOverride p sym ext)
- llvmSizeT :: forall (wptr :: Natural). HasPtrWidth wptr => Type
- llvmSSizeT :: forall (wptr :: Natural). HasPtrWidth wptr => Type
- data OverrideTemplate p sym ext (arch :: LLVMArch) = OverrideTemplate {
- overrideTemplateMatcher :: TemplateMatcher
- overrideTemplateAction :: MakeOverride p sym ext arch
- callStackFromMemVar' :: forall p sym ext r (args :: Ctx CrucibleType) (ret :: CrucibleType). GlobalVar Mem -> OverrideSim p sym ext r args ret CallStack
- basic_llvm_override :: forall p (args :: Ctx CrucibleType) (ret :: CrucibleType) sym ext (arch :: LLVMArch) (wptr :: Natural). (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr) => LLVMOverride p sym ext args ret -> OverrideTemplate p sym ext arch
- polymorphic1_llvm_override :: forall p sym ext (arch :: LLVMArch) (wptr :: Natural). (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr) => String -> (forall (w :: Natural). 1 <= w => NatRepr w -> SomeLLVMOverride p sym ext) -> OverrideTemplate p sym ext arch
- polymorphic1_vec_llvm_override :: forall p sym ext (arch :: LLVMArch) (wptr :: Natural). (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr) => String -> (forall (vecSz :: Nat) (intSz :: Natural). 1 <= intSz => NatRepr vecSz -> NatRepr intSz -> SomeLLVMOverride p sym ext) -> OverrideTemplate p sym ext arch
- build_llvm_override :: forall sym (args :: Ctx CrucibleType) (ret :: CrucibleType) (args' :: Ctx CrucibleType) (ret' :: CrucibleType) p ext rtp (l :: Ctx CrucibleType) (a :: CrucibleType). HasLLVMAnn sym => FunctionName -> CtxRepr args -> TypeRepr ret -> CtxRepr args' -> TypeRepr ret' -> (forall rtp' (l' :: Ctx CrucibleType) (a' :: CrucibleType). IsSymInterface sym => Assignment (RegEntry sym) args -> OverrideSim p sym ext rtp' l' a' (RegValue sym ret)) -> OverrideSim p sym ext rtp l a (Override p sym ext args' ret')
- register_llvm_override :: forall p (args :: Ctx CrucibleType) (ret :: CrucibleType) sym ext (arch :: LLVMArch) (wptr :: Natural) rtp (l :: Ctx CrucibleType) (a :: CrucibleType). (IsSymInterface sym, HasPtrWidth wptr, HasLLVMAnn sym) => LLVMOverride p sym ext args ret -> Declare -> LLVMContext arch -> OverrideSim p sym ext rtp l a ()
- register_1arg_polymorphic_override :: forall p sym ext (arch :: LLVMArch) (wptr :: Natural). (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr) => String -> (forall (w :: Natural). 1 <= w => NatRepr w -> SomeLLVMOverride p sym ext) -> MakeOverride p sym ext arch
- register_1arg_vec_polymorphic_override :: forall p sym ext (arch :: LLVMArch) (wptr :: Natural). (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr) => String -> (forall (vecSz :: Nat) (intSz :: Natural). 1 <= intSz => NatRepr vecSz -> NatRepr intSz -> SomeLLVMOverride p sym ext) -> MakeOverride p sym ext arch
- do_register_llvm_override :: forall p (args :: Ctx CrucibleType) (ret :: CrucibleType) sym ext (arch :: LLVMArch) (wptr :: Natural) (l :: Ctx CrucibleType) (a :: CrucibleType) rtp. (IsSymInterface sym, HasPtrWidth wptr, HasLLVMAnn sym) => LLVMContext arch -> LLVMOverride p sym ext args ret -> OverrideSim p sym ext rtp l a ()
- alloc_and_register_override :: forall sym bak (wptr :: Natural) (arch :: LLVMArch) p (args :: Ctx CrucibleType) (ret :: CrucibleType) rtp (l :: Ctx CrucibleType) (a :: CrucibleType). (IsSymBackend sym bak, HasPtrWidth wptr, HasLLVMAnn sym, ?memOpts :: MemOptions) => bak -> LLVMContext arch -> LLVMOverride p sym LLVM args ret -> [Symbol] -> OverrideSim p sym LLVM rtp l a ()
- newtype IntrinsicsOptions = IntrinsicsOptions {}
- data AbnormalExitBehavior
- defaultIntrinsicsOptions :: IntrinsicsOptions
- matches :: String -> TemplateMatcher -> Bool
- data TemplateMatcher
- stripDarwinAliases :: String -> String
Documentation
The Crucible extension type marker for LLVM.
Instances
| Data LLVM Source # | |
Defined in Lang.Crucible.LLVM.Extension Methods gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> LLVM -> c LLVM # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c LLVM # dataTypeOf :: LLVM -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c LLVM) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c LLVM) # gmapT :: (forall b. Data b => b -> b) -> LLVM -> LLVM # gmapQl :: (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 # gmapQ :: (forall d. Data d => d -> u) -> LLVM -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> LLVM -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> LLVM -> m LLVM # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> LLVM -> m LLVM # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> LLVM -> m LLVM # | |
| Generic LLVM Source # | |
Defined in Lang.Crucible.LLVM.Extension | |
| IsSyntaxExtension LLVM Source # | |
Defined in Lang.Crucible.LLVM.Extension | |
| Eq LLVM Source # | |
| Ord LLVM Source # | |
| type Rep LLVM Source # | |
| type ExprExtension LLVM Source # | |
Defined in Lang.Crucible.LLVM.Extension | |
| type StmtExtension LLVM Source # | |
Defined in Lang.Crucible.LLVM.Extension | |
llvmIntrinsicTypes :: IsSymInterface sym => IntrinsicTypes sym Source #
data LLVMOverride p sym ext (args :: Ctx CrucibleType) (ret :: CrucibleType) Source #
This type represents an implementation of an LLVM intrinsic function in Crucible.
This is parameterized over ext so that LLVMOverrides can more easily be
reused in the context of other language extensions that are also based on the
LLVM memory model, such as Macaw.
Constructors
| LLVMOverride | |
Fields
| |
register_llvm_overrides Source #
Arguments
| :: forall sym (wptr :: Natural) (arch :: LLVMArch) p rtp (l :: Ctx CrucibleType) (a :: CrucibleType). (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr, wptr ~ ArchWidth arch, ?intrinsicsOpts :: IntrinsicsOptions, ?memOpts :: MemOptions) | |
| => Module | |
| -> [OverrideTemplate p sym LLVM arch] | Additional "define" overrides |
| -> [OverrideTemplate p sym LLVM arch] | Additional "declare" overrides |
| -> LLVMContext arch | |
| -> OverrideSim p sym LLVM rtp l a ([SomeLLVMOverride p sym LLVM], [SomeLLVMOverride p sym LLVM]) | Applied ( |
Match two sets of OverrideTemplates against the declares and defines
in a Module, registering all the overrides that apply and returning them
as a list.
register_llvm_overrides_ Source #
Arguments
| :: forall sym (arch :: LLVMArch) p ext rtp (l :: Ctx CrucibleType) (a :: CrucibleType). (IsSymInterface sym, HasLLVMAnn sym) | |
| => LLVMContext arch | |
| -> [OverrideTemplate p sym ext arch] | Overrides to attempt to match against these declarations |
| -> [Declare] | Declarations of the functions that might get overridden |
| -> OverrideSim p sym ext rtp l a [SomeLLVMOverride p sym ext] |
Match a set of OverrideTemplates against a set of Declares,
registering all the overrides that apply and returning them as a list.
llvmDeclToFunHandleRepr :: forall (wptr :: Natural) a. HasPtrWidth wptr => FunDecl -> (forall (args :: Ctx CrucibleType) (ret :: CrucibleType). CtxRepr args -> TypeRepr ret -> a) -> a Source #
Compute the function Crucible function signature that corresponds to the given LLVM function declaration.
declare_overrides :: forall sym (wptr :: Natural) (arch :: LLVMArch) p. (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr, wptr ~ ArchWidth arch, ?lc :: TypeContext, ?intrinsicsOpts :: IntrinsicsOptions, ?memOpts :: MemOptions) => [OverrideTemplate p sym LLVM arch] Source #
Register overrides for declared-but-not-defined functions
data LLVMOverride p sym ext (args :: Ctx CrucibleType) (ret :: CrucibleType) Source #
This type represents an implementation of an LLVM intrinsic function in Crucible.
This is parameterized over ext so that LLVMOverrides can more easily be
reused in the context of other language extensions that are also based on the
LLVM memory model, such as Macaw.
Constructors
| LLVMOverride | |
Fields
| |
data SomeLLVMOverride p sym ext Source #
Constructors
| SomeLLVMOverride (LLVMOverride p sym ext args ret) |
newtype MakeOverride p sym ext (arch :: LLVMArch) Source #
A funcion that inspects an LLVM declaration (along with some other data), and constructs an override for the declaration if it can.
Constructors
| MakeOverride | |
Fields
| |
llvmSizeT :: forall (wptr :: Natural). HasPtrWidth wptr => Type Source #
Convenient LLVM representation of the size_t type.
llvmSSizeT :: forall (wptr :: Natural). HasPtrWidth wptr => Type Source #
Convenient LLVM representation of the ssize_t type.
data OverrideTemplate p sym ext (arch :: LLVMArch) Source #
Checking if an override applies to a given declaration happens in two "phases", corresponding to the fields of this struct.
Constructors
| OverrideTemplate | |
Fields
| |
callStackFromMemVar' :: forall p sym ext r (args :: Ctx CrucibleType) (ret :: CrucibleType). GlobalVar Mem -> OverrideSim p sym ext r args ret CallStack Source #
basic_llvm_override :: forall p (args :: Ctx CrucibleType) (ret :: CrucibleType) sym ext (arch :: LLVMArch) (wptr :: Natural). (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr) => LLVMOverride p sym ext args ret -> OverrideTemplate p sym ext arch Source #
polymorphic1_llvm_override :: forall p sym ext (arch :: LLVMArch) (wptr :: Natural). (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr) => String -> (forall (w :: Natural). 1 <= w => NatRepr w -> SomeLLVMOverride p sym ext) -> OverrideTemplate p sym ext arch Source #
polymorphic1_vec_llvm_override :: forall p sym ext (arch :: LLVMArch) (wptr :: Natural). (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr) => String -> (forall (vecSz :: Nat) (intSz :: Natural). 1 <= intSz => NatRepr vecSz -> NatRepr intSz -> SomeLLVMOverride p sym ext) -> OverrideTemplate p sym ext arch Source #
Create an OverrideTemplate for a polymorphic LLVM override involving
a vector type. For example, the llvm.vector.reduce.add.* intrinsic can be
instantiated at multiple types, including:
Note that the intrinsic can vary both by the size of the vector type (4,
2, etc.) and the size of the integer type used as the vector element type
(i32, i64, etc.) Therefore, the fn argument that this function accepts
is parameterized by both the vector size (vecSz) and the integer size
(intSz).
build_llvm_override :: forall sym (args :: Ctx CrucibleType) (ret :: CrucibleType) (args' :: Ctx CrucibleType) (ret' :: CrucibleType) p ext rtp (l :: Ctx CrucibleType) (a :: CrucibleType). HasLLVMAnn sym => FunctionName -> CtxRepr args -> TypeRepr ret -> CtxRepr args' -> TypeRepr ret' -> (forall rtp' (l' :: Ctx CrucibleType) (a' :: CrucibleType). IsSymInterface sym => Assignment (RegEntry sym) args -> OverrideSim p sym ext rtp' l' a' (RegValue sym ret)) -> OverrideSim p sym ext rtp l a (Override p sym ext args' ret') Source #
Do some pipe-fitting to match a Crucible override function into the shape
expected by the LLVM calling convention. This basically just coerces
between values of BVType w and values of LLVMPointerType w.
register_llvm_override :: forall p (args :: Ctx CrucibleType) (ret :: CrucibleType) sym ext (arch :: LLVMArch) (wptr :: Natural) rtp (l :: Ctx CrucibleType) (a :: CrucibleType). (IsSymInterface sym, HasPtrWidth wptr, HasLLVMAnn sym) => LLVMOverride p sym ext args ret -> Declare -> LLVMContext arch -> OverrideSim p sym ext rtp l a () Source #
register_1arg_polymorphic_override :: forall p sym ext (arch :: LLVMArch) (wptr :: Natural). (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr) => String -> (forall (w :: Natural). 1 <= w => NatRepr w -> SomeLLVMOverride p sym ext) -> MakeOverride p sym ext arch Source #
register_1arg_vec_polymorphic_override :: forall p sym ext (arch :: LLVMArch) (wptr :: Natural). (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr) => String -> (forall (vecSz :: Nat) (intSz :: Natural). 1 <= intSz => NatRepr vecSz -> NatRepr intSz -> SomeLLVMOverride p sym ext) -> MakeOverride p sym ext arch Source #
Register a polymorphic LLVM override involving a vector type. (See the
Haddocks for polymorphic1_vec_llvm_override for details on what this
means.) This function is responsible for parsing the suffix in the
intrinsic's name, which encodes the sizes of the vector and integer types.
As some examples:
.v4i32(vector size4, integer size32).v2i64(vector size2, integer size64)
do_register_llvm_override :: forall p (args :: Ctx CrucibleType) (ret :: CrucibleType) sym ext (arch :: LLVMArch) (wptr :: Natural) (l :: Ctx CrucibleType) (a :: CrucibleType) rtp. (IsSymInterface sym, HasPtrWidth wptr, HasLLVMAnn sym) => LLVMContext arch -> LLVMOverride p sym ext args ret -> OverrideSim p sym ext rtp l a () Source #
Low-level function to register LLVM overrides.
Type-checks the LLVM override against the Declare it contains, adapting
its arguments and return values as necessary. Then creates and binds
a function handle, and also binds the function to the global function
allocation in the LLVM memory.
Useful when you don't have access to a full LLVM AST, e.g., when parsing
Crucible CFGs written in crucible-syntax. For more usual cases, use
register_llvm_overrides.
alloc_and_register_override Source #
Arguments
| :: forall sym bak (wptr :: Natural) (arch :: LLVMArch) p (args :: Ctx CrucibleType) (ret :: CrucibleType) rtp (l :: Ctx CrucibleType) (a :: CrucibleType). (IsSymBackend sym bak, HasPtrWidth wptr, HasLLVMAnn sym, ?memOpts :: MemOptions) | |
| => bak | |
| -> LLVMContext arch | |
| -> LLVMOverride p sym LLVM args ret | |
| -> [Symbol] | Aliases |
| -> OverrideSim p sym LLVM rtp l a () |
Create an allocation for an override and register it.
Useful when registering an override for a function in an LLVM memory that
wasn't initialized with the functions in Lang.Crucible.LLVM.Globals, e.g.,
when parsing Crucible CFGs written in crucible-syntax. For more usual cases,
use register_llvm_overrides.
c.f. allocLLVMFunPtr
newtype IntrinsicsOptions Source #
This datatype encodes a variety of tweakable settings that to LLVM overrides.
Constructors
| IntrinsicsOptions | |
Fields
| |
data AbnormalExitBehavior Source #
Should Crucible fail when simulating a function which triggers an abnormal
exit, such as abort()?
Constructors
| AlwaysFail | Functions which trigger an abnormal exit will always cause Crucible to fail. |
| OnlyAssertFail | The |
| NeverFail | Functions which trigger an abnormal exit will never cause Crucible to fail. This option is primarily useful for SV-COMP. |
Instances
| Eq AbnormalExitBehavior Source # | |
Defined in Lang.Crucible.LLVM.Intrinsics.Options Methods (==) :: AbnormalExitBehavior -> AbnormalExitBehavior -> Bool # (/=) :: AbnormalExitBehavior -> AbnormalExitBehavior -> Bool # | |
defaultIntrinsicsOptions :: IntrinsicsOptions Source #
The default translation options:
- Functions which trigger an abnormal exit will always cause Crucible to fail.
Arguments
| :: String | Function name |
| -> TemplateMatcher | |
| -> Bool |
Check whether a TemplateMatcher matches a given function name.
data TemplateMatcher Source #
This type controls whether an override is installed for a given name found in a module.
See filterTemplates.
Constructors
| ExactMatch String | |
| PrefixMatch String | |
| SubstringsMatch [String] | |
| DarwinAliasMatch String | Match a name up to some number of Darwin aliases.
See |
stripDarwinAliases :: String -> String Source #
Remove all prefixes and suffixes that might occur in a Darwin alias for
a function name. See Note [Darwin aliases].