X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;ds=sidebyside;f=cmodelint.cc;h=a80e386cd230af5d835509b25be26b33b869b4b9;hb=8899359d333648c680e9a1aecf34b45a1eb6a201;hp=d3b64b156c79b72a27662e2fd6ab92ca3e1a01fc;hpb=1f9c3f15084ce33069f8070cbad83270265d50ea;p=c11tester.git diff --git a/cmodelint.cc b/cmodelint.cc index d3b64b15..a80e386c 100644 --- a/cmodelint.cc +++ b/cmodelint.cc @@ -10,7 +10,7 @@ #include "threads-model.h" #include "datarace.h" -memory_order orders[8] = { +memory_order orders[7] = { memory_order_relaxed, memory_order_consume, memory_order_acquire, memory_order_release, memory_order_acq_rel, memory_order_seq_cst, }; @@ -75,30 +75,30 @@ void model_fence_action(memory_order ord) { /* --- helper functions --- */ uint64_t model_rmwrcas_action_helper(void *obj, int atomic_index, uint64_t oldval, int size, const char *position) { ensureModel(); - return model->switch_to_master(new ModelAction(ATOMIC_RMWRCAS, position, orders[atomic_index], obj, oldval, size)); + return model->switch_thread(new ModelAction(ATOMIC_RMWRCAS, position, orders[atomic_index], obj, oldval, size)); } uint64_t model_rmwr_action_helper(void *obj, int atomic_index, const char *position) { ensureModel(); - return model->switch_to_master(new ModelAction(ATOMIC_RMWR, position, orders[atomic_index], obj)); + return model->switch_thread(new ModelAction(ATOMIC_RMWR, position, orders[atomic_index], obj)); } void model_rmw_action_helper(void *obj, uint64_t val, int atomic_index, const char * position) { ensureModel(); - model->switch_to_master(new ModelAction(ATOMIC_RMW, position, orders[atomic_index], obj, val)); + model->switch_thread(new ModelAction(ATOMIC_RMW, position, orders[atomic_index], obj, val)); } void model_rmwc_action_helper(void *obj, int atomic_index, const char *position) { ensureModel(); - model->switch_to_master(new ModelAction(ATOMIC_RMWC, position, orders[atomic_index], obj)); + model->switch_thread(new ModelAction(ATOMIC_RMWC, position, orders[atomic_index], obj)); } // cds volatile loads #define VOLATILELOAD(size) \ - uint ## size ## _t cds_volatile_load ## size(void * obj, const char * position) { \ - ensureModel(); \ - return (uint ## size ## _t) model->switch_to_master(new ModelAction(ATOMIC_READ, position, memory_order_relaxed, obj)); \ - } + uint ## size ## _t cds_volatile_load ## size(void * obj, const char * position) { \ + ensureModel(); \ + return (uint ## size ## _t)model->switch_thread(new ModelAction(ATOMIC_READ, position, memory_order_volatile_load, obj)); \ + } VOLATILELOAD(8) VOLATILELOAD(16) @@ -107,10 +107,15 @@ VOLATILELOAD(64) // cds volatile stores #define VOLATILESTORE(size) \ - void cds_volatile_store ## size (void * obj, uint ## size ## _t val, const char * position) { \ - ensureModel(); \ - model->switch_to_master(new ModelAction(ATOMIC_WRITE, position, memory_order_relaxed, obj, (uint64_t) val)); \ -} + void cds_volatile_store ## size (void * obj, uint ## size ## _t val, const char * position) { \ + ensureModel(); \ + model->switch_thread(new ModelAction(ATOMIC_WRITE, position, memory_order_volatile_store, obj, (uint64_t) val)); \ + *((volatile uint ## size ## _t *)obj) = val; \ + thread_id_t tid = thread_current()->get_id(); \ + for(int i=0;i < size / 8;i++) { \ + atomraceCheckWrite(tid, (void *)(((char *)obj)+i)); \ + } \ + } VOLATILESTORE(8) VOLATILESTORE(16) @@ -121,11 +126,11 @@ VOLATILESTORE(64) #define CDSATOMICINT(size) \ void cds_atomic_init ## size (void * obj, uint ## size ## _t val, const char * position) { \ ensureModel(); \ - model->switch_to_master(new ModelAction(ATOMIC_INIT, position, memory_order_relaxed, obj, (uint64_t) val)); \ - *((uint ## size ## _t *)obj) = val; \ + model->switch_thread(new ModelAction(ATOMIC_INIT, position, memory_order_relaxed, obj, (uint64_t) val)); \ + *((volatile uint ## size ## _t *)obj) = val; \ thread_id_t tid = thread_current()->get_id(); \ for(int i=0;i < size / 8;i++) { \ - recordWrite(tid, (void *)(((char *)obj)+i)); \ + atomraceCheckWrite(tid, (void *)(((char *)obj)+i)); \ } \ } @@ -138,8 +143,13 @@ CDSATOMICINT(64) #define CDSATOMICLOAD(size) \ uint ## size ## _t cds_atomic_load ## size(void * obj, int atomic_index, const char * position) { \ ensureModel(); \ - return (uint ## size ## _t)model->switch_to_master( \ + uint ## size ## _t val = (uint ## size ## _t)model->switch_thread( \ new ModelAction(ATOMIC_READ, position, orders[atomic_index], obj)); \ + thread_id_t tid = thread_current()->get_id(); \ + for(int i=0;i < size / 8;i++) { \ + atomraceCheckRead(tid, (void *)(((char *)obj)+i)); \ + } \ + return val; \ } CDSATOMICLOAD(8) @@ -151,11 +161,11 @@ CDSATOMICLOAD(64) #define CDSATOMICSTORE(size) \ void cds_atomic_store ## size(void * obj, uint ## size ## _t val, int atomic_index, const char * position) { \ ensureModel(); \ - model->switch_to_master(new ModelAction(ATOMIC_WRITE, position, orders[atomic_index], obj, (uint64_t) val)); \ - *((uint ## size ## _t *)obj) = val; \ + model->switch_thread(new ModelAction(ATOMIC_WRITE, position, orders[atomic_index], obj, (uint64_t) val)); \ + *((volatile uint ## size ## _t *)obj) = val; \ thread_id_t tid = thread_current()->get_id(); \ for(int i=0;i < size / 8;i++) { \ - recordWrite(tid, (void *)(((char *)obj)+i)); \ + atomraceCheckWrite(tid, (void *)(((char *)obj)+i)); \ } \ } @@ -172,12 +182,13 @@ CDSATOMICSTORE(64) uint ## size ## _t _val = val; \ _copy __op__ _val; \ model_rmw_action_helper(addr, (uint64_t) _copy, atomic_index, position); \ - *((uint ## size ## _t *)addr) = _copy; \ + *((volatile uint ## size ## _t *)addr) = _copy; \ thread_id_t tid = thread_current()->get_id(); \ for(int i=0;i < size / 8;i++) { \ + atomraceCheckRead(tid, (void *)(((char *)addr)+i)); \ recordWrite(tid, (void *)(((char *)addr)+i)); \ } \ - return _old; \ + return _old; \ }) // cds atomic exchange @@ -257,7 +268,7 @@ CDSATOMICXOR(64) uint ## size ## _t _old = model_rmwrcas_action_helper(addr, atomic_index, _expected, sizeof(_expected), position); \ if (_old == _expected) { \ model_rmw_action_helper(addr, (uint64_t) _desired, atomic_index, position); \ - *((uint ## size ## _t *)addr) = desired; \ + *((volatile uint ## size ## _t *)addr) = desired; \ thread_id_t tid = thread_current()->get_id(); \ for(int i=0;i < size / 8;i++) { \ recordWrite(tid, (void *)(((char *)addr)+i)); \ @@ -294,7 +305,7 @@ CDSATOMICCASV2(64) // cds atomic thread fence void cds_atomic_thread_fence(int atomic_index, const char * position) { - model->switch_to_master( + model->switch_thread( new ModelAction(ATOMIC_FENCE, position, orders[atomic_index], FENCE_LOCATION) ); } @@ -329,8 +340,8 @@ void cds_atomic_thread_fence(int atomic_index, const char * position) { */ void cds_func_entry(const char * funcName) { - if (!model) return; - +#ifdef NEWFUZZER + ensureModel(); Thread * th = thread_current(); uint32_t func_id; @@ -345,29 +356,34 @@ void cds_func_entry(const char * funcName) { ModelVector * func_map_rev = history->getFuncMapRev(); if ( func_map_rev->size() <= func_id ) func_map_rev->resize( func_id + 1 ); + func_map_rev->at(func_id) = funcName; } else { func_id = history->getFuncMap()->get(funcName); } history->enter_function(func_id, th->get_id()); +#endif } void cds_func_exit(const char * funcName) { - if (!model) return; +#ifdef NEWFUZZER + ensureModel(); Thread * th = thread_current(); uint32_t func_id; ModelHistory *history = model->get_history(); func_id = history->getFuncMap()->get(funcName); - - /* func_id not found; this could happen in the case where a function calls cds_func_entry - * when the model has been defined yet, but then an atomic inside the function initializes - * the model. And then cds_func_exit is called upon the function exiting. - */ +/* + * func_id not found; this could happen in the case where a function calls cds_func_entry + * when the model has been defined yet, but then an atomic inside the function initializes + * the model. And then cds_func_exit is called upon the function exiting. + * + */ if (func_id == 0) return; history->exit_function(func_id, th->get_id()); +#endif }