crucible-llvm-0.7.1: Support for translating and executing LLVM code in Crucible
Copyright(c) Galois Inc 2015-2016
LicenseBSD3
MaintainerRob Dockins <rdockins@galois.com>
Stabilityprovisional
Safe HaskellSafe-Inferred
LanguageHaskell2010

Lang.Crucible.LLVM.Intrinsics.LLVM

Description

 
Synopsis

Documentation

mkNull :: (IsSymInterface sym, HasPtrWidth wptr) => OverrideSim p sym ext rtp args ret (LLVMPtr sym wptr) Source #

Local helper to make a null pointer in OverrideSim

Lists

basic_llvm_overrides :: (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr, ?lc :: TypeContext, ?memOpts :: MemOptions) => [SomeLLVMOverride p sym ext] Source #

All "basic"/"monomorphic" LLVM overrides.

Can be turned into OverrideTemplates via basic_llvm_override.

newtype Poly1LLVMOverride p sym ext Source #

An LLVM override that is polymorphic in a single argument

Constructors

Poly1LLVMOverride (forall w. 1 <= w => NatRepr w -> SomeLLVMOverride p sym ext) 

newtype Poly1VecLLVMOverride p sym ext Source #

An LLVM override that is polymorphic in a single integer argument (intSz) that is used in combination with a vector type, which can be of varying sizes (vecSz).

Constructors

Poly1VecLLVMOverride (forall vecSz intSz. 1 <= intSz => NatRepr vecSz -> NatRepr intSz -> SomeLLVMOverride p sym ext) 

Declarations

llvmLifetimeStartOverride :: (IsSymInterface sym, HasPtrWidth wptr) => LLVMOverride p sym ext ((EmptyCtx ::> BVType 64) ::> LLVMPointerType wptr) UnitType Source #

This intrinsic is currently a no-op.

We might want to support this in the future to catch undefined memory accesses.

LLVM docs

llvmLifetimeOverrideOverload Source #

Arguments

:: forall width sym wptr p ext. (1 <= width, KnownNat width, IsSymInterface sym, HasPtrWidth wptr) 
=> String

"start" or "end"

-> NatRepr width 
-> LLVMOverride p sym ext ((EmptyCtx ::> BVType 64) ::> LLVMPointerType wptr) UnitType 

This is a no-op.

The language reference doesn't mention the use of this intrinsic.

llvmLifetimeOverrideOverload_opaque Source #

Arguments

:: forall sym wptr p ext. (IsSymInterface sym, HasPtrWidth wptr) 
=> String

"start" or "end"

-> LLVMOverride p sym ext ((EmptyCtx ::> BVType 64) ::> LLVMPointerType wptr) UnitType 

Like llvmLifetimeOverrideOverload, but with an opaque pointer type.

llvmInvariantStartOverride :: (IsSymInterface sym, HasPtrWidth wptr) => NatRepr width -> LLVMOverride p sym ext ((EmptyCtx ::> BVType 64) ::> LLVMPointerType wptr) (LLVMPointerType wptr) Source #

This intrinsic is currently a no-op.

We might want to support this in the future to catch undefined memory writes.

LLVM docs

llvmExpectOverride :: (IsSymInterface sym, 1 <= width) => NatRepr width -> LLVMOverride p sym ext ((EmptyCtx ::> BVType width) ::> BVType width) (BVType width) Source #

This instruction is a hint to optimizers, it isn't really useful for us.

Its runtime behavior of that of Haskell's const: just ignore the second argument.

llvmAssumeOverride :: IsSymInterface sym => LLVMOverride p sym ext (EmptyCtx ::> BVType 1) UnitType Source #

This intrinsic asserts that its argument is equal to 1.

We could have this generate a verification condition, but that would catch clang compiler bugs (or Crucible bugs) more than user code bugs.

llvmTrapOverride :: IsSymInterface sym => LLVMOverride p sym ext EmptyCtx UnitType Source #

This intrinsic is sometimes inserted by clang, and we interpret it as an assertion failure, similar to calling abort().

llvmUBSanTrapOverride :: IsSymInterface sym => LLVMOverride p sym ext (EmptyCtx ::> BVType 8) UnitType Source #

This is like llvm.trap(), but with an argument indicating which sort of undefined behavior was trapped. The argument acts as an index into this list. Ideally, we would do something intelligent with this argument—see #368.

