| 
| 
  | ComputeWriteSet (AllDefinitions *allDefinitions) | 
|   | 
| 
bool  | handleJump (const char *tok, Definitions *&defs) | 
|   | 
| 
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::Slice *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 | 
|   | 
| 
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>>, 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) | 
|   | 
| 
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.