From: weiyu Date: Thu, 8 Aug 2019 00:27:13 +0000 (-0700) Subject: restructrue code of funcnode.cc, and planning for adding back edges in predicate... X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=commitdiff_plain;h=332eb3dfeb0f0272f4dbe3a3b10a8ff4bf3bb188 restructrue code of funcnode.cc, and planning for adding back edges in predicate tree --- diff --git a/classlist.h b/classlist.h index c7c84759..855f05fd 100644 --- a/classlist.h +++ b/classlist.h @@ -2,6 +2,7 @@ #define CLASSLIST_H #include #include "stl-model.h" +#include "hashset.h" class ClockVector; class CycleGraph; @@ -16,12 +17,15 @@ class TraceAnalysis; class Fuzzer; class FuncNode; class FuncInst; +class Predicate; struct model_snapshot_members; struct bug_message; typedef SnapList action_list_t; typedef SnapList func_id_list_t; typedef SnapList func_inst_list_t; +typedef HSIterator PredSetIter; +typedef HashSet PredSet; extern volatile int modellock; #endif diff --git a/funcnode.cc b/funcnode.cc index a0f1f33b..7c146550 100644 --- a/funcnode.cc +++ b/funcnode.cc @@ -7,7 +7,8 @@ FuncNode::FuncNode() : inst_list(), entry_insts(), thrd_read_map(), - predicate_tree_entry() + predicate_tree_entry(), + inst_pred_map() {} /* Check whether FuncInst with the same type, position, and location @@ -133,7 +134,7 @@ void FuncNode::update_tree(action_list_t * act_list) } update_inst_tree(&inst_list); - init_predicate_tree(&read_inst_list, &read_val_map); + update_predicate_tree(&read_inst_list, &read_val_map); } /** @@ -220,16 +221,16 @@ void FuncNode::clear_read_map(uint32_t tid) thrd_read_map[tid]->reset(); } -void FuncNode::init_predicate_tree(func_inst_list_t * inst_list, HashTable * read_val_map) +void FuncNode::update_predicate_tree(func_inst_list_t * inst_list, HashTable * read_val_map) { if (inst_list == NULL || inst_list->size() == 0) return; - +/* if (predicate_tree_initialized) { return; } predicate_tree_initialized = true; - +*/ // maybe restrict the size of hashtable to save calloc time HashTable loc_inst_map(64); @@ -241,7 +242,6 @@ void FuncNode::init_predicate_tree(func_inst_list_t * inst_list, HashTablehasNext()) { Predicate * p = pit->next(); - p->get_func_inst()->print(); if (p->get_func_inst() == entry_inst) { curr_pred = p; break; @@ -249,6 +249,7 @@ void FuncNode::init_predicate_tree(func_inst_list_t * inst_list, HashTableset_entry_predicate(); predicate_tree_entry.add(curr_pred); } @@ -257,53 +258,7 @@ void FuncNode::init_predicate_tree(func_inst_list_t * inst_list, HashTablegetNext(); while (it != NULL) { FuncInst * curr_inst = it->getVal(); - bool branch_found = false; - - /* check if a branch with the same func_inst and corresponding predicate exists */ - ModelVector * branches = curr_pred->get_children(); - for (uint i = 0; i < branches->size(); i++) { - Predicate * branch = (*branches)[i]; - if (branch->get_func_inst() != curr_inst) - continue; - - PredExprSet * pred_expressions = branch->get_pred_expressions(); - - /* no predicate, follow the only branch */ - if (pred_expressions->getSize() == 0) { - model_print("no predicate exists: "); curr_inst->print(); - curr_pred = branch; - branch_found = true; - break; - } - - PredExprSetIter * pred_expr_it = pred_expressions->iterator(); - while (pred_expr_it->hasNext()) { - pred_expr * pred_expression = pred_expr_it->next(); - uint64_t last_read, curr_read; - FuncInst * last_inst; - bool equality; - - switch(pred_expression->token) { - case EQUALITY: - last_inst = loc_inst_map.get(curr_inst->get_location()); - last_read = read_val_map->get(last_inst); - curr_read = read_val_map->get(curr_inst); - equality = (last_read == curr_read); - if (equality == pred_expression->value) { - curr_pred = branch; - model_print("predicate: token: %d, location: %p, value: %d - ", pred_expression->token, pred_expression->location, pred_expression->value); curr_inst->print(); - branch_found = true; - } - break; - case NULLITY: - break; - default: - model_print("unkown predicate token\n"); - break; - } - } - - } + bool branch_found = follow_branch(&curr_pred, curr_inst, read_val_map, &loc_inst_map); if (!branch_found) { if ( loc_inst_map.contains(curr_inst->get_location()) ) { @@ -313,6 +268,7 @@ void FuncNode::init_predicate_tree(func_inst_list_t * inst_list, HashTableadd_predicate(EQUALITY, curr_inst->get_location(), false); + /* TODO: add to inst_pred_map */ curr_pred->add_child(new_pred1); curr_pred->add_child(new_pred2); @@ -334,10 +290,65 @@ void FuncNode::init_predicate_tree(func_inst_list_t * inst_list, HashTablegetNext(); } - model_print("function %s\n", func_name); - print_predicate_tree(); +// model_print("function %s\n", func_name); +// print_predicate_tree(); } +/* Given curr_pred and next_inst, find the branch following curr_pred that contains next_inst and the correct predicate + * @return true if branch found, false otherwise. + */ +bool FuncNode::follow_branch(Predicate ** curr_pred, FuncInst * next_inst, + HashTable * read_val_map, HashTable * loc_inst_map) +{ + /* check if a branch with func_inst and corresponding predicate exists */ + bool branch_found = false; + ModelVector * branches = (*curr_pred)->get_children(); + for (uint i = 0; i < branches->size(); i++) { + Predicate * branch = (*branches)[i]; + if (branch->get_func_inst() != next_inst) + continue; + + PredExprSet * pred_expressions = branch->get_pred_expressions(); + + /* no predicate, follow the only branch */ + if (pred_expressions->getSize() == 0) { +// model_print("no predicate exists: "); next_inst->print(); + *curr_pred = branch; + branch_found = true; + break; + } + + PredExprSetIter * pred_expr_it = pred_expressions->iterator(); + while (pred_expr_it->hasNext()) { + pred_expr * pred_expression = pred_expr_it->next(); + uint64_t last_read, curr_read; + FuncInst * last_inst; + bool equality; + + switch(pred_expression->token) { + case EQUALITY: + last_inst = loc_inst_map->get(next_inst->get_location()); + last_read = read_val_map->get(last_inst); + curr_read = read_val_map->get(next_inst); + equality = (last_read == curr_read); + if (equality == pred_expression->value) { + *curr_pred = branch; +// model_print("predicate: token: %d, location: %p, value: %d - ", pred_expression->token, pred_expression->location, pred_expression->value); next_inst->print(); + branch_found = true; + } + break; + case NULLITY: + break; + default: + model_print("unkown predicate token\n"); + break; + } + } + + } + + return branch_found; +} void FuncNode::print_predicate_tree() { diff --git a/funcnode.h b/funcnode.h index 2fe70860..58fcc7a0 100644 --- a/funcnode.h +++ b/funcnode.h @@ -9,7 +9,6 @@ typedef ModelList func_inst_list_mt; typedef HashTable read_map_t; -typedef HSIterator PredSetIter; class FuncNode { public: @@ -37,7 +36,8 @@ public: void clear_read_map(uint32_t tid); /* TODO: generate EQUALITY or NULLITY predicate based on write_history in history.cc */ - void init_predicate_tree(func_inst_list_t * inst_list, HashTable * read_val_map); + void update_predicate_tree(func_inst_list_t * inst_list, HashTable * read_val_map); + bool follow_branch(Predicate ** curr_pred, FuncInst * next_inst, HashTable * read_val_map, HashTable* loc_inst_map); void print_predicate_tree(); void print_last_read(uint32_t tid); @@ -62,7 +62,10 @@ private: /* Store the values read by atomic read actions per memory location for each thread */ ModelVector thrd_read_map; - HashSet predicate_tree_entry; + PredSet predicate_tree_entry; + + /* A FuncInst may correspond to multiple Predicates, so collect them into a PredSet */ + HashTable inst_pred_map; }; #endif /* __FUNCNODE_H__ */ diff --git a/predicate.cc b/predicate.cc index a5693c9b..9726fb3a 100644 --- a/predicate.cc +++ b/predicate.cc @@ -2,6 +2,7 @@ Predicate::Predicate(FuncInst * func_inst) : func_inst(func_inst), + entry_predicate(false), pred_expressions(), children() {} @@ -36,7 +37,7 @@ void Predicate::add_child(Predicate * child) void Predicate::print_predicate() { - model_print("\"%p\" [shape=box, label=\"%p\n", this, this); + model_print("\"%p\" [shape=box, label=\"\n", this); func_inst->print(); PredExprSetIter * it = pred_expressions.iterator(); diff --git a/predicate.h b/predicate.h index 3dfb8d5b..33b2203f 100644 --- a/predicate.h +++ b/predicate.h @@ -43,13 +43,17 @@ public: void add_child(Predicate * child); ModelVector * get_children() { return &children; } + bool is_entry_predicate() { return entry_predicate; } + void set_entry_predicate() { entry_predicate = true; } + void print_predicate(); void print_pred_subtree(); MEMALLOC private: FuncInst * func_inst; - /* may have multiple precicates */ + bool entry_predicate; + /* may have multiple predicates */ PredExprSet pred_expressions; ModelVector children; };