#include "funcnode.h"
+#include "predicate.h"
FuncNode::FuncNode() :
func_inst_map(),
inst_list(),
entry_insts(),
+ thrd_read_map(),
read_locations()
{}
-/* Check whether FuncInst with the same type, position, and location
+/* Check whether FuncInst with the same type, position, and location
* as act has been added to func_inst_map or not. If so, return it;
* if not, add it and return it.
*
func_inst = new FuncInst(act, this);
inst->get_collisions()->push_back(func_inst);
- inst_list.push_back(func_inst); // delete?
+ inst_list.push_back(func_inst); // delete?
return func_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
+ */
+void FuncNode::link_insts(func_inst_list_t * inst_list)
+{
+ if (inst_list == NULL)
+ return;
+
+ sllnode<FuncInst *>* it = inst_list->begin();
+ sllnode<FuncInst *>* prev;
+
+ if (inst_list->size() == 0)
+ return;
+
+ /* add the first instruction to the list of entry insts */
+ FuncInst * entry_inst = it->getVal();
+ add_entry_inst(entry_inst);
+
+ it=it->getNext();
+ while (it != NULL) {
+ prev = it;
+ prev = it->getPrev();
+
+ FuncInst * prev_inst = prev->getVal();
+ FuncInst * curr_inst = it->getVal();
+
+ prev_inst->add_succ(curr_inst);
+ curr_inst->add_pred(prev_inst);
+
+ it=it->getNext();
+ }
+}
+
/* @param tid thread id
* Store the values read by atomic read actions into thrd_read_map */
void FuncNode::store_read(ModelAction * act, uint32_t tid)
void * location = act->get_location();
uint64_t read_from_val = act->get_reads_from_value();
- if (thrd_read_map.size() <= tid)
+ /* resize and initialize */
+ uint32_t old_size = thrd_read_map.size();
+ if (old_size <= tid) {
thrd_read_map.resize(tid + 1);
-
- read_map_t * read_map = thrd_read_map[tid];
- if (read_map == NULL) {
- read_map = new read_map_t();
- thrd_read_map[tid] = read_map;
+ for (uint32_t i = old_size;i < tid + 1;i++)
+ thrd_read_map[i] = new read_map_t();
}
+ read_map_t * read_map = thrd_read_map[tid];
read_map->put(location, read_from_val);
/* Store the memory locations where atomic reads happen */
bool push_loc = true;
- ModelList<void *>::iterator it;
- for (it = read_locations.begin(); it != read_locations.end(); it++) {
- if (location == *it) {
+ mllnode<void *> * it;
+ for (it = read_locations.begin();it != NULL;it=it->getNext()) {
+ if (location == it->getVal()) {
push_loc = false;
break;
}
read_locations.push_back(location);
}
-uint64_t FuncNode::query_last_read(ModelAction * act, uint32_t tid)
+uint64_t FuncNode::query_last_read(void * location, uint32_t tid)
{
if (thrd_read_map.size() <= tid)
return 0xdeadbeef;
read_map_t * read_map = thrd_read_map[tid];
- void * location = act->get_location();
/* last read value not found */
if ( !read_map->contains(location) )
*/
void FuncNode::clear_read_map(uint32_t tid)
{
- ASSERT(thrd_read_map.size() > tid);
+ if (thrd_read_map.size() <= tid)
+ return;
+
thrd_read_map[tid]->reset();
}
+void FuncNode::generate_predicate(FuncInst *func_inst)
+{
+
+}
+
/* @param tid thread id
- * Print the values read by the last read actions per memory location
+ * Print the values read by the last read actions for each memory location
*/
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);
}
}