X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=action.cc;h=b3db1f16280f58e234fcd9484c11b7e204671126;hp=9c0e29920e362f5d2a2fa7d3681077dad4b7690a;hb=b796e8fd2555099af225ee1c3f9194bc14f6fa15;hpb=63b2c687570085f2a87b6a659d26608228af1ee0 diff --git a/action.cc b/action.cc index 9c0e2992..b3db1f16 100644 --- a/action.cc +++ b/action.cc @@ -31,8 +31,8 @@ * @param thread (optional) The Thread in which this action occurred. If NULL * (default), then a Thread is assigned according to the scheduler. */ -ModelAction::ModelAction(action_type_t type, memory_order order, void *loc, - uint64_t value, Thread *thread) : +ModelAction::ModelAction(action_type_t type, memory_order order, void *loc, + uint64_t value, Thread *thread) : location(loc), reads_from(NULL), last_fence_release(NULL), @@ -45,7 +45,7 @@ ModelAction::ModelAction(action_type_t type, memory_order order, void *loc, seq_number(ACTION_INITIAL_CLOCK) { /* References to NULL atomic variables can end up here */ - ASSERT(loc || type == ATOMIC_FENCE); + ASSERT(loc || type == ATOMIC_FENCE || type == NOOP); Thread *t = thread ? thread : thread_current(); this->tid = t->get_id(); @@ -65,7 +65,7 @@ ModelAction::ModelAction(action_type_t type, memory_order order, void *loc, * (default), then a Thread is assigned according to the scheduler. */ ModelAction::ModelAction(action_type_t type, memory_order order, void *loc, - uint64_t value, int size) : + uint64_t value, int size) : location(loc), reads_from(NULL), last_fence_release(NULL), @@ -84,6 +84,43 @@ ModelAction::ModelAction(action_type_t type, memory_order order, void *loc, this->tid = t->get_id(); } + +/** + * @brief Construct a new ModelAction with source line number (requires llvm support) + * + * @param type The type of action + * @param position The source line number of this atomic operation + * @param order The memory order of this action. A "don't care" for non-ATOMIC + * actions (e.g., THREAD_* or MODEL_* actions). + * @param loc The location that this action acts upon + * @param value (optional) A value associated with the action (e.g., the value + * read or written). Defaults to a given macro constant, for debugging purposes. + * @param thread (optional) The Thread in which this action occurred. If NULL + * (default), then a Thread is assigned according to the scheduler. + */ +ModelAction::ModelAction(action_type_t type, const char * position, memory_order order, + void *loc, uint64_t value, Thread *thread) : + location(loc), + position(position), + reads_from(NULL), + last_fence_release(NULL), + node(NULL), + cv(NULL), + value(value), + type(type), + order(order), + original_order(order), + seq_number(ACTION_INITIAL_CLOCK) +{ + /* References to NULL atomic variables can end up here */ + ASSERT(loc || type == ATOMIC_FENCE); + + Thread *t = thread ? thread : thread_current(); + this->tid = t->get_id(); + // model_print("position: %s\n", position); +} + + /** @brief ModelAction destructor */ ModelAction::~ModelAction() { @@ -465,6 +502,7 @@ uint64_t ModelAction::get_reads_from_value() const ASSERT(is_read()); if (reads_from) return reads_from->get_write_value(); + return VALUE_NONE; // Only for new actions with no reads-from }