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

Removes unused declarations. More...

#include <unusedDeclarations.h>

Inheritance diagram for P4::RemoveUnusedDeclarations:
[legend]

Public Member Functions

Visitor::profile_t init_apply (const IR::Node *root) override
 
virtual const IR::Nodepostorder (IR::Node *n)
 
const IR::Nodepreorder (IR::Declaration *decl) override
 
const IR::Nodepreorder (IR::Declaration_Instance *decl) override
 
const IR::Nodepreorder (IR::Declaration_MatchKind *decl) override
 
const IR::Nodepreorder (IR::Declaration_Variable *decl) override
 
const IR::Nodepreorder (IR::Method *decl) override
 
const IR::Nodepreorder (IR::NamedExpression *ne) override
 
virtual const IR::Nodepreorder (IR::Node *n)
 
const IR::Nodepreorder (IR::P4Control *cont) override
 
const IR::Nodepreorder (IR::P4Parser *cont) override
 
const IR::Nodepreorder (IR::P4Table *cont) override
 
const IR::Nodepreorder (IR::Parameter *param) override
 
const IR::Nodepreorder (IR::ParserState *state) override
 
const IR::Nodepreorder (IR::Type_Declaration *decl) override
 
const IR::Nodepreorder (IR::Type_Enum *type) override
 
const IR::Nodepreorder (IR::Type_Error *type) override
 
const IR::Nodepreorder (IR::Type_Extern *type) override
 
const IR::Nodepreorder (IR::Type_Method *type) override
 
const IR::Nodepreorder (IR::Type_SerEnum *type) override
 
const IR::Nodepreorder (IR::Type_StructLike *type) override
 
const IR::Nodepreorder (IR::Type_Var *p) override
 
- Public Member Functions inherited from P4::Transform
const IR::Nodeapply_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 *)
 
void prune ()
 
virtual void revisit (const IR::Node *, const IR::Node *)
 
void revisit_visited ()
 
bool visit_in_progress (const IR::Node *) 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 Visitorclone () const
 
virtual ControlFlowVisitorcontrolFlowVisitor ()
 
virtual void end_apply ()
 
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 Visitorflow_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 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 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 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 Member Functions

 RemoveUnusedDeclarations (const UsedDeclSet &used, bool warn)
 
bool giveWarning (const IR::Node *node)
 
const IR::Nodeprocess (const IR::IDeclaration *decl)
 
const IR::NodewarnIfUnused (const IR::Node *node)
 
- Protected Member Functions inherited from P4::Transform
const IR::Nodetransform_child (const IR::Node *child)
 
- 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

const UsedDeclSetused
 
std::set< const IR::Node * > * warned
 
- Protected Attributes inherited from P4::Transform
bool forceClone = false
 
- Protected Attributes inherited from P4::Visitor
bool dontForwardChildrenBeforePreorder = false
 
bool joinFlows = false
 
bool visitDagOnce = true
 

Friends

class RemoveUnusedPolicy
 

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
 

Detailed Description

Removes unused declarations.

The following kinds of nodes are not removed even if they are unreferenced:

  • IR::Declaration_MatchKind
  • IR::Parameter
  • IR::Type_Error
  • IR::Type_Extern
  • IR::Type_Method
  • IR::Type_StructLike
  • IR::TypeParameters
  • IR::Method if declared in system headers

Additionally, IR::Declaration_Instance nodes for extern instances are not removed but still trigger warnings.

If @warned is non-null, unused IR::P4Table and IR::Declaration_Instance nodes are stored in @warned if they are unused and removed by this pass. A compilation warning is emitted when a new node is added to @warned, preventing duplicate warnings per node.

Precondition
Requires an up-to-date ReferenceMap.

Member Function Documentation

◆ giveWarning()

bool P4::RemoveUnusedDeclarations::giveWarning ( const IR::Node * node)
protected

Stores @node in @warned if:

  • @warned is non-null,
  • @node is an unused declaration,
  • @node is not already present in @warned.
Returns
true if @node is added to @warned.

◆ init_apply()

Visitor::profile_t P4::RemoveUnusedDeclarations::init_apply ( const IR::Node * root)
overridevirtual

Reimplemented from P4::Visitor.

◆ postorder()

virtual const IR::Node * P4::Transform::postorder ( IR::Node * n)
inlinevirtual

Reimplemented from P4::Transform.

◆ preorder()

virtual const IR::Node * P4::Transform::preorder ( IR::Node * n)
inlinevirtual

Reimplemented from P4::Transform.

Member Data Documentation

◆ warned

std::set<const IR::Node *>* P4::RemoveUnusedDeclarations::warned
protected

If not null, logs the following unused elements in @warned:

  • unused IR::P4Table nodes
  • unused IR::Declaration_Instance nodes

Unused extern instances are not removed but may still trigger warnings. The @warned set keeps track of warnings emitted in previous iterations to avoid emitting duplicate warnings.