2 * @brief C interface to the model checker.
8 #include "memoryorder.h"
11 using std::memory_order;
15 uint64_t model_read_action(void * obj, memory_order ord);
16 void model_write_action(void * obj, memory_order ord, uint64_t val);
17 void model_init_action(void * obj, uint64_t val);
18 uint64_t model_rmwr_action(void *obj, memory_order ord);
19 uint64_t model_rmwrcas_action(void *obj, memory_order ord, uint64_t oval, int size);
20 void model_rmw_action(void *obj, memory_order ord, uint64_t val);
21 void model_rmwc_action(void *obj, memory_order ord);
22 void model_fence_action(memory_order ord);
24 // void model_init_action_helper(void * obj, uint64_t val);
25 uint64_t model_rmwr_action_helper(void *obj, int atomic_index);
26 void model_rmw_action_helper(void *obj, int atomic_index, uint64_t val);
27 void model_rmwc_action_helper(void *obj, int atomic_index);
28 void model_fence_action_helper(int atomic_index);
30 /* the following functions are used by llvm pass */
32 void cds_atomic_init8(void * obj, uint8_t val);
33 void cds_atomic_init16(void * obj, uint16_t val);
34 void cds_atomic_init32(void * obj, uint32_t val);
35 void cds_atomic_init64(void * obj, uint64_t val);
37 uint8_t cds_atomic_load8(void * obj, int atomic_index);
38 uint16_t cds_atomic_load16(void * obj, int atomic_index);
39 uint32_t cds_atomic_load32(void * obj, int atomic_index);
40 uint64_t cds_atomic_load64(void * obj, int atomic_index);
42 void cds_atomic_store8(void * obj, uint8_t val, int atomic_index);
43 void cds_atomic_store16(void * obj, uint16_t val, int atomic_index);
44 void cds_atomic_store32(void * obj, uint32_t val, int atomic_index);
45 void cds_atomic_store64(void * obj, uint64_t val, int atomic_index);
48 // cds atomic exchange
49 uint8_t cds_atomic_exchange8(void* addr, uint8_t val, int atomic_index);
50 uint16_t cds_atomic_exchange16(void* addr, uint16_t val, int atomic_index);
51 uint32_t cds_atomic_exchange32(void* addr, uint32_t val, int atomic_index);
52 uint64_t cds_atomic_exchange64(void* addr, uint64_t val, int atomic_index);
53 // cds atomic fetch add
54 uint8_t cds_atomic_fetch_add8(void* addr, uint8_t val, int atomic_index);
55 uint16_t cds_atomic_fetch_add16(void* addr, uint16_t val, int atomic_index);
56 uint32_t cds_atomic_fetch_add32(void* addr, uint32_t val, int atomic_index);
57 uint64_t cds_atomic_fetch_add64(void* addr, uint64_t val, int atomic_index);
58 // cds atomic fetch sub
59 uint8_t cds_atomic_fetch_sub8(void* addr, uint8_t val, int atomic_index);
60 uint16_t cds_atomic_fetch_sub16(void* addr, uint16_t val, int atomic_index);
61 uint32_t cds_atomic_fetch_sub32(void* addr, uint32_t val, int atomic_index);
62 uint64_t cds_atomic_fetch_sub64(void* addr, uint64_t val, int atomic_index);
63 // cds atomic fetch and
64 uint8_t cds_atomic_fetch_and8(void* addr, uint8_t val, int atomic_index);
65 uint16_t cds_atomic_fetch_and16(void* addr, uint16_t val, int atomic_index);
66 uint32_t cds_atomic_fetch_and32(void* addr, uint32_t val, int atomic_index);
67 uint64_t cds_atomic_fetch_and64(void* addr, uint64_t val, int atomic_index);
68 // cds atomic fetch or
69 uint8_t cds_atomic_fetch_or8(void* addr, uint8_t val, int atomic_index);
70 uint16_t cds_atomic_fetch_or16(void* addr, uint16_t val, int atomic_index);
71 uint32_t cds_atomic_fetch_or32(void* addr, uint32_t val, int atomic_index);
72 uint64_t cds_atomic_fetch_or64(void* addr, uint64_t val, int atomic_index);
73 // cds atomic fetch xor
74 uint8_t cds_atomic_fetch_xor8(void* addr, uint8_t val, int atomic_index);
75 uint16_t cds_atomic_fetch_xor16(void* addr, uint16_t val, int atomic_index);
76 uint32_t cds_atomic_fetch_xor32(void* addr, uint32_t val, int atomic_index);
77 uint64_t cds_atomic_fetch_xor64(void* addr, uint64_t val, int atomic_index);
79 // cds atomic compare and exchange (strong)
80 uint8_t cds_atomic_compare_exchange8_v1(void* addr, uint8_t expected,
81 uint8_t desire, int atomic_index_succ, int atomic_index_fail );
82 uint16_t cds_atomic_compare_exchange16_v1(void* addr, uint16_t expected,
83 uint16_t desire, int atomic_index_succ, int atomic_index_fail );
84 uint32_t cds_atomic_compare_exchange32_v1(void* addr, uint32_t expected,
85 uint32_t desire, int atomic_index_succ, int atomic_index_fail );
86 uint64_t cds_atomic_compare_exchange64_v1(void* addr, uint64_t expected,
87 uint64_t desire, int atomic_index_succ, int atomic_index_fail );
89 bool cds_atomic_compare_exchange8_v2(void* addr, uint8_t* expected,
90 uint8_t desired, int atomic_index_succ, int atomic_index_fail );
91 bool cds_atomic_compare_exchange16_v2(void* addr, uint16_t* expected,
92 uint16_t desired, int atomic_index_succ, int atomic_index_fail );
93 bool cds_atomic_compare_exchange32_v2(void* addr, uint32_t* expected,
94 uint32_t desired, int atomic_index_succ, int atomic_index_fail );
95 bool cds_atomic_compare_exchange64_v2(void* addr, uint64_t* expected,
96 uint64_t desired, int atomic_index_succ, int atomic_index_fail );
98 // cds atomic thread fence
99 void cds_atomic_thread_fence(int atomic_index);