fix a bug about get_reads_from_value
authorweiyu <weiyuluo1232@gmail.com>
Mon, 12 Aug 2019 22:27:52 +0000 (15:27 -0700)
committerweiyu <weiyuluo1232@gmail.com>
Mon, 12 Aug 2019 22:27:52 +0000 (15:27 -0700)
action.cc
action.h

index b9df297ebaf18197d5c9adc2922fcbb4c3d83835..b654a35422a6cb3533a3236159d9048f5ab661a7 100644 (file)
--- a/action.cc
+++ b/action.cc
@@ -40,6 +40,7 @@ ModelAction::ModelAction(action_type_t type, memory_order order, void *loc,
        cv(NULL),
        rf_cv(NULL),
        value(value),
+       reads_from_value(VALUE_NONE),
        type(type),
        order(order),
        original_order(order),
@@ -72,6 +73,7 @@ ModelAction::ModelAction(action_type_t type, memory_order order, uint64_t value,
        cv(NULL),
        rf_cv(NULL),
        value(value),
+        reads_from_value(VALUE_NONE),
        type(type),
        order(order),
        original_order(order),
@@ -103,6 +105,7 @@ ModelAction::ModelAction(action_type_t type, memory_order order, void *loc,
        cv(NULL),
        rf_cv(NULL),
        value(value),
+        reads_from_value(VALUE_NONE),
        type(type),
        order(order),
        original_order(order),
@@ -138,6 +141,7 @@ ModelAction::ModelAction(action_type_t type, const char * position, memory_order
        cv(NULL),
        rf_cv(NULL),
        value(value),
+        reads_from_value(VALUE_NONE),
        type(type),
        order(order),
        original_order(order),
@@ -174,6 +178,7 @@ ModelAction::ModelAction(action_type_t type, const char * position, memory_order
        cv(NULL),
        rf_cv(NULL),
        value(value),
+        reads_from_value(VALUE_NONE),
        type(type),
        order(order),
        original_order(order),
@@ -184,7 +189,6 @@ ModelAction::ModelAction(action_type_t type, const char * position, memory_order
 
        Thread *t = thread ? thread : thread_current();
        this->tid = t->get_id();
-       // model_print("position: %s\n", position);
 }
 
 
@@ -572,8 +576,12 @@ void ModelAction::set_try_lock(bool obtainedlock)
 uint64_t ModelAction::get_reads_from_value() const
 {
        ASSERT(is_read());
-       if (reads_from)
-               return reads_from->get_write_value();
+       if (reads_from) {
+               if (reads_from->is_uninitialized())
+                       return reads_from_value;
+               else
+                       return reads_from->get_write_value();
+       }
 
        return VALUE_NONE;      // Only for new actions with no reads-from
 }
@@ -624,12 +632,12 @@ void ModelAction::set_read_from(ModelAction *act)
        ASSERT(act);
 
        reads_from = act;
-
        if (act->is_uninitialized()) {  // WL
                uint64_t val = *((uint64_t *) location);
                ModelAction * act_uninitialized = (ModelAction *)act;
                act_uninitialized->set_value(val);
                reads_from = act_uninitialized;
+               reads_from_value = val;
 
 // disabled by WL, because LLVM IR is unable to detect atomic init
 /*             model->assert_bug("May read from uninitialized atomic:\n"
index 00289355be9db60dd14c4cec2eace3381ac2e79a..fafa27cd1f4e68cee555917005f6e06af366c3cc 100644 (file)
--- a/action.h
+++ b/action.h
@@ -224,6 +224,10 @@ private:
        /** @brief The value written (for write or RMW; undefined for read) */
        uint64_t value;
 
+       /** @brief The value this action read from (only used when reads_from is an
+        *  uninitialized action)  */
+       uint64_t reads_from_value;
+
        /** @brief Type of action (read, write, RMW, fence, thread create, etc.) */
        action_type type;