X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=predicate.cc;h=714ebbbbb762748ed50c0ba9a1feba753dd90e6c;hp=c8e3989133fddedb009a8bc8544dfe48d893fdb4;hb=064db08aed92a31adbf00497f4dc4608f5b99857;hpb=39e9009d50498d0dd1bccc1a54e378f7aef5a28a diff --git a/predicate.cc b/predicate.cc index c8e39891..714ebbbb 100644 --- a/predicate.cc +++ b/predicate.cc @@ -1,14 +1,30 @@ +#include "funcinst.h" #include "predicate.h" +#include "concretepredicate.h" -Predicate::Predicate(FuncInst * func_inst, bool is_entry) : +Predicate::Predicate(FuncInst * func_inst, bool is_entry, bool is_exit) : func_inst(func_inst), entry_predicate(is_entry), + exit_predicate(is_exit), + does_write(false), + exploration_count(0), + failure_count(0), + sleep_score(0), pred_expressions(16), children(), parent(NULL), + exit(NULL), backedges(16) {} +Predicate::~Predicate() +{ + // parent and func_inst should not be deleted + pred_expressions.reset(); + backedges.reset(); + children.clear(); +} + unsigned int pred_expr_hash(struct pred_expr * expr) { return (unsigned int)((uintptr_t)expr); @@ -49,6 +65,65 @@ void Predicate::copy_predicate_expr(Predicate * other) } } +/* Evaluate predicate expressions against the given inst_act_map */ +ConcretePredicate * Predicate::evaluate(inst_act_map_t * inst_act_map, thread_id_t tid) +{ + ConcretePredicate * concrete = new ConcretePredicate(tid); + PredExprSetIter * it = pred_expressions.iterator(); + + while (it->hasNext()) { + struct pred_expr * ptr = it->next(); + uint64_t value = 0; + + switch(ptr->token) { + case NOPREDICATE: + break; + case EQUALITY: + FuncInst * to_be_compared; + ModelAction * last_act; + + to_be_compared = ptr->func_inst; + last_act = inst_act_map->get(to_be_compared); + value = last_act->get_reads_from_value(); + break; + case NULLITY: + break; + default: + break; + } + + concrete->add_expression(ptr->token, value, ptr->value); + } + + return concrete; +} + +void Predicate::incr_expl_count() +{ + exploration_count++; +} + +void Predicate::incr_fail_count() +{ + failure_count++; +} + +void Predicate::incr_sleep_score(uint32_t amount) +{ + if (sleep_score + amount > 100) + sleep_score = 100; + else + sleep_score += amount; +} + +void Predicate::decr_sleep_score(uint32_t amount) +{ + if (sleep_score > amount) + sleep_score -= amount; + else + sleep_score = 0; +} + void Predicate::print_predicate() { model_print("\"%p\" [shape=box, label=\"\n", this); @@ -57,6 +132,11 @@ void Predicate::print_predicate() return; } + if (exit_predicate) { + model_print("exit node\"];\n"); + return; + } + func_inst->print(); PredExprSetIter * it = pred_expressions.iterator(); @@ -81,6 +161,11 @@ void Predicate::print_predicate() break; } } + + if (does_write) { + model_print("Does write\n"); + } + model_print("Count: %d, failed count: %d\n", exploration_count, failure_count); model_print("\"];\n"); } @@ -98,4 +183,8 @@ void Predicate::print_pred_subtree() Predicate * backedge = it->next(); model_print("\"%p\" -> \"%p\"[style=dashed, color=grey]\n", this, backedge); } + + if (exit) { + model_print("\"%p\" -> \"%p\"[style=dashed, color=red]\n", this, exit); + } }