llvmPrefetchOverride :: (IsSymInterface sym, HasPtrWidth wptr) => LLVMOverride p sym ext ((((EmptyCtx ::> LLVMPointerType wptr) ::> BVType 32) ::> BVType 32) ::> BVType 32) UnitType Source #

This instruction is a hint to code generators, which means that it is a no-op for us.

LLVM docs

llvmPrefetchOverride_opaque :: (IsSymInterface sym, HasPtrWidth wptr) => LLVMOverride p sym ext ((((EmptyCtx ::> LLVMPointerType wptr) ::> BVType 32) ::> BVType 32) ::> BVType 32) UnitType Source #

Like llvmPrefetchOverride, but with an opaque pointer type.

llvmPrefetchOverride_preLLVM10 :: (IsSymInterface sym, HasPtrWidth wptr) => LLVMOverride p sym ext ((((EmptyCtx ::> LLVMPointerType wptr) ::> BVType 32) ::> BVType 32) ::> BVType 32) UnitType Source #

This instruction is a hint to code generators, which means that it is a no-op for us.

See also llvmPrefetchOverride. This version exists for compatibility with pre-10 versions of LLVM, where llvm.prefetch always assumed that the first argument resides in address space 0.

LLVM docs

llvmFshl :: (1 <= w, IsSymInterface sym) => NatRepr w -> LLVMOverride p sym ext (((EmptyCtx ::> BVType w) ::> BVType w) ::> BVType w) (BVType w) Source #

llvmFshr :: (1 <= w, IsSymInterface sym) => NatRepr w -> LLVMOverride p sym ext (((EmptyCtx ::> BVType w) ::> BVType w) ::> BVType w) (BVType w) Source #

llvmUmax :: (1 <= w, IsSymInterface sym) => NatRepr w -> LLVMOverride p sym ext ((EmptyCtx ::> BVType w) ::> BVType w) (BVType w) Source #

llvmUmin :: (1 <= w, IsSymInterface sym) => NatRepr w -> LLVMOverride p sym ext ((EmptyCtx ::> BVType w) ::> BVType w) (BVType w) Source #

llvmSmax :: (1 <= w, IsSymInterface sym) => NatRepr w -> LLVMOverride p sym ext ((EmptyCtx ::> BVType w) ::> BVType w) (BVType w) Source #

llvmSmin :: (1 <= w, IsSymInterface sym) => NatRepr w -> LLVMOverride p sym ext ((EmptyCtx ::> BVType w) ::> BVType w) (BVType w) Source #

llvmCtlz :: (1 <= w, IsSymInterface sym) => NatRepr w -> LLVMOverride p sym ext ((EmptyCtx ::> BVType w) ::> BVType 1) (BVType w) Source #

llvmCttz :: (1 <= w, IsSymInterface sym) => NatRepr w -> LLVMOverride p sym ext ((EmptyCtx ::> BVType w) ::> BVType 1) (BVType w) Source #

llvmCtpop :: (1 <= w, IsSymInterface sym) => NatRepr w -> LLVMOverride p sym ext (EmptyCtx ::> BVType w) (BVType w) Source #

llvmBSwapOverride :: forall width sym p ext. (1 <= width, IsSymInterface sym) => NatRepr width -> LLVMOverride p sym ext (EmptyCtx ::> BVType (width * 8)) (BVType (width * 8)) Source #

llvmVectorReduce Source #

Arguments

:: 1 <= intSz 
=> String

The name of the operation to reduce (add, mul, etc.).

-> (forall r args ret. IsSymInterface sym => NatRepr intSz -> RegEntry sym (VectorType (BVType intSz)) -> OverrideSim p sym ext r args ret (SymBV sym intSz))

The semantics of the override.

-> NatRepr vecSz

The size of the vector type.

-> NatRepr intSz

The size of the integer type.

-> LLVMOverride p sym ext (EmptyCtx ::> VectorType (BVType intSz)) (BVType intSz) 

Build an LLVMOverride for a vector reduce intrinsic.

llvmVectorReduceAdd :: 1 <= intSz => NatRepr vecSz -> NatRepr intSz -> LLVMOverride p sym ext (EmptyCtx ::> VectorType (BVType intSz)) (BVType intSz) Source #

llvmVectorReduceMul :: 1 <= intSz => NatRepr vecSz -> NatRepr intSz -> LLVMOverride p sym ext (EmptyCtx ::> VectorType (BVType intSz)) (BVType intSz) Source #

