{
predicate_tree_entry = new Predicate(NULL, true);
predicate_tree_entry->add_predicate_expr(NOPREDICATE, NULL, true);
+ predicate_tree_exit = new Predicate(NULL, false, true);
// Memories that are reclaimed after each execution
action_list_buffer = new SnapList<action_list_t *>();
curr_pred->add_backedge(back_pred);
curr_pred = back_pred;
-
continue;
}
}
it = it->getNext();
curr_pred->incr_count();
}
+
+ curr_pred->set_exit(predicate_tree_exit);
}
/* Given curr_pred and next_inst, find the branch following curr_pred that
{
model_print("digraph function_%s {\n", func_name);
predicate_tree_entry->print_pred_subtree();
+ predicate_tree_exit->print_predicate();
model_print("}\n"); // end of graph
}
uint32_t func_id;
const char * func_name;
ModelHistory * history;
- Predicate * predicate_tree_entry; // a dummy node whose children are the real entries
+ Predicate * predicate_tree_entry; // A dummy node whose children are the real entries
+ Predicate * predicate_tree_exit; // A dummy node
+
uint32_t exit_count;
uint32_t marker;
#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),
pred_expressions(16),
children(),
parent(NULL),
+ exit(NULL),
backedges(16)
{}
return;
}
+ if (exit_predicate) {
+ model_print("exit node\"];\n");
+ return;
+ }
+
func_inst->print();
PredExprSetIter * it = pred_expressions.iterator();
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);
+ }
}
class Predicate {
public:
- Predicate(FuncInst * func_inst, bool is_entry = false);
+ Predicate(FuncInst * func_inst, bool is_entry = false, bool is_exit = false);
~Predicate();
FuncInst * get_func_inst() { return func_inst; }
void add_predicate_expr(token_t token, FuncInst * func_inst, bool value);
void add_child(Predicate * child);
void set_parent(Predicate * parent_pred) { parent = parent_pred; }
+ void set_exit(Predicate * exit_pred) { exit = exit_pred; }
void add_backedge(Predicate * back_pred) { backedges.add(back_pred); }
void copy_predicate_expr(Predicate * other);
ModelVector<Predicate *> * get_children() { return &children; }
Predicate * get_parent() { return parent; }
+ Predicate * get_exit() { return exit; }
PredSet * get_backedges() { return &backedges; }
bool is_entry_predicate() { return entry_predicate; }
private:
FuncInst * func_inst;
bool entry_predicate;
+ bool exit_predicate;
bool does_write;
uint32_t exploration_count;
/* Only a single parent may exist */
Predicate * parent;
+ Predicate * exit;
/* May have multiple back edges, e.g. nested loops */
PredSet backedges;