Skip to content

Commit

Permalink
Add integration test for llvm_points_to_at_type command.
Browse files Browse the repository at this point in the history
  • Loading branch information
Brian Huffman committed Jan 14, 2021
1 parent c62181d commit 507165f
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 0 deletions.
2 changes: 2 additions & 0 deletions intTests/test_llvm_points_to_at_type/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
test.bc : test.c
clang -c -emit-llvm -g -o test.bc test.c
Binary file added intTests/test_llvm_points_to_at_type/test.bc
Binary file not shown.
4 changes: 4 additions & 0 deletions intTests/test_llvm_points_to_at_type/test.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
void f (int *p) {
p[2] = p[0];
p[3] = p[1];
}
49 changes: 49 additions & 0 deletions intTests/test_llvm_points_to_at_type/test.saw
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
// This is a test to demonstrate the use of the saw-script LLVM setup
// declaration `llvm_points_to_at_type`.

bc <- llvm_load_module "test.bc";

let i32 = llvm_int 32;

// The function `f` copies the first half of an array into the second
// half. So the full array needs to be allocated, but only the first
// half needs to be initialized.

// This first example fails because the types don't match in the first
// `llvm_points_to` declaration.
fails (
llvm_verify bc "f" [] false
do {
x <- llvm_fresh_var "x" (llvm_array 2 i32);
p <- llvm_alloc (llvm_array 4 i32);
llvm_points_to p (llvm_term x);
llvm_execute_func [p];
llvm_points_to p (llvm_term {{ x # x }});
}
z3);

// Changing `llvm_points_to` to `llvm_points_to_at_type` will work, as
// long as the specified type matches the type of the rhs.
f_ov <-
llvm_verify bc "f" [] false
do {
x <- llvm_fresh_var "x" (llvm_array 2 i32);
p <- llvm_alloc (llvm_array 4 i32);
llvm_points_to_at_type p (llvm_array 2 i32) (llvm_term x);
llvm_execute_func [p];
llvm_points_to p (llvm_term {{ x # x }});
}
z3;

// But if the specified type does not match the rhs, the declaration
// will fail with another type mismatch error.
fails (
llvm_verify bc "f" [] false
do {
x <- llvm_fresh_var "x" (llvm_array 2 i32);
p <- llvm_alloc (llvm_array 4 i32);
llvm_points_to_at_type p (llvm_array 3 i32) (llvm_term x);
llvm_execute_func [p];
llvm_points_to p (llvm_term {{ x # x }});
}
z3);
1 change: 1 addition & 0 deletions intTests/test_llvm_points_to_at_type/test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
$SAW test.saw

0 comments on commit 507165f

Please sign in to comment.