P4C
The P4 Compiler
Loading...
Searching...
No Matches
P4::ControlFlowVisitor Class Referenceabstract
Inheritance diagram for P4::ControlFlowVisitor:
[legend]

Classes

struct  flow_join_info_t
 
class  GuardGlobal
 RAII class to ensure global key is only used in one place. More...
 
class  SaveGlobal
 RAII class to save and restore one or more global keys. More...
 
class  SetupJoinPoints
 

Public Member Functions

bool check_global (cstring key) override
 
void clear_globals () override
 
ControlFlowVisitorcontrolFlowVisitor () override
 
void erase_global (cstring key) override
 
ControlFlowVisitorflow_clone () override
 
virtual void flow_copy (ControlFlowVisitor &)=0
 
const flow_join_info_tflow_join_status (const IR::Node *n) const
 
void flow_merge (Visitor &) override=0
 
void flow_merge_global_from (cstring key) override
 
void flow_merge_global_to (cstring key) override
 
bool has_flow_joins () const override
 
bool isUnreachable ()
 
bool operator!= (const ControlFlowVisitor &v) const
 
virtual bool operator== (const ControlFlowVisitor &) const
 
void restore_global (std::pair< cstring, ControlFlowVisitor * > saved)
 
std::pair< cstring, ControlFlowVisitor * > save_global (cstring key)
 
void setUnreachable ()
 
- Public Member Functions inherited from P4::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
 
virtual bool flow_merge_closure (Visitor &)
 
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 = 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
 

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 *)
 
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 P4::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
 
bool unreachable = false
 
- Protected Attributes inherited from P4::Visitor
bool dontForwardChildrenBeforePreorder = false
 
bool joinFlows = false
 
bool visitDagOnce = true
 

Friends

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

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 Visitorcalled_by = nullptr
 
cstring internalName
 
SplitFlowVisit_base *& split_link
 
SplitFlowVisit_basesplit_link_mem = nullptr
 

Class Documentation

◆ P4::ControlFlowVisitor::flow_join_info_t

struct P4::ControlFlowVisitor::flow_join_info_t
Class Members
int count = 0
bool done = false
ControlFlowVisitor * vclone = nullptr

Member Function Documentation

◆ check_global()

bool P4::ControlFlowVisitor::check_global ( cstring key)
inlineoverridevirtual

Reimplemented from P4::Visitor.

◆ clear_globals()

void P4::ControlFlowVisitor::clear_globals ( )
inlineoverridevirtual

Reimplemented from P4::Visitor.

◆ clone()

ControlFlowVisitor * P4::ControlFlowVisitor::clone ( ) const
overrideprotectedpure virtual

Reimplemented from P4::Visitor.

◆ controlFlowVisitor()

ControlFlowVisitor * P4::ControlFlowVisitor::controlFlowVisitor ( )
inlineoverridevirtual

Reimplemented from P4::Visitor.

◆ erase_global()

void P4::ControlFlowVisitor::erase_global ( cstring key)
inlineoverridevirtual

Reimplemented from P4::Visitor.

◆ filter_join_point()

virtual bool P4::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_clone()

ControlFlowVisitor & P4::ControlFlowVisitor::flow_clone ( )
overridevirtual

Reimplemented from P4::Visitor.

◆ flow_merge()

void P4::ControlFlowVisitor::flow_merge ( Visitor & )
overridepure 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 P4::Visitor.

◆ flow_merge_global_from()

void P4::ControlFlowVisitor::flow_merge_global_from ( cstring key)
inlineoverridevirtual

Reimplemented from P4::Visitor.

◆ flow_merge_global_to()

void P4::ControlFlowVisitor::flow_merge_global_to ( cstring )
inlineoverridevirtual

Support methods for non-local ControlFlow computations

Reimplemented from P4::Visitor.

◆ has_flow_joins()

bool P4::ControlFlowVisitor::has_flow_joins ( ) const
inlineoverridevirtual

Reimplemented from P4::Visitor.

◆ init_join_flows()

void P4::ControlFlowVisitor::init_join_flows ( const IR::Node * root)
overrideprotectedvirtual

Reimplemented from P4::Visitor.

◆ join_flows()

bool P4::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 P4::Visitor.

◆ post_join_flows()

void P4::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 P4::Visitor.