move code around
[c11tester.git] / funcnode.cc
index 2da1f66d200df993f16989e1f258a03cfd502286..6233d3f3fc882db027f8c0eee6cbbfb8fbcb39b9 100644 (file)
@@ -1,13 +1,11 @@
 #include "funcnode.h"
-#include "predicate.h"
 
 FuncNode::FuncNode() :
+       predicate_tree_initialized(false),
        func_inst_map(),
        inst_list(),
        entry_insts(),
-       thrd_read_map(),
-       write_history(),
-       write_locations()
+       thrd_read_map()
 {}
 
 /* Check whether FuncInst with the same type, position, and location
@@ -15,7 +13,7 @@ FuncNode::FuncNode() :
  * if not, add it and return it.
  *
  * @return FuncInst with the same type, position, and location as act */
-FuncInst * FuncNode::get_or_add_action(ModelAction *act)
+FuncInst * FuncNode::get_or_add_inst(ModelAction *act)
 {
        ASSERT(act);
        const char * position = act->get_position();
@@ -63,45 +61,54 @@ void FuncNode::add_entry_inst(FuncInst * inst)
        if (inst == NULL)
                return;
 
-       func_inst_list_mt::iterator it;
-       for (it = entry_insts.begin();it != entry_insts.end();it++) {
-               if (inst == *it)
+       mllnode<FuncInst*>* it;
+       for (it = entry_insts.begin(); it != NULL; it = it->getNext()) {
+               if (inst == it->getVal())
                        return;
        }
 
        entry_insts.push_back(inst);
 }
 
-/* @param inst_list a list of FuncInsts; this argument comes from ModelExecution
- * Link FuncInsts in a list - add one FuncInst to another's predecessors and successors
+/* @param act_list a list of ModelActions; this argument comes from ModelExecution
+ * convert act_inst to inst_list do linking - add one FuncInst to another's predecessors and successors
  */
-void FuncNode::link_insts(func_inst_list_t * inst_list)
+void FuncNode::update_inst_tree(action_list_t * act_list)
 {
-       if (inst_list == NULL)
+       if (act_list == NULL)
+               return;
+       else if (act_list->size() == 0)
                return;
 
-       func_inst_list_t::iterator it = inst_list->begin();
-       func_inst_list_t::iterator prev;
+       /* build inst_list from act_list for later processing */
+       func_inst_list_t inst_list;
+       for (sllnode<ModelAction *> * it = act_list->begin(); it != NULL; it = it->getNext()) {
+               ModelAction * act = it->getVal();
+               FuncInst * func_inst = get_or_add_inst(act);
 
-       if (inst_list->size() == 0)
-               return;
+               if (func_inst != NULL)
+                       inst_list.push_back(func_inst);
+       }
+
+       /* start linking */
+       sllnode<FuncInst *>* it = inst_list.begin();
+       sllnode<FuncInst *>* prev;
 
        /* add the first instruction to the list of entry insts */
-       FuncInst * entry_inst = *it;
+       FuncInst * entry_inst = it->getVal();
        add_entry_inst(entry_inst);
 
-       it++;
-       while (it != inst_list->end()) {
-               prev = it;
-               prev--;
+       it = it->getNext();
+       while (it != NULL) {
+               prev = it->getPrev();
 
-               FuncInst * prev_inst = *prev;
-               FuncInst * curr_inst = *it;
+               FuncInst * prev_inst = prev->getVal();
+               FuncInst * curr_inst = it->getVal();
 
                prev_inst->add_succ(curr_inst);
                curr_inst->add_pred(prev_inst);
 
-               it++;
+               it = it->getNext();
        }
 }
 
@@ -118,7 +125,7 @@ void FuncNode::store_read(ModelAction * act, uint32_t tid)
        uint32_t old_size = thrd_read_map.size();
        if (old_size <= tid) {
                thrd_read_map.resize(tid + 1);
-               for (uint32_t i = old_size; i < tid + 1; i++)
+               for (uint32_t i = old_size; i < tid + 1;i++)
                        thrd_read_map[i] = new read_map_t();
        }
 
@@ -156,22 +163,53 @@ void FuncNode::clear_read_map(uint32_t tid)
        thrd_read_map[tid]->reset();
 }
 
-void FuncNode::add_to_write_history(void * location, uint64_t write_val)
+void FuncNode::init_predicate_tree(func_inst_list_t * inst_list)
 {
-       write_set_t * write_set = write_history.get(location);
+       if (inst_list == NULL || inst_list->size() == 0)
+               return;
 
-       if (write_set == NULL) {
-               write_set = new write_set_t();
-               write_history.put(location, write_set);
-       }
+       if (predicate_tree_initialized)
+               return;
+
+       predicate_tree_initialized = true;
+
+       // maybe restrict the size of hashtable to save calloc time
+       HashTable<void *, FuncInst *, uintptr_t, 4> loc_inst_map;
+
+       sllnode<FuncInst *> *it = inst_list->begin();
+       sllnode<FuncInst *> *prev;
+
+       FuncInst * entry_inst = it->getVal();
+
+       /* entry instruction has no predicate expression */
+       Predicate * pred_entry = new Predicate(entry_inst);
+       loc_inst_map.put(entry_inst->get_location(), entry_inst);
+
+       it = it->getNext();
+       while (it != NULL) {
+               prev = it->getPrev();
+
+               FuncInst * curr_inst = it->getVal();
+               FuncInst * prev_inst = prev->getVal();
 
-       write_set->add(write_val);
-       write_locations.add(location);
+               if ( loc_inst_map.contains(curr_inst->get_location()) ) {
+                       Predicate * pred1 = new Predicate(curr_inst);
+                       pred1->add_predicate(EQUALITY, curr_inst->get_location(), 0);
+
+                       Predicate * pred2 = new Predicate(curr_inst);
+                       pred2->add_predicate(EQUALITY, curr_inst->get_location(), 1);
+               }
+
+               loc_inst_map.put(curr_inst->get_location(), curr_inst);
+
+               it = it->getNext();
+       }
 }
 
+
 void FuncNode::generate_predicate(FuncInst *func_inst)
 {
-       
+
 }
 
 /* @param tid thread id
@@ -182,42 +220,13 @@ void FuncNode::print_last_read(uint32_t tid)
        ASSERT(thrd_read_map.size() > tid);
        read_map_t * read_map = thrd_read_map[tid];
 /*
-       ModelList<void *>::iterator it;
-       for (it = read_locations.begin();it != read_locations.end();it++) {
-               if ( !read_map->contains(*it) )
+       mllnode<void *> * it;
+       for (it = read_locations.begin();it != NULL;it=it->getNext()) {
+               if ( !read_map->contains(it->getVal()) )
                        break;
 
-               uint64_t read_val = read_map->get(*it);
-               model_print("last read of thread %d at %p: 0x%x\n", tid, *it, read_val);
+               uint64_t read_val = read_map->get(it->getVal());
+               model_print("last read of thread %d at %p: 0x%x\n", tid, it->getVal(), read_val);
        }
 */
 }
-
-void FuncNode::print_write()
-{
-       HSIterator<void *, uintptr_t, 4, model_malloc, model_calloc, model_free> * iter;
-       HSIterator<uint64_t, uint64_t, 0, model_malloc, model_calloc, model_free> * write_iter;
-       iter = write_locations.iterator();
-
-       if (write_locations.getSize() > 10) {
-               while (iter->hasNext()) {
-                       void * location = iter->next();
-                       write_set_t * write_set = write_history.get(location);
-
-//                     model_print("location: %p contains %d writes\n", location, write_set->getSize());
-                       if (write_set->getSize() > 5) {
-                               model_print("location %p has writes: ", location);
-                               write_iter = write_set->iterator();
-
-                               while (write_iter->hasNext()) {
-                                       uint64_t val = write_iter->next();
-                                       model_print("%lx ", val);
-                               }
-                               model_print("\n");
-                       }
-               }
-       } else {
-               model_print("\n");
-       }
-       delete iter;
-}