15#ifndef CPROVER_ANSI_C_LIBRARY_JSA_H
16#define CPROVER_ANSI_C_LIBRARY_JSA_H
18#ifdef JSA_GENETIC_SYNTHESIS_H_
19#ifndef __CPROVER_jsa_extern
20#define __CPROVER_jsa_extern extern
21#define JSA_SYNTHESIS_H_
22#define __CPROVER_JSA_DEFINE_TRANSFORMERS
25#ifndef __CPROVER_jsa_extern
26#define __CPROVER_jsa_extern
30#ifndef JSA_SYNTHESIS_H_
31#define __CPROVER_JSA_DEFINE_TRANSFORMERS
42#ifndef __CPROVER_JSA_MAX_CONCRETE_NODES
43#define __CPROVER_JSA_MAX_CONCRETE_NODES 100u
45#ifndef __CPROVER_JSA_MAX_ABSTRACT_NODES
46#define __CPROVER_JSA_MAX_ABSTRACT_NODES __CPROVER_JSA_MAX_CONCRETE_NODES
48#ifndef __CPROVER_JSA_MAX_NODES
49#define __CPROVER_JSA_MAX_NODES __CPROVER_JSA_MAX_CONCRETE_NODES+\
50 __CPROVER_JSA_MAX_ABSTRACT_NODES
49#define __CPROVER_JSA_MAX_NODES __CPROVER_JSA_MAX_CONCRETE_NODES+\ …
52#ifndef __CPROVER_JSA_MAX_ABSTRACT_RANGES
53#define __CPROVER_JSA_MAX_ABSTRACT_RANGES __CPROVER_JSA_MAX_ABSTRACT_NODES
55#ifndef __CPROVER_JSA_MAX_ITERATORS
56#define __CPROVER_JSA_MAX_ITERATORS 100u
58#ifndef __CPROVER_JSA_MAX_LISTS
59#define __CPROVER_JSA_MAX_LISTS __CPROVER_JSA_MAX_ITERATORS
61#ifndef __CPROVER_JSA_MAX_NODES_PER_CE_LIST
62#define __CPROVER_JSA_MAX_NODES_PER_CE_LIST __CPROVER_JSA_MAX_NODES
64#if __CPROVER_JSA_MAX_LISTS < 1
65#error "JSA needs at least one list variable for analysis."
67#if __CPROVER_JSA_MAX_ABSTRACT_NODES!=0
68#error "Currently in concrete-mode only."
80#define __CPROVER_jsa_null 0xFF
81#define __CPROVER_jsa_word_max 0xFF
133#if __CPROVER_JSA_MAX_ABSTRACT_NODES > 0
140#if __CPROVER_JSA_MAX_ABSTRACT_NODES > 0
167#define __CPROVER_jsa_inline
169#define __CPROVER_jsa_inline static inline
173#define __CPROVER_jsa_assume(c) __CPROVER_assume(c)
174#define __CPROVER_jsa_assert(c, str) __CPROVER_assert(c, str)
176#define __CPROVER_jsa_assume(c) \
179 longjmp(__CPROVER_jsa_jump_buffer, 1);\
176#define __CPROVER_jsa_assume(c) \ …
182#define __CPROVER_jsa_assert(c, str) assert((c) && str)
187#define __CPROVER_jsa__internal_are_heaps_equal(lhs, rhs) (*(lhs) == *(rhs))
194#if 0 < __CPROVER_JSA_MAX_ABSTRACT_NODES
206#if 0 < __CPROVER_JSA_MAX_ABSTRACT_RANGES
250#define __CPROVER_jsa__internal_get_head_node(heap_ptr, list) \
251 (heap_ptr)->list_head_nodes[list]
250#define __CPROVER_jsa__internal_get_head_node(heap_ptr, list) \ …
253#define __CPROVER_jsa__internal_is_concrete_node(node) \
254 (node < __CPROVER_JSA_MAX_CONCRETE_NODES)
253#define __CPROVER_jsa__internal_is_concrete_node(node) \ …
256#define __CPROVER_jsa__internal_is_abstract_node(node) \
257 (!__CPROVER_jsa__internal_is_concrete_node(node))
256#define __CPROVER_jsa__internal_is_abstract_node(node) \ …
259#define __CPROVER_jsa__internal_get_abstract_node_index(node) \
260 (node - __CPROVER_JSA_MAX_CONCRETE_NODES)
259#define __CPROVER_jsa__internal_get_abstract_node_index(node) \ …
262#define __CPROVER_jsa__internal_get_abstract_node_id(node_index) \
263 (__CPROVER_JSA_MAX_CONCRETE_NODES + node_index)
262#define __CPROVER_jsa__internal_get_abstract_node_id(node_index) \ …
265#define __CPROVER_jsa__internal_get_list(heap_ptr, node) \
266 (__CPROVER_jsa_null == node ? __CPROVER_jsa_null :\
267 __CPROVER_jsa__internal_is_concrete_node(node) ?\
268 (heap_ptr)->concrete_nodes[node].list:(heap_ptr)->abstract_nodes[node].list)
265#define __CPROVER_jsa__internal_get_list(heap_ptr, node) \ …
274#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
290#define __CPROVER_jsa__internal_get_next(heap_ptr, node) \
291 (__CPROVER_jsa__internal_is_concrete_node(node) ?\
292 (heap_ptr)->concrete_nodes[node].next:\
293 (heap_ptr)->abstract_nodes[\
294 __CPROVER_jsa__internal_get_abstract_node_index(node)].next)
290#define __CPROVER_jsa__internal_get_next(heap_ptr, node) \ …
300#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
316#define __CPROVER_jsa__internal_get_previous(heap_ptr, node) \
317 (__CPROVER_jsa__internal_is_concrete_node(node) ?\
318 (heap_ptr)->concrete_nodes[node].previous:\
319 (heap_ptr)->abstract_nodes[\
320 __CPROVER_jsa__internal_get_abstract_node_index(node)].previous)
316#define __CPROVER_jsa__internal_get_previous(heap_ptr, node) \ …
325#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
359#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
361 heap->iterators[it].index=0;
362 heap->iterators[it].previous_index=0;
373#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
384#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
399#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
427#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
450#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
458 heap->abstract_ranges[value_ref].size - 1;
471#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
513#ifdef __CPROVER_JSA_DYNAMIC_TEST_RUNNER
520#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
531#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
544#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
554#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
563 if(list >=
h->list_count)
602#if 0 < __CPROVER_JSA_MAX_ABSTRACT_NODES
616#if 0 < __CPROVER_JSA_MAX_ABSTRACT_RANGES
636 if(it >=
h->iterator_count)
667#if 0 < __CPROVER_JSA_MAX_ABSTRACT_NODES
683#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
698#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
702 ++
heap->iterator_count;
725#define __CPROVER_jsa_hasNext(heap, it)\
726 __CPROVER_jsa_null!=(heap)->iterators[it].node_id
725#define __CPROVER_jsa_hasNext(heap, it)\ …
731#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
736 heap->iterators[it].node_id=
heap->concrete_nodes[node_id].next;
737 heap->iterators[it].previous_node_id=node_id;
747#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
750 heap->iterators[it].previous_node_id;
751 heap->iterators[it].node_id=
763#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
781#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
832#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
845#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
858#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
872#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
887#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
901#ifdef __CPROVER_JSA_DEFINE_TRANSFORMERS
913#ifdef JSA_SYNTHESIS_H_
915#ifndef __CPROVER_JSA_NUM_PRED_OPS
916#define __CPROVER_JSA_NUM_PRED_OPS 10
918#ifndef __CPROVER_JSA_NUM_PRED_RESULT_OPS
919#define __CPROVER_JSA_NUM_PRED_RESULT_OPS __CPROVER_JSA_NUM_PRED_OPS
921#ifndef __CPROVER_JSA_MAX_QUERY_SIZE
922#define __CPROVER_JSA_MAX_QUERY_SIZE 10
924#ifndef __CPROVER_JSA_MAX_PRED_SIZE
925#define __CPROVER_JSA_MAX_PRED_SIZE (__CPROVER_JSA_MAX_QUERY_SIZE - 1)
927#ifndef __CPROVER_JSA_NUM_PREDS
928#define __CPROVER_JSA_NUM_PREDS (__CPROVER_JSA_MAX_QUERY_SIZE - 1)
971#define __CPROVER_JSA_NUM_PRED_INSTRUCTIONS 8u
980 "__CPROVER_JSA_PRED_OPS_COUNT <= __CPROVER_JSA_NUM_PRED_OPS");
983 "__CPROVER_JSA_PRED_RESULT_OPS_COUNT <= __CPROVER_JSA_NUM_PRED_RESULT_OPS");
1002 switch (
instr.opcode)
1041#define __CPROVER_jsa_execute_pred_op0_ptr __CPROVER_JSA_PRED_OPS[instr.op0]
1042#define __CPROVER_jsa_execute_pred_op1_ptr __CPROVER_JSA_PRED_OPS[instr.op1]
1043#define __CPROVER_jsa_execute_pred_result_op_ptr \
1044 __CPROVER_JSA_PRED_RESULT_OPS[instr.result_op]
1045#define __CPROVER_jsa_execute_pred_op0 *__CPROVER_jsa_execute_pred_op0_ptr
1046#define __CPROVER_jsa_execute_pred_op1 *__CPROVER_jsa_execute_pred_op1_ptr
1047#define __CPROVER_jsa_execute_pred_result \
1048 *__CPROVER_jsa_execute_pred_result_op_ptr
1049 switch (
instr.opcode)
1110#ifdef __CPROVER_JSA_DYNAMIC_TEST_RUNNER
1117#define __CPROVER_jsa__internal_lambda_op_id 0
1118#define FILTER_QUERY_INSTR_ID 0
1214#define __CPROVER_JSA_NUM_QUERY_INSTRUCTIONS 3u
1233 switch(
instr.opcode)
1327#define __CPROVER_JSA_NUM_INV_INSTRUCTIONS 1u
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
static __CPROVER_jsa_word_t __CPROVER_jsa_div(const __CPROVER_jsa_word_t lhs, const __CPROVER_jsa_word_t rhs)
static void __CPROVER_jsa_add(__CPROVER_jsa_abstract_heapt *const heap, const __CPROVER_jsa_list_id_t list, const __CPROVER_jsa_word_t value)
#define __CPROVER_JSA_MAX_ABSTRACT_RANGES
#define __CPROVER_JSA_MAX_ITERATORS
__CPROVER_jsa_word_t __CPROVER_jsa_data_t
static _Bool __CPROVER_jsa__internal_is_valid_node_id(const __CPROVER_jsa_node_id_t node_id)
#define __CPROVER_jsa_word_max
unsigned char __CPROVER_jsa_word_t
static __CPROVER_jsa_node_id_t __CPROVER_jsa__internal_remove(__CPROVER_jsa_abstract_heapt *const heap, const __CPROVER_jsa_node_id_t node_id_to_remove)
__CPROVER_jsa_id_t __CPROVER_jsa_iterator_id_t
__CPROVER_jsa_id_t __CPROVER_jsa_node_id_t
static void __CPROVER_jsa_assume_new_list(const __CPROVER_jsa_abstract_heapt *const h, const __CPROVER_jsa_list_id_t list)
#define __CPROVER_jsa_inline
#define __CPROVER_jsa__internal_get_previous(heap_ptr, node)
static void __CPROVER_jsa__internal_assume_valid_iterator_linking(const __CPROVER_jsa_abstract_heapt *const h, const __CPROVER_jsa_list_id_t list, const __CPROVER_jsa_node_id_t node_id, const __CPROVER_jsa_index_t index)
static __CPROVER_jsa_word_t __CPROVER_jsa_mult(const __CPROVER_jsa_word_t lhs, const __CPROVER_jsa_word_t rhs)
static void __CPROVER_jsa_assume_valid_iterator(const __CPROVER_jsa_abstract_heapt *const h, const __CPROVER_jsa_iterator_id_t it)
static __CPROVER_jsa_index_t __CPROVER_jsa__internal_get_max_index(const __CPROVER_jsa_abstract_heapt *const heap, const __CPROVER_jsa_node_id_t node_id)
static __CPROVER_jsa_list_id_t __CPROVER_jsa_create_list(__CPROVER_jsa_abstract_heapt *const heap)
__CPROVER_jsa_word_t __CPROVER_jsa_index_t
struct __CPROVER_jsa_abstract_heap __CPROVER_jsa_abstract_heapt
static void __CPROVER_jsa__internal_assume_is_neighbour(const __CPROVER_jsa_abstract_heapt *const heap, const __CPROVER_jsa_node_id_t lhs_node_id, const __CPROVER_jsa_index_t lhs_index, const __CPROVER_jsa_node_id_t rhs_node_id, const __CPROVER_jsa_index_t rhs_index)
#define __CPROVER_JSA_MAX_ABSTRACT_NODES
static __CPROVER_jsa_word_t __CPROVER_jsa_ite(const __CPROVER_jsa_word_t res, const __CPROVER_jsa_word_t lhs, const __CPROVER_jsa_word_t rhs)
static void __CPROVER_jsa__internal_make_null(__CPROVER_jsa_abstract_heapt *const heap, const __CPROVER_jsa_iterator_id_t it)
static void __CPROVER_jsa__internal_set_next(__CPROVER_jsa_abstract_heapt *const heap, const __CPROVER_jsa_node_id_t node, const __CPROVER_jsa_node_id_t next_node)
static _Bool __CPROVER_jsa__internal_is_in_valid_list(const __CPROVER_jsa_abstract_heapt *const heap, const __CPROVER_jsa_node_id_t node_id)
#define __CPROVER_jsa__internal_get_abstract_node_index(node)
#define __CPROVER_JSA_MAX_NODES_PER_CE_LIST
#define __CPROVER_JSA_MAX_LISTS
#define __CPROVER_jsa__internal_is_concrete_node(node)
#define __CPROVER_jsa__internal_get_list(heap_ptr, node)
#define __CPROVER_jsa__internal_get_next(heap_ptr, node)
#define __CPROVER_jsa_extern
#define __CPROVER_jsa_assert(c, str)
#define __CPROVER_jsa__internal_get_head_node(heap_ptr, list)
#define __CPROVER_jsa_null
#define __CPROVER_jsa_assume(c)
static __CPROVER_jsa_word_t __CPROVER_jsa_minus(const __CPROVER_jsa_word_t lhs, const __CPROVER_jsa_word_t rhs)
static void __CPROVER_jsa__internal_set_previous(__CPROVER_jsa_abstract_heapt *const heap, const __CPROVER_jsa_node_id_t node, const __CPROVER_jsa_node_id_t previous_node)
static __CPROVER_jsa_word_t __CPROVER_jsa_mod(const __CPROVER_jsa_word_t lhs, const __CPROVER_jsa_word_t rhs)
static _Bool __CPROVER_jsa__internal_are_heaps_equal(const __CPROVER_jsa_abstract_heapt *const lhs, const __CPROVER_jsa_abstract_heapt *const rhs)
#define __CPROVER_jsa__internal_get_abstract_node_id(node_index)
__CPROVER_jsa_word_t __CPROVER_jsa__internal_index_t
static void __CPROVER_jsa_assume_valid_heap(const __CPROVER_jsa_abstract_heapt *const h)
static __CPROVER_jsa_data_t __CPROVER_jsa_next(__CPROVER_jsa_abstract_heapt *const heap, const __CPROVER_jsa_iterator_id_t it)
char __CPROVER_jsa_signed_word_t
struct __CPROVER_jsa_concrete_node __CPROVER_jsa_concrete_nodet
Concrete node with explicit value.
struct __CPROVER_jsa_abstract_node __CPROVER_jsa_abstract_nodet
Abstract nodes may assume any of a set of pre-defined values (value_ref to abstract_ranget).
static void __CPROVER_jsa_set(__CPROVER_jsa_abstract_heapt *const heap, const __CPROVER_jsa_iterator_id_t it, const __CPROVER_jsa_word_t value)
static void __CPROVER_jsa_remove(__CPROVER_jsa_abstract_heapt *const heap, const __CPROVER_jsa_iterator_id_t it)
__CPROVER_jsa_id_t __CPROVER_jsa_list_id_t
struct __CPROVER_jsa_iterator __CPROVER_jsa_iteratort
Iterators point to a node and give the relative index within that node.
static void __CPROVER_jsa__internal_assume_linking_correct(const __CPROVER_jsa_abstract_heapt *const heap, const __CPROVER_jsa_node_id_t node_id, const __CPROVER_jsa_node_id_t prev, const __CPROVER_jsa_node_id_t next)
#define __CPROVER_JSA_MAX_NODES
static void __CPROVER_jsa_assume_valid_list(const __CPROVER_jsa_abstract_heapt *const h, const __CPROVER_jsa_list_id_t list)
#define __CPROVER_JSA_MAX_CONCRETE_NODES
jmp_buf __CPROVER_jsa_jump_buffer
struct __CPROVER_jsa_abstract_range __CPROVER_jsa_abstract_ranget
Set of pre-defined, possible values for abstract nodes.
__CPROVER_jsa_word_t __CPROVER_jsa_id_t
static __CPROVER_jsa_word_t __CPROVER_jsa_plus(const __CPROVER_jsa_word_t lhs, const __CPROVER_jsa_word_t rhs)
__CPROVER_jsa_index_t iterator_count
Number of iterators on the heap.
__CPROVER_jsa_concrete_nodet concrete_nodes[100u]
__CPROVER_jsa_index_t list_count
Number of lists on the heap.
__CPROVER_jsa_abstract_nodet abstract_nodes[100u]
__CPROVER_jsa_list_id_t list_head_nodes[100u]
Set of node ids which are list heads.
__CPROVER_jsa_iteratort iterators[100u]
__CPROVER_jsa_abstract_ranget abstract_ranges[100u]
Abstract nodes may assume any of a set of pre-defined values (value_ref to abstract_ranget).
__CPROVER_jsa_node_id_t previous
__CPROVER_jsa_id_t value_ref
__CPROVER_jsa_node_id_t next
__CPROVER_jsa_list_id_t list
Set of pre-defined, possible values for abstract nodes.
__CPROVER_jsa_index_t size
Concrete node with explicit value.
__CPROVER_jsa_list_id_t list
__CPROVER_jsa_data_t value
__CPROVER_jsa_node_id_t previous
__CPROVER_jsa_node_id_t next
Iterators point to a node and give the relative index within that node.
__CPROVER_jsa_node_id_t previous_node_id
__CPROVER_jsa_list_id_t list
__CPROVER_jsa_index_t index
__CPROVER_jsa_index_t previous_index
__CPROVER_jsa_node_id_t node_id