change cds checker to accomdate llvm pass
[c11tester.git] / #cmodelint.cc#
1 #include "model.h"
2 #include "action.h"
3 #include "cmodelint.h"
4 #include "threads-model.h"
5
6 memory_order orders[6] = {
7         memory_order_relaxed, memory_order_consume, memory_order_acquire,
8         memory_order_release, memory_order_acq_rel, memory_order_seq_cst
9 };
10
11 /** Performs a read action.*/
12 uint64_t model_read_action(void * obj, memory_order ord) {
13         return model->switch_to_master(new ModelAction(ATOMIC_READ, ord, obj));
14 }
15
16 uint64_t model_read_action_helper(void * obj, int index) {
17         return model->switch_to_master(new ModelAction(ATOMIC_READ, orders[index], obj));
18 }
19 :q!
20
21 /** Performs a write action.*/
22 void model_write_action(void * obj, memory_order ord, uint64_t val) {
23         model->switch_to_master(new ModelAction(ATOMIC_WRITE, ord, obj, val));
24 }
25
26 void model_write_action_helper(void * obj, int index, uint64_t val) {
27         model->switch_to_master(new ModelAction(ATOMIC_WRITE, orders[index], obj, val));
28 }
29
30 /** Performs an init action. */
31 void model_init_action(void * obj, uint64_t val) {
32         model->switch_to_master(new ModelAction(ATOMIC_INIT, memory_order_relaxed, obj, val));
33 }
34 // do not need a helper function
35
36 /**
37  * Performs the read part of a RMW action. The next action must either be the
38  * write part of the RMW action or an explicit close out of the RMW action w/o
39  * a write.
40  */
41 uint64_t model_rmwr_action(void *obj, memory_order ord) {
42         return model->switch_to_master(new ModelAction(ATOMIC_RMWR, ord, obj));
43 }
44
45 uint64_t model_rmwr_action_helper(void *obj, int index) {
46         return model->switch_to_master(new ModelAction(ATOMIC_RMWR, orders[index], obj));
47 }
48
49 /** Performs the write part of a RMW action. */
50 void model_rmw_action(void *obj, memory_order ord, uint64_t val) {
51         model->switch_to_master(new ModelAction(ATOMIC_RMW, ord, obj, val));
52 }
53
54 void model_rmw_action_helper(void *obj, int index, uint64_t val) {
55         model->switch_to_master(new ModelAction(ATOMIC_RMW, orders[index], obj, val));
56 }
57
58 /** Closes out a RMW action without doing a write. */
59 void model_rmwc_action(void *obj, memory_order ord) {
60         model->switch_to_master(new ModelAction(ATOMIC_RMWC, ord, obj));
61 }
62
63 void model_rmwc_action_helper(void *obj, int index) {
64         model->switch_to_master(new ModelAction(ATOMIC_RMWC, orders[index], obj));
65 }
66
67 /** Issues a fence operation. */
68 void model_fence_action(memory_order ord) {
69         model->switch_to_master(new ModelAction(ATOMIC_FENCE, ord, FENCE_LOCATION));
70 }
71
72 void model_fence_action_helper(int index) {
73         model->switch_to_master(new ModelAction(ATOMIC_FENCE, orders[index], FENCE_LOCATION));
74 }