P4C
The P4 Compiler
Loading...
Searching...
No Matches
P4::ComputeWriteSet Class Reference

#include <def_use.h>

Inheritance diagram for P4::ComputeWriteSet:
[legend]

Public Member Functions

 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::ArrayExpression *expression) override
 
bool preorder (const IR::ArrayIndex *expression) override
 
bool preorder (const IR::BaseAssignmentStatement *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::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)
 
- Public Member Functions inherited from P4::Inspector
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
 
- Public Member Functions inherited from P4::Visitor
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)
 
template<class T>
bool isInContext () const
 
template<class T>
bool isInContext (const Context *&c) const
 
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
 
- Public Member Functions inherited from P4::IHasDbPrint
void print () const
 

Protected Member Functions

 ComputeWriteSet (const ComputeWriteSet *source, ProgramPoint context, Definitions *definitions, std::shared_ptr< CachedLocs > 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.
 
- Protected Member Functions inherited from P4::Visitor
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)
 

Protected Attributes

AllDefinitions * allDefinitions
 
Definitions * breakDefinitions = nullptr
 Definitions after exit statements.
 
ProgramPoint callingContext
 Definitions at continue statements.
 
Definitions * continueDefinitions = nullptr
 Definitions at break statements.
 
Definitions * currentDefinitions
 Result computed by this pass.
 
Definitions * exitDefinitions
 Definitions after return statements.
 
bool lhs
 if true we are processing an expression on the lhs of an assignment
 
AllocTrace memuse
 True if we are analyzing a virtual method.
 
alloc_trace_cb_t nested_trace
 
ReferenceMap * refMap
 
Definitions * returnedDefinitions
 Before statement currently processed.
 
TypeMap * typeMap
 
bool virtualMethod
 
hvec_map< loc_t, const LocationSet * > writes
 For each program location the location set it writes.
 
- Protected Attributes inherited from P4::Visitor
bool dontForwardChildrenBeforePreorder = false
 
bool joinFlows = false
 
bool visitDagOnce = true
 

Static Protected Attributes

static int nest_count = 0
 

Additional Inherited Members

- Public Types inherited from P4::Visitor
typedef Visitor_Context Context
 
- Static Public Member Functions inherited from P4::Visitor
static cstring demangle (const char *)
 
static bool warning_enabled (const Visitor *visitor, int warning_kind)
 
- Public Attributes inherited from P4::Visitor
const Visitor * called_by = nullptr
 
cstring internalName
 
SplitFlowVisit_base *& split_link
 
SplitFlowVisit_base * split_link_mem = nullptr
 

Detailed Description

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.

Constructor & Destructor Documentation

◆ ComputeWriteSet()

P4::ComputeWriteSet::ComputeWriteSet ( const ComputeWriteSet * source,
ProgramPoint context,
Definitions * definitions,
std::shared_ptr< CachedLocs > cached_locs )
inlineprotected

Creates new visitor, but with same underlying data structures. Needed to visit some program fragments repeatedly.

Member Function Documentation

◆ dbprint()

void P4::ComputeWriteSet::dbprint ( std::ostream & out) const
inlineoverrideprotectedvirtual

Implements P4::IHasDbPrint.

◆ end_apply()

void P4::ComputeWriteSet::end_apply ( )
inlineoverrideprotectedvirtual

Reimplemented from P4::Visitor.

◆ init_apply()

profile_t P4::ComputeWriteSet::init_apply ( const IR::Node * root)
inlineoverrideprotectedvirtual

Reimplemented from P4::Visitor.