|
| ComputeWriteSet (AllDefinitions *allDefinitions, ReferenceMap *refMap, TypeMap *typeMap) |
|
bool | handleJump (const char *tok, Definitions *&defs) |
|
bool | preorder (const IR::AbstractSlice *expression) override |
|
bool | preorder (const IR::ArrayIndex *expression) override |
|
bool | preorder (const IR::AssignmentStatement *statement) override |
|
bool | preorder (const IR::BlockStatement *statement) override |
|
bool | preorder (const IR::BreakStatement *statement) override |
|
bool | preorder (const IR::ContinueStatement *statement) override |
|
bool | preorder (const IR::DefaultExpression *expression) override |
|
bool | preorder (const IR::EmptyStatement *statement) override |
|
bool | preorder (const IR::ExitStatement *statement) override |
|
bool | preorder (const IR::Expression *expression) override |
| For expressions we maintain the write-set in the writes std::map.
|
|
bool | preorder (const IR::ForInStatement *statement) override |
|
bool | preorder (const IR::ForStatement *statement) override |
|
bool | preorder (const IR::Function *function) override |
|
bool | preorder (const IR::HeaderStackExpression *expression) override |
|
bool | preorder (const IR::IfStatement *statement) override |
|
bool | preorder (const IR::InvalidHeader *expression) override |
|
bool | preorder (const IR::InvalidHeaderUnion *expression) override |
|
bool | preorder (const IR::ListExpression *expression) override |
|
bool | preorder (const IR::Literal *expression) override |
|
bool | preorder (const IR::Member *expression) override |
|
bool | preorder (const IR::MethodCallExpression *expression) override |
|
bool | preorder (const IR::MethodCallStatement *statement) override |
|
bool | preorder (const IR::Mux *expression) override |
|
bool | preorder (const IR::Operation_Binary *expression) override |
|
bool | preorder (const IR::Operation_Unary *expression) override |
|
bool | preorder (const IR::P4Action *action) override |
|
bool | preorder (const IR::P4Control *control) override |
|
bool | preorder (const IR::P4ListExpression *expression) override |
|
bool | preorder (const IR::P4Parser *parser) override |
|
bool | preorder (const IR::P4Table *table) override |
|
bool | preorder (const IR::PathExpression *expression) override |
|
bool | preorder (const IR::ReturnStatement *statement) override |
|
bool | preorder (const IR::SelectExpression *expression) override |
|
bool | preorder (const IR::StructExpression *expression) override |
|
bool | preorder (const IR::SwitchStatement *statement) override |
|
bool | preorder (const IR::TypeNameExpression *expression) override |
|
const LocationSet * | writtenLocations (const IR::Expression *expression) |
|
const IR::Node * | apply_visitor (const IR::Node *, const char *name=0) override |
|
profile_t | init_apply (const IR::Node *root) override |
|
virtual void | loop_revisit (const IR::Node *) |
|
virtual void | postorder (const IR::Node *) |
|
virtual bool | preorder (const IR::Node *) |
|
virtual void | revisit (const IR::Node *) |
|
void | revisit_visited () |
|
bool | visit_in_progress (const IR::Node *n) const |
|
void | visitAgain () const override |
|
void | visitOnce () const override |
|
virtual bool | check_global (cstring) |
|
virtual void | clear_globals () |
|
virtual Visitor * | clone () const |
|
virtual ControlFlowVisitor * | controlFlowVisitor () |
|
virtual void | end_apply (const IR::Node *root) |
|
virtual void | erase_global (cstring) |
|
template<class T > |
const T * | findContext () const |
|
template<class T > |
const T * | findContext (const Context *&c) const |
|
template<class T > |
const T * | findOrigCtxt () const |
|
template<class T > |
const T * | findOrigCtxt (const Context *&c) const |
|
virtual Visitor & | flow_clone () |
|
virtual void | flow_merge (Visitor &) |
|
virtual bool | flow_merge_closure (Visitor &) |
|
virtual void | flow_merge_global_from (cstring) |
|
virtual void | flow_merge_global_to (cstring) |
|
const Context * | getChildContext () const |
|
int | getChildrenVisited () const |
|
const Context * | getContext () const |
|
int | getContextDepth () const |
|
const IR::Node * | getCurrentNode () const |
|
template<class T > |
const T * | getCurrentNode () const |
|
const IR::Node * | getOriginal () const |
|
template<class T > |
const T * | getOriginal () const |
|
template<class T > |
const T * | getParent () const |
|
virtual bool | has_flow_joins () const |
|
profile_t | init_apply (const IR::Node *root, const Context *parent_context) |
|
bool | isInContext (const IR::Node *n) const |
|
virtual const char * | name () const |
|
template<class T > |
void | parallel_visit (const IR::Vector< T > &v, const char *name, int cidx) |
|
template<class T > |
void | parallel_visit (const IR::Vector< T > &v, const char *name=0) |
|
template<class T > |
void | parallel_visit (IR::Vector< T > &v, const char *name, int cidx) |
|
template<class T > |
void | parallel_visit (IR::Vector< T > &v, const char *name=0) |
|
void | print_context () const |
|
const Visitor & | setCalledBy (const Visitor *visitor) |
|
void | setName (const char *name) |
|
void | visit (const IR::Node &n, const char *name, int cidx) |
|
void | visit (const IR::Node &n, const char *name=0) |
|
void | visit (const IR::Node *&n, const char *name, int cidx) |
|
void | visit (const IR::Node *&n, const char *name=0) |
|
void | visit (const IR::Node *const &n, const char *name, int cidx) |
|
void | visit (const IR::Node *const &n, const char *name=0) |
|
void | visit (IR::Node &n, const char *name, int cidx) |
|
void | visit (IR::Node &n, const char *name=0) |
|
void | visit (IR::Node *&, const char *=0, int=0) |
|
template<class T , typename = std::enable_if_t<Util::has_SourceInfo_v<T> && !std::is_pointer_v<T>>, class... Args> |
void | warn (const int kind, const char *format, const T &node, Args &&...args) |
| The const ref variant of the above.
|
|
template<class T , typename = std::enable_if_t<Util::has_SourceInfo_v<T>>, class... Args> |
void | warn (const int kind, const char *format, const T *node, Args &&...args) |
|
bool | warning_enabled (int warning_kind) const |
|
void | print () const |
|
|
| ComputeWriteSet (const ComputeWriteSet *source, ProgramPoint context, Definitions *definitions, std::unordered_set< loc_t > &cached_locs) |
|
void | dbprint (std::ostream &out) const override |
|
void | end_apply () override |
|
void | enterScope (const IR::ParameterList *parameters, const IR::IndexedVector< IR::Declaration > *locals, ProgramPoint startPoint, bool clear=true) |
|
void | exitScope (const IR::ParameterList *parameters, const IR::IndexedVector< IR::Declaration > *locals, ProgramPoint endPoint) |
|
void | expressionWrites (const IR::Expression *expression, const LocationSet *loc) |
|
Definitions * | getDefinitionsAfter (const IR::ParserState *state) |
|
const loc_t * | getLoc (const IR::Node *n, const loc_t *parentLoc) |
|
const loc_t * | getLoc (const IR::Node *n, const Visitor::Context *ctxt) |
|
const loc_t * | getLoc (const Visitor::Context *ctxt) |
|
ProgramPoint | getProgramPoint (const IR::Node *node=nullptr) const |
|
const LocationSet * | getWrites (const IR::Expression *expression) |
|
const LocationSet * | getWrites (const IR::Expression *expression, const loc_t *parentLoc) |
|
profile_t | init_apply (const IR::Node *root) override |
|
bool | setDefinitions (Definitions *defs, const IR::Node *who=nullptr, bool overwrite=false) |
|
void | visitVirtualMethods (const IR::IndexedVector< IR::Declaration > &locals) |
| Statements and other control structures.
|
|
virtual void | init_join_flows (const IR::Node *) |
|
virtual bool | join_flows (const IR::Node *) |
|
virtual void | post_join_flows (const IR::Node *, const IR::Node *) |
|
void | visit_children (const IR::Node *, std::function< void()> fn) |
|
Computes the write set for each expression and statement.
This pass is run for each parser and control separately. It controls precisely the visit order — to simulate a symbolic execution of the program.
- Precondition
- Must be executed after variable initializers have been removed.