Skip to content

Commit

Permalink
Implement new saw-script function crucible_points_to_at_type.
Browse files Browse the repository at this point in the history
Also `crucible_conditional_points_to_at_type`.

Fixes #930.
  • Loading branch information
Brian Huffman committed Jan 14, 2021
1 parent 41b864a commit c62181d
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 5 deletions.
37 changes: 32 additions & 5 deletions src/SAWScript/Crucible/LLVM/Builtins.hs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ module SAWScript.Crucible.LLVM.Builtins
, llvm_equal
, llvm_points_to
, llvm_conditional_points_to
, llvm_points_to_at_type
, llvm_conditional_points_to_at_type
, llvm_points_to_array_prefix
, llvm_fresh_pointer
, llvm_unsafe_assume_spec
Expand Down Expand Up @@ -1979,7 +1981,7 @@ llvm_points_to ::
AllLLVM SetupValue ->
LLVMCrucibleSetupM ()
llvm_points_to typed =
llvm_points_to_internal typed Nothing
llvm_points_to_internal typed Nothing Nothing

llvm_conditional_points_to ::
Bool {- ^ whether to check type compatibility -} ->
Expand All @@ -1988,15 +1990,33 @@ llvm_conditional_points_to ::
AllLLVM SetupValue ->
LLVMCrucibleSetupM ()
llvm_conditional_points_to typed cond =
llvm_points_to_internal typed (Just cond)
llvm_points_to_internal typed Nothing (Just cond)

llvm_points_to_at_type ::
AllLLVM SetupValue ->
L.Type ->
AllLLVM SetupValue ->
LLVMCrucibleSetupM ()
llvm_points_to_at_type ptr ty val =
llvm_points_to_internal False (Just ty) Nothing ptr val

llvm_conditional_points_to_at_type ::
TypedTerm ->
AllLLVM SetupValue ->
L.Type ->
AllLLVM SetupValue ->
LLVMCrucibleSetupM ()
llvm_conditional_points_to_at_type cond ptr ty val =
llvm_points_to_internal False (Just ty) (Just cond) ptr val

llvm_points_to_internal ::
Bool {- ^ whether to check type compatibility -} ->
Maybe L.Type {- ^ optional type constraint for rhs -} ->
Maybe TypedTerm ->
AllLLVM SetupValue ->
AllLLVM SetupValue ->
AllLLVM SetupValue {- ^ lhs pointer -} ->
AllLLVM SetupValue {- ^ rhs value -} ->
LLVMCrucibleSetupM ()
llvm_points_to_internal typed cond (getAllLLVM -> ptr) (getAllLLVM -> val) =
llvm_points_to_internal typed rhsTy cond (getAllLLVM -> ptr) (getAllLLVM -> val) =
LLVMCrucibleSetupM $
do cc <- getLLVMCrucibleContext
loc <- getW4Position "llvm_points_to"
Expand All @@ -2021,7 +2041,14 @@ llvm_points_to_internal typed cond (getAllLLVM -> ptr) (getAllLLVM -> val) =
]

_ -> throwCrucibleSetup loc $ "lhs not a pointer type: " ++ show ptrTy

valTy <- typeOfSetupValue cc env nameEnv val
case rhsTy of
Nothing -> pure ()
Just ty ->
do ty' <- memTypeForLLVMType loc ty
checkMemTypeCompatibility loc ty' valTy

when typed (checkMemTypeCompatibility loc lhsTy valTy)
Setup.addPointsTo (LLVMPointsTo loc cond ptr $ ConcreteSizeValue val)

Expand Down
16 changes: 16 additions & 0 deletions src/SAWScript/Interpreter.hs
Original file line number Diff line number Diff line change
Expand Up @@ -2328,6 +2328,22 @@ primitives = Map.fromList
Current
[ "Legacy alternative name for `llvm_conditional_points_to`." ]

, prim "llvm_points_to_at_type" "SetupValue -> LLVMType -> SetupValue -> LLVMSetup ()"
(pureVal llvm_points_to_at_type)
Current
[ "A variant of `llvm_points_to` that casts the pointer to another type."
, "This may be useful when reading or writing a prefix of larger array,"
, "for example."
]

, prim "llvm_conditional_points_to_at_type" "Term -> SetupValue -> LLVMType -> SetupValue -> LLVMSetup ()"
(pureVal llvm_conditional_points_to_at_type)
Current
[ "A variant of `llvm_conditional_points_to` that casts the pointer to"
, "another type. This may be useful when reading or writing a prefix"
, "of larger array, for example."
]

, prim "llvm_points_to_untyped" "SetupValue -> SetupValue -> LLVMSetup ()"
(pureVal (llvm_points_to False))
Current
Expand Down

0 comments on commit c62181d

Please sign in to comment.