|
1 | 1 | enable_experimental;
|
2 | 2 | env <- heapster_init_env_from_file "arrays.sawcore" "arrays.bc";
|
3 | 3 |
|
| 4 | +// Integer types |
4 | 5 | heapster_define_perm env "int64" " " "llvmptr 64" "exists x:bv 64.eq(llvmword(x))";
|
5 | 6 | heapster_define_perm env "int8" " " "llvmptr 8" "exists x:bv 8.eq(llvmword(x))";
|
6 | 7 |
|
7 | 8 | heapster_define_perm env "int64array" "len:bv 64" "llvmptr 64" "array(0,<len,*8,[(W,0) |-> int64<>])";
|
8 | 9 |
|
9 | 10 |
|
10 |
| -heapster_typecheck_fun env "contains0_rec_" "(len:bv 64).arg0:eq(llvmword(len)), arg1:int64array<len>, arg2:int64<> -o arg0:true, arg1:int64array<len>, arg2:true, ret:int64<>"; |
| 11 | +heapster_typecheck_fun env "contains0_rec_" |
| 12 | + "(len:bv 64). arg0:eq(llvmword(len)), arg1:int64array<len>, arg2:int64<> -o \ |
| 13 | + \ arg0:true, arg1:int64array<len>, arg2:true, ret:int64<>"; |
11 | 14 |
|
12 | 15 | // the old way using a block entry hint
|
13 |
| -// heapster_define_perm env "int64" " " "llvmptr 64" "exists x:bv 64.eq(llvmword(x))"; |
14 |
| -// heapster_block_entry_hint env "contains0" 9 "top0:bv 64, top1:llvmptr 64, top2:llvmptr 64" "frm:llvmframe 64, x0:llvmptr 64, x1:llvmptr 64" "top0:true, top1:array(0,<top0,*1,[(W,0) |-> int64<>]), top2:eq(llvmword(top0)), arg0:ptr((W,0) |-> true), arg1:ptr((W,0) |-> eq(x1)), arg2:ptr((W,0) |-> eq(x0)), arg3:ptr((W,0) |-> int64<>), frm:llvmframe [arg3:8, arg2:8, arg1:8, arg0:8], x0:eq(top2), x1:eq(top1)"; |
15 |
| -// heapster_typecheck_fun env "contains0" "(len:bv 64).arg0:array(0,<len,*1,[(W,0) |-> int64<>]), arg1:eq(llvmword(len)) -o arg0:array(0,<len,*1,[(W,0) |-> int64<>]), arg1:true, ret:int64<>"; |
16 |
| - |
17 |
| -heapster_typecheck_fun env "contains0" "(len:bv 64).arg0:int64array<len>, arg1:eq(llvmword(len)) -o arg0:int64array<len>, arg1:true, ret:int64<>"; |
18 |
| - |
19 |
| -heapster_typecheck_fun env "zero_array" "(len:bv 64).arg0:int64array<len>, arg1:eq(llvmword(len)) -o arg0:int64array<len>, arg1:true, ret:true"; |
20 |
| - |
21 |
| -heapster_typecheck_fun env "zero_array_from" "(len:bv 64, off:bv 64).arg0:int64array<len>, arg1:eq(llvmword(len)), arg2:eq(llvmword(off)) -o arg0:int64array<len>, arg1:true, ret:true"; |
| 16 | +// heapster_block_entry_hint env "contains0" 9 |
| 17 | +// "top0:bv 64, top1:llvmptr 64, top2:llvmptr 64" |
| 18 | +// "frm:llvmframe 64, x0:llvmptr 64, x1:llvmptr 64" |
| 19 | +// "top0:true, top1:array(0,<top0,*1,[(W,0) |-> int64<>]), |
| 20 | +// \ top2:eq(llvmword(top0)), arg0:ptr((W,0) |-> true), \ |
| 21 | +// \ arg1:ptr((W,0) |-> eq(x1)), arg2:ptr((W,0) |-> eq(x0)), arg3:ptr((W,0) |-> int64<>), \ |
| 22 | +// \ frm:llvmframe [arg3:8, arg2:8, arg1:8, arg0:8], x0:eq(top2), x1:eq(top1)"; |
| 23 | +// heapster_typecheck_fun env "contains0" |
| 24 | +// "(len:bv 64). arg0:array(0,<len,*1,[(W,0) |-> int64<>]), arg1:eq(llvmword(len)) -o \ |
| 25 | +// \ arg0:array(0,<len,*1,[(W,0) |-> int64<>]), arg1:true, ret:int64<>"; |
| 26 | + |
| 27 | +heapster_typecheck_fun env "contains0" |
| 28 | + "(len:bv 64). arg0:int64array<len>, arg1:eq(llvmword(len)) -o \ |
| 29 | + \ arg0:int64array<len>, arg1:true, ret:int64<>"; |
| 30 | + |
| 31 | +heapster_typecheck_fun env "zero_array" |
| 32 | + "(len:bv 64). arg0:int64array<len>, arg1:eq(llvmword(len)) -o \ |
| 33 | + \ arg0:int64array<len>, arg1:true, ret:true"; |
| 34 | + |
| 35 | +heapster_typecheck_fun env "zero_array_from" |
| 36 | + "(len:bv 64, off:bv 64). arg0:int64array<len>, arg1:eq(llvmword(len)), arg2:eq(llvmword(off)) -o \ |
| 37 | + \ arg0:int64array<len>, arg1:true, arg2:true, ret:true"; |
22 | 38 |
|
23 | 39 | heapster_join_point_hint env "filter_and_sum_pos" [];
|
24 |
| -heapster_typecheck_fun env "filter_and_sum_pos" "(len:bv 64).arg0:int64array<len>, arg1:eq(llvmword(len)) -o arg0:int64array<len>, arg1:true, ret:int64<>"; |
25 |
| - |
26 |
| -heapster_typecheck_fun env "sum_2d" "(l1:bv 64,l2:bv 64).arg0:array(0,<l1,*8,[(W,0) |-> array(0,<l2,*8,[(W,0) |-> exists z:bv 64.eq(llvmword(z))])]), arg1:eq(llvmword(l1)), arg2:eq(llvmword(l2)) -o arg0:array(0,<l1,*8,[(W,0) |-> array(0,<l2,*8,[(W,0) |-> exists z:bv 64.eq(llvmword(z))])]), arg1:true, arg2:true, ret:int64<>"; |
27 |
| - |
28 |
| -heapster_typecheck_fun env "sum_inc_ptr" "(len:bv 64).arg0:array(0,<len,*1,[(W,0,8) |-> int8<>]), arg1:eq(llvmword(len)) -o arg0:array(0,<len,*1,[(W,0,8) |-> int8<>]), arg1:true, ret:int64<>"; |
| 40 | +heapster_typecheck_fun env "filter_and_sum_pos" |
| 41 | + "(len:bv 64). arg0:int64array<len>, arg1:eq(llvmword(len)) -o \ |
| 42 | + \ arg0:int64array<len>, arg1:true, ret:int64<>"; |
| 43 | + |
| 44 | +heapster_typecheck_fun env "sum_2d" |
| 45 | + "(l1:bv 64,l2:bv 64). arg0:array(0,<l1,*8,[(W,0) |-> array(0,<l2,*8,[(W,0) |-> int64<>])]), \ |
| 46 | + \ arg1:eq(llvmword(l1)), arg2:eq(llvmword(l2)) -o \ |
| 47 | + \ arg0:array(0,<l1,*8,[(W,0) |-> array(0,<l2,*8,[(W,0) |-> int64<>])]), \ |
| 48 | + \ arg1:true, arg2:true, ret:int64<>"; |
| 49 | + |
| 50 | +heapster_typecheck_fun env "sum_inc_ptr" |
| 51 | + "(len:bv 64). arg0:array(0,<len,*1,[(W,0,8) |-> int8<>]), arg1:eq(llvmword(len)) -o \ |
| 52 | + \ arg0:array(0,<len,*1,[(W,0,8) |-> int8<>]), arg1:true, ret:int64<>"; |
29 | 53 |
|
30 | 54 | heapster_export_coq env "arrays_gen.v";
|
0 commit comments