llvmVectorReduceAnd :: 1 <= intSz => NatRepr vecSz -> NatRepr intSz -> LLVMOverride p sym ext (EmptyCtx ::> VectorType (BVType intSz)) (BVType intSz) Source #

llvmVectorReduceOr :: 1 <= intSz => NatRepr vecSz -> NatRepr intSz -> LLVMOverride p sym ext (EmptyCtx ::> VectorType (BVType intSz)) (BVType intSz) Source #

llvmVectorReduceXor :: 1 <= intSz => NatRepr vecSz -> NatRepr intSz -> LLVMOverride p sym ext (EmptyCtx ::> VectorType (BVType intSz)) (BVType intSz) Source #

llvmVectorReduceSmax :: 1 <= intSz => NatRepr vecSz -> NatRepr intSz -> LLVMOverride p sym ext (EmptyCtx ::> VectorType (BVType intSz)) (BVType intSz) Source #

llvmVectorReduceSmin :: 1 <= intSz => NatRepr vecSz -> NatRepr intSz -> LLVMOverride p sym ext (EmptyCtx ::> VectorType (BVType intSz)) (BVType intSz) Source #

llvmVectorReduceUmax :: 1 <= intSz => NatRepr vecSz -> NatRepr intSz -> LLVMOverride p sym ext (EmptyCtx ::> VectorType (BVType intSz)) (BVType intSz) Source #

llvmVectorReduceUmin :: 1 <= intSz => NatRepr vecSz -> NatRepr intSz -> LLVMOverride p sym ext (EmptyCtx ::> VectorType (BVType intSz)) (BVType intSz) Source #

Implementations

callX86_pclmulqdq :: forall p sym ext wptr r args ret. (IsSymInterface sym, HasPtrWidth wptr) => GlobalVar Mem -> RegEntry sym (VectorType (BVType 64)) -> RegEntry sym (VectorType (BVType 64)) -> RegEntry sym (BVType 8) -> OverrideSim p sym ext r args ret (RegValue sym (VectorType (BVType 64))) Source #

callStoreudq :: (IsSymInterface sym, HasLLVMAnn sym, HasPtrWidth wptr, ?memOpts :: MemOptions) => GlobalVar Mem -> RegEntry sym (LLVMPointerType wptr) -> RegEntry sym (VectorType (BVType 8)) -> OverrideSim p sym ext r args ret () Source #

callObjectsize :: (1 <= w, IsSymInterface sym) => GlobalVar Mem -> NatRepr w -> RegEntry sym (LLVMPointerType wptr) -> RegEntry sym (BVType 1) -> OverrideSim p sym ext r args ret (RegValue sym (BVType w)) Source #

callObjectsize_null :: (1 <= w, IsSymInterface sym) => GlobalVar Mem -> NatRepr w -> RegEntry sym (LLVMPointerType wptr) -> RegEntry sym (BVType 1) -> RegEntry sym (BVType 1) -> OverrideSim p sym ext r args ret (RegValue sym (BVType w)) Source #

callObjectsize_null_dynamic :: (1 <= w, IsSymInterface sym) => GlobalVar Mem -> NatRepr w -> RegEntry sym (LLVMPointerType wptr) -> RegEntry sym (BVType 1) -> RegEntry sym (BVType 1) -> RegEntry sym (BVType 1) -> OverrideSim p sym ext r args ret (RegValue sym (BVType w)) Source #

callCtlz :: (1 <= w, IsSymInterface sym) => GlobalVar Mem -> RegEntry sym (BVType w) -> RegEntry sym (BVType 1) -> OverrideSim p sym ext r args ret (RegValue sym (BVType w)) Source #

callFshl :: (1 <= w, IsSymInterface sym) => NatRepr w -> RegEntry sym (BVType w) -> RegEntry sym (BVType w) -> RegEntry sym (BVType w) -> OverrideSim p sym ext r args ret (RegValue sym (BVType w)) Source #

callFshr :: (1 <= w, IsSymInterface sym) => NatRepr w -> RegEntry sym (BVType w) -> RegEntry sym (BVType w) -> RegEntry sym (BVType w) -> OverrideSim p sym ext r args ret (RegValue sym (BVType w)) Source #

callSaddWithOverflow :: (1 <= w, IsSymInterface sym) => GlobalVar Mem -> RegEntry sym (BVType w) -> RegEntry sym (BVType w) -> OverrideSim p sym ext r args ret (RegValue sym (StructType ((EmptyCtx ::> BVType w) ::> BVType 1))) Source #

