Copyright | (c) Galois Inc 2015-2016 |
---|---|
License | BSD3 |
Maintainer | Rob Dockins <rdockins@galois.com> |
Stability | provisional |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
Lang.Crucible.LLVM.Intrinsics
Contents
Description
Synopsis
- data LLVM
- llvmIntrinsicTypes :: IsSymInterface sym => IntrinsicTypes sym
- data LLVMOverride p sym ext args ret = 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' ret'. OverrideSim p sym ext rtp args' ret' (RegValue sym ret)
- register_llvm_overrides :: (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_ :: (IsSymInterface sym, HasLLVMAnn sym) => LLVMContext arch -> [OverrideTemplate p sym ext arch] -> [Declare] -> OverrideSim p sym ext rtp l a [SomeLLVMOverride p sym ext]
- llvmDeclToFunHandleRepr :: HasPtrWidth wptr => FunDecl -> (forall args ret. CtxRepr args -> TypeRepr ret -> a) -> a
- data LLVMOverride p sym ext args ret = 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' ret'. OverrideSim p sym ext rtp args' ret' (RegValue sym ret)
- data SomeLLVMOverride p sym ext = forall args ret. SomeLLVMOverride (LLVMOverride p sym ext args ret)
- newtype MakeOverride p sym ext arch = MakeOverride {
- runMakeOverride :: Declare -> Maybe DecodedName -> LLVMContext arch -> Maybe (SomeLLVMOverride p sym ext)
- llvmSizeT :: HasPtrWidth wptr => Type
- llvmSSizeT :: HasPtrWidth wptr => Type
- data OverrideTemplate p sym ext arch = OverrideTemplate {
- overrideTemplateMatcher :: TemplateMatcher
- overrideTemplateAction :: MakeOverride p sym ext arch
- callStackFromMemVar' :: GlobalVar Mem -> OverrideSim p sym ext r args ret CallStack
- basic_llvm_override :: forall p args ret sym ext arch wptr. (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 wptr. (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr) => String -> (forall w. 1 <= w => NatRepr w -> SomeLLVMOverride p sym ext) -> OverrideTemplate p sym ext arch
- polymorphic1_vec_llvm_override :: forall p sym ext arch wptr. (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr) => String -> (forall vecSz intSz. 1 <= intSz => NatRepr vecSz -> NatRepr intSz -> SomeLLVMOverride p sym ext) -> OverrideTemplate p sym ext arch
- build_llvm_override :: HasLLVMAnn sym => FunctionName -> CtxRepr args -> TypeRepr ret -> CtxRepr args' -> TypeRepr ret' -> (forall rtp' l' a'. 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 ret sym ext arch wptr rtp l a. (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 wptr. (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr) => String -> (forall w. 1 <= w => NatRepr w -> SomeLLVMOverride p sym ext) -> MakeOverride p sym ext arch
- register_1arg_vec_polymorphic_override :: forall p sym ext arch wptr. (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr) => String -> (forall vecSz intSz. 1 <= intSz => NatRepr vecSz -> NatRepr intSz -> SomeLLVMOverride p sym ext) -> MakeOverride p sym ext arch
- do_register_llvm_override :: forall p args ret sym ext arch wptr l a 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 :: (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
- data TemplateMatcher
- matches :: String -> TemplateMatcher -> Bool
- 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 # | |
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 ret Source #
This type represents an implementation of an LLVM intrinsic function in Crucible.
This is parameterized over ext
so that LLVMOverride
s 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
:: (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 OverrideTemplate
s against the declare
s and define
s
in a Module
, registering all the overrides that apply and returning them
as a list.
register_llvm_overrides_ Source #
Arguments
:: (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 OverrideTemplate
s against a set of Declare
s,
registering all the overrides that apply and returning them as a list.
llvmDeclToFunHandleRepr :: HasPtrWidth wptr => FunDecl -> (forall args ret. CtxRepr args -> TypeRepr ret -> a) -> a Source #
Compute the function Crucible function signature that corresponds to the given LLVM function declaration.
data LLVMOverride p sym ext args ret Source #
This type represents an implementation of an LLVM intrinsic function in Crucible.
This is parameterized over ext
so that LLVMOverride
s 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
forall args ret. SomeLLVMOverride (LLVMOverride p sym ext args ret) |
newtype MakeOverride p sym ext arch 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 :: HasPtrWidth wptr => Type Source #
Convenient LLVM representation of the size_t
type.
llvmSSizeT :: HasPtrWidth wptr => Type Source #
Convenient LLVM representation of the ssize_t
type.
data OverrideTemplate p sym ext arch 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' :: GlobalVar Mem -> OverrideSim p sym ext r args ret CallStack Source #
register_llvm_override
basic_llvm_override :: forall p args ret sym ext arch wptr. (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 wptr. (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr) => String -> (forall w. 1 <= w => NatRepr w -> SomeLLVMOverride p sym ext) -> OverrideTemplate p sym ext arch Source #
polymorphic1_vec_llvm_override :: forall p sym ext arch wptr. (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr) => String -> (forall vecSz intSz. 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 :: HasLLVMAnn sym => FunctionName -> CtxRepr args -> TypeRepr ret -> CtxRepr args' -> TypeRepr ret' -> (forall rtp' l' a'. 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 ret sym ext arch wptr rtp l a. (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 wptr. (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr) => String -> (forall w. 1 <= w => NatRepr w -> SomeLLVMOverride p sym ext) -> MakeOverride p sym ext arch Source #
register_1arg_vec_polymorphic_override :: forall p sym ext arch wptr. (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr) => String -> (forall vecSz intSz. 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 ret sym ext arch wptr l a 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
:: (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.
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 |
Arguments
:: String | Function name |
-> TemplateMatcher | |
-> Bool |
Check whether a TemplateMatcher
matches a given function name.
stripDarwinAliases :: String -> String Source #
Remove all prefixes and suffixes that might occur in a Darwin alias for
a function name. See Note [Darwin aliases]
.