P4C
The P4 Compiler
ControlFlowVisitor Class Referenceabstract
Inheritance diagram for ControlFlowVisitor:
[legend]

Classes

struct  flow_join_info_t
 
class  GuardGlobal
 RAII class to ensure global key is only used in one place. More...
 
class  SetupJoinPoints
 

Public Member Functions

bool check_global (cstring key) override
 
void clear_globals () override
 
void erase_global (cstring key) override
 
const flow_join_info_tflow_join_status (const IR::Node *n) const
 
void flow_merge_global_from (cstring key) override
 
void flow_merge_global_to (cstring key) override
 
bool has_flow_joins () const override
 
- Public Member Functions inherited from Visitor
virtual const IR::Nodeapply_visitor (const IR::Node *n, const char *name=0)=0
 
virtual bool check_clone (const Visitor *a)
 
virtual void end_apply ()
 
virtual void end_apply (const IR::Node *root)
 
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
 
const ContextgetChildContext () const
 
int getChildrenVisited () const
 
const ContextgetContext () const
 
int getContextDepth () const
 
const IR::NodegetCurrentNode () const
 
template<class T >
const T * getCurrentNode () const
 
const IR::NodegetOriginal () const
 
template<class T >
const T * getOriginal () const
 
template<class T >
const T * getParent () const
 
virtual profile_t init_apply (const IR::Node *root)
 
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 VisitorsetCalledBy (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 = typename std::enable_if<std::is_base_of<Util::IHasSourceInfo, T>::value>::type, 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 = typename std::enable_if<std::is_base_of<Util::IHasSourceInfo, T>::value>::type, class... Args>
void warn (const int kind, const char *format, const T *node, Args... args)
 
bool warning_enabled (int warning_kind) const
 

Protected Types

typedef std::map< const IR::Node *, flow_join_info_tflow_join_points_t
 

Protected Member Functions

virtual void applySetupJoinPoints (const IR::Node *root)
 
ControlFlowVisitorclone () const override=0
 
virtual bool filter_join_point (const IR::Node *)
 
ControlFlowVisitorflow_clone () override
 
virtual void flow_copy (ControlFlowVisitor &)=0
 
void flow_merge (Visitor &) override=0
 
void init_join_flows (const IR::Node *root) override
 
bool join_flows (const IR::Node *n) override
 
void post_join_flows (const IR::Node *, const IR::Node *) override
 
- Protected Member Functions inherited from Visitor
void visit_children (const IR::Node *, std::function< void()> fn)
 
virtual void visitAgain () const
 
virtual void visitOnce () const
 

Protected Attributes

bool BackwardsCompatibleBroken = false
 
flow_join_points_t * flow_join_points = 0
 
- Protected Attributes inherited from Visitor
bool dontForwardChildrenBeforePreorder = false
 
bool joinFlows = false
 
bool visitDagOnce = true
 

Friends

void dump (const flow_join_info_t &)
 
void dump (const flow_join_info_t *)
 
void dump (const flow_join_points_t &)
 
void dump (const flow_join_points_t *)
 
std::ostream & operator<< (std::ostream &, const flow_join_info_t &)
 
std::ostream & operator<< (std::ostream &, const flow_join_points_t &)
 

Additional Inherited Members

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

Class Documentation

◆ ControlFlowVisitor::flow_join_info_t

struct ControlFlowVisitor::flow_join_info_t
Class Members
int count
bool done
ControlFlowVisitor * vclone

Member Function Documentation

◆ filter_join_point()

virtual bool ControlFlowVisitor::filter_join_point ( const IR::Node )
inlineprotectedvirtual

This will be called for all nodes with multiple incoming edges, and should return 'false' if the node should be considered a join point, and 'true' if if should not be considered one. Nodes with only one incoming edge are never join points.

◆ flow_merge()

void ControlFlowVisitor::flow_merge ( Visitor )
overrideprotectedpure virtual

Merge the given visitor into this visitor at a joint point in the control flow graph. Should update @this and leave the other unchanged.

Reimplemented from Visitor.

◆ flow_merge_global_to()

void ControlFlowVisitor::flow_merge_global_to ( cstring  )
inlineoverridevirtual

Support methods for non-local ControlFlow computations

Reimplemented from Visitor.

◆ join_flows()

bool ControlFlowVisitor::join_flows ( const IR::Node )
overrideprotectedvirtual

If
is a join point in the control flow graph (i.e. has multiple incoming edges) and is not filtered out by filter_join_point, then:

  • if this is the first time a visitor has visited
    , store a clone of the visitor with this node and return true, deferring visiting this node until all incoming edges have been visited.
  • if this is NOT the first visitor, but also not the last, then merge this visitor into the stored visitor clone, and return true.
  • finally, if this is the is the final visitor, merge the stored, cloned visitor—which has accumulated all previous visitors—with this one, and return false.

join_flows(n) is invoked in apply_visitor(n, name), and
is only visited if this method returns false.

Returns
false if all upstream nodes from
have been visited, and it's time to visit
.

Reimplemented from Visitor.

◆ post_join_flows()

void ControlFlowVisitor::post_join_flows ( const IR::Node ,
const IR::Node  
)
overrideprotectedvirtual

Called from apply_visitor after visiting the node (pre- and postorder) and its children after join_flows returned false

Reimplemented from Visitor.