callUaddWithOverflow :: (1 <= w, IsSymInterface sym) => GlobalVar Mem -> RegEntry sym (BVType w) -> RegEntry sym (BVType w) -> OverrideSim p sym ext r args ret (RegValue sym (StructType ((EmptyCtx ::> BVType w) ::> BVType 1))) Source #

callUsubWithOverflow :: (1 <= w, IsSymInterface sym) => GlobalVar Mem -> RegEntry sym (BVType w) -> RegEntry sym (BVType w) -> OverrideSim p sym ext r args ret (RegValue sym (StructType ((EmptyCtx ::> BVType w) ::> BVType 1))) Source #

callSsubWithOverflow :: (1 <= w, IsSymInterface sym) => GlobalVar Mem -> RegEntry sym (BVType w) -> RegEntry sym (BVType w) -> OverrideSim p sym ext r args ret (RegValue sym (StructType ((EmptyCtx ::> BVType w) ::> BVType 1))) Source #

callSmulWithOverflow :: (1 <= w, IsSymInterface sym) => GlobalVar Mem -> RegEntry sym (BVType w) -> RegEntry sym (BVType w) -> OverrideSim p sym ext r args ret (RegValue sym (StructType ((EmptyCtx ::> BVType w) ::> BVType 1))) Source #

callUmulWithOverflow :: (1 <= w, IsSymInterface sym) => GlobalVar Mem -> RegEntry sym (BVType w) -> RegEntry sym (BVType w) -> OverrideSim p sym ext r args ret (RegValue sym (StructType ((EmptyCtx ::> BVType w) ::> BVType 1))) Source #

callUmax :: (1 <= w, IsSymInterface sym) => GlobalVar Mem -> RegEntry sym (BVType w) -> RegEntry sym (BVType w) -> OverrideSim p sym ext r args ret (RegValue sym (BVType w)) Source #

bvUmax :: (IsExprBuilder sym, 1 <= w) => sym -> SymBV sym w -> SymBV sym w -> IO (SymBV sym w) Source #

Compute the unsigned maximum of two bitvectors.

callUmin :: (1 <= w, IsSymInterface sym) => GlobalVar Mem -> RegEntry sym (BVType w) -> RegEntry sym (BVType w) -> OverrideSim p sym ext r args ret (RegValue sym (BVType w)) Source #

bvUmin :: (IsExprBuilder sym, 1 <= w) => sym -> SymBV sym w -> SymBV sym w -> IO (SymBV sym w) Source #

Compute the unsigned minimum of two bitvectors.

callSmax :: (1 <= w, IsSymInterface sym) => GlobalVar Mem -> RegEntry sym (BVType w) -> RegEntry sym (BVType w) -> OverrideSim p sym ext r args ret (RegValue sym (BVType w)) Source #

bvSmax :: (IsExprBuilder sym, 1 <= w) => sym -> SymBV sym w -> SymBV sym w -> IO (SymBV sym w) Source #

Compute the signed maximum of two bitvectors.

callSmin :: (1 <= w, IsSymInterface sym) => GlobalVar Mem -> RegEntry sym (BVType w) -> RegEntry sym (BVType w) -> OverrideSim p sym ext r args ret (RegValue sym (BVType w)) Source #

bvSmin :: (IsExprBuilder sym, 1 <= w) => sym -> SymBV sym w -> SymBV sym w -> IO (SymBV sym w) Source #

Compute the signed minimum of two bitvectors.

callCttz :: (1 <= w, IsSymInterface sym) => GlobalVar Mem -> RegEntry sym (BVType w) -> RegEntry sym (BVType 1) -> OverrideSim p sym ext r args ret (RegValue sym (BVType w)) Source #

callCtpop :: (1 <= w, IsSymInterface sym) => GlobalVar Mem -> RegEntry sym (BVType w) -> OverrideSim p sym ext r args ret (RegValue sym (BVType w)) Source #

callBitreverse :: (1 <= w, IsSymInterface sym) => GlobalVar Mem -> RegEntry sym (BVType w) -> OverrideSim p sym ext r args ret (RegValue sym (BVType w)) Source #

callCopysign :: forall fi p sym ext r args ret. IsSymInterface sym => RegEntry sym (FloatType fi) -> RegEntry sym (FloatType fi) -> OverrideSim p sym ext r args ret (RegValue sym (FloatType fi)) Source #

Strictly speaking, this doesn't quite conform to the C99 description of copysign, since copysign(NaN, -1.0) should return NaN with a negative sign bit. libBF does not provide a way to distinguish between NaN values with different sign bits, however, so copysign will always turn a NaN argument into a positive, "quiet" NaN.

callIsFpclass :: forall fi p sym ext r args ret. IsSymInterface sym => RegEntry sym (FloatType fi) -> RegEntry sym (BVType 32) -> OverrideSim p sym ext r args ret (RegValue sym (BVType 1)) Source #

An implementation of the llvm.is.fpclass intrinsic. This essentially combines several different floating-point checks (checking for NaN, infinity, zero, etc.) into a single function. The second argument is a bitmask that controls which properties to check of the first argument. The different checks in the bitmask are described by the table here: https://llvm.org/docs/LangRef.html#id1566

The specification requires being able to distinguish between signaling NaNs (bit 0 of the bitmask) and quit NaNs (bit 1 of the bitmask), but crucible-llvm does not have the ability to do this. As a result, both NaN checks will always return true in this implementation, regardless of whether they are signaling or quiet NaNs.

callLoadRelative :: (1 <= w, IsSymInterface sym, HasPtrWidth wptr, HasLLVMAnn sym, ?memOpts :: MemOptions) => GlobalVar Mem -> NatRepr w -> RegEntry sym (LLVMPointerType wptr) -> RegEntry sym (BVType w) -> OverrideSim p sym ext r args ret (LLVMPtr sym wptr) Source #

An override for the llvm.load.relative.i* family of intrinsics. Broadly speaking, this loads a pointer at from the first argument (a pointer to an array) at the value of the second argument (the offset). However, due to the reasons described in Note [Undoing LLVM's relative table lookup conversion pass] in Lang.Crucible.LLVM.Globals, this override adjusts the offset before performing the load.

callVectorReduce Source #

Arguments

:: (RegValue sym tp -> RegValue sym tp -> IO (RegValue sym tp))

The operation which performs the reduction (e.g., addition, multiplication, etc.)

-> RegValue sym tp

The identity element for the reduction operation. (For addition, this is 0; for multiplication, this is 1, and so on.)

-> RegEntry sym (VectorType tp)

The vector to reduce.

-> OverrideSim p sym ext r args ret (RegValue sym tp) 

The semantics of an LLVM vector reduce intrinsic.

callVectorReduceAdd :: (IsSymInterface sym, 1 <= intSz) => NatRepr intSz -> RegEntry sym (VectorType (BVType intSz)) -> OverrideSim p sym ext r args ret (SymBV sym intSz) Source #

callVectorReduceMul :: (IsSymInterface sym, 1 <= intSz) => NatRepr intSz -> RegEntry sym (VectorType (BVType intSz)) -> OverrideSim p sym ext r args ret (SymBV sym intSz) Source #

callVectorReduceAnd :: (IsSymInterface sym, 1 <= intSz) => NatRepr intSz -> RegEntry sym (VectorType (BVType intSz)) -> OverrideSim p sym ext r args ret (SymBV sym intSz) Source #

callVectorReduceOr :: (IsSymInterface sym, 1 <= intSz) => NatRepr intSz -> RegEntry sym (VectorType (BVType intSz)) -> OverrideSim p sym ext r args ret (SymBV sym intSz) Source #

callVectorReduceXor :: (IsSymInterface sym, 1 <= intSz) => NatRepr intSz -> RegEntry sym (VectorType (BVType intSz)) -> OverrideSim p sym ext r args ret (SymBV sym intSz) Source #

callVectorReduceSmax :: (IsSymInterface sym, 1 <= intSz) => NatRepr intSz -> RegEntry sym (VectorType (BVType intSz)) -> OverrideSim p sym ext r args ret (SymBV sym intSz) Source #

callVectorReduceSmin :: (IsSymInterface sym, 1 <= intSz) => NatRepr intSz -> RegEntry sym (VectorType (BVType intSz)) -> OverrideSim p sym ext r args ret (SymBV sym intSz) Source #

callVectorReduceUmax :: (IsSymInterface sym, 1 <= intSz) => NatRepr intSz -> RegEntry sym (VectorType (BVType intSz)) -> OverrideSim p sym ext r args ret (SymBV sym intSz) Source #

callVectorReduceUmin :: (IsSymInterface sym, 1 <= intSz) => NatRepr intSz -> RegEntry sym (VectorType (BVType intSz)) -> OverrideSim p sym ext r args ret (SymBV sym intSz) Source #