8#ifndef FRONTENDS_P4_UNUSEDDECLARATIONS_H_
9#define FRONTENDS_P4_UNUSEDDECLARATIONS_H_
11#include "../common/resolveReferences/resolveReferences.h"
13#include "ir/pass_manager.h"
14#include "lib/stringify.h"
22 absl::flat_hash_set<const IR::IDeclaration *, Util::Hash> usedDecls;
25 bool setUsed(
const IR::IDeclaration *decl) {
return usedDecls.emplace(decl).second; }
27 [[nodiscard]]
auto begin()
const {
return usedDecls.begin(); }
29 [[nodiscard]]
auto end()
const {
return usedDecls.end(); }
31 void clear() { usedDecls.clear(); }
33 void dbprint(std::ostream &cout)
const override;
45 bool removeUnused,
bool warnUnused,
46 bool infoRemoved)
const;
50class CollectUsedDeclarations :
public Inspector, ResolutionContext {
54 explicit CollectUsedDeclarations(
UsedDeclSet &used) : used(used) {}
59 auto rv = Inspector::init_apply(node);
65 bool preorder(
const IR::KeyElement *ke)
override;
66 bool preorder(
const IR::PathExpression *path)
override;
67 bool preorder(
const IR::Type_Name *type)
override;
90class UnusedDeclarations :
public Transform, ResolutionContext {
124 friend class RemoveUnusedPolicy;
128 setName(
"UnusedDeclarations");
132 using Transform::init_apply;
133 using Transform::postorder;
134 using Transform::preorder;
138 const IR::Node *preorder(IR::P4Control *cont)
override;
139 const IR::Node *preorder(IR::P4Parser *cont)
override;
140 const IR::Node *preorder(IR::P4Table *cont)
override;
141 const IR::Node *preorder(IR::ParserState *state)
override;
142 const IR::Node *preorder(IR::Type_Enum *type)
override;
143 const IR::Node *preorder(IR::Type_SerEnum *type)
override;
145 const IR::Node *preorder(IR::Declaration_Instance *decl)
override;
146 const IR::Node *preorder(IR::Method *decl)
override;
149 const IR::Node *preorder(IR::Type_Error *type)
override {
153 const IR::Node *preorder(IR::Declaration_MatchKind *decl)
override {
157 const IR::Node *preorder(IR::Type_StructLike *type)
override {
158 visit(type->typeParameters);
162 const IR::Node *preorder(IR::Type_Extern *type)
override {
163 visit(type->typeParameters);
167 const IR::Node *preorder(IR::Type_Method *type)
override {
168 visit(type->typeParameters);
172 const IR::Node *preorder(IR::Parameter *param)
override;
173 const IR::Node *preorder(IR::NamedExpression *ne)
override {
return ne; }
174 const IR::Node *preorder(IR::Type_Var *p)
override {
176 return warnIfUnused(p);
179 const IR::Node *preorder(IR::Declaration_Variable *decl)
override;
180 const IR::Node *preorder(IR::Declaration_Constant *decl)
override;
181 const IR::Node *preorder(IR::Declaration *decl)
override {
return process(decl); }
182 const IR::Node *preorder(IR::Type_Declaration *decl)
override {
return process(decl); }
187class RemoveAllUnusedDeclarations :
public PassManager {
192 bool infoRemoved =
false) {
193 setName(
"RemoveAllUnusedDeclarations");
197 setStopOnError(
true);
203class WarnAboutUnusedDeclarations :
public PassManager {
208 setName(
"WarnAboutUnusedDeclarations");
Collects all used declarations into @used set.
Definition unusedDeclarations.h:50
Definition stringify.h:24
The Declaration interface, representing objects with names.
Definition declaration.h:17
Definition ir/pass_manager.h:137
Definition unusedDeclarations.h:39
virtual UnusedDeclarations * getUnusedDeclarationsPass(const UsedDeclSet &used, bool removeUnused, bool warnUnused, bool infoRemoved) const
Definition unusedDeclarations.cpp:13
Removes unused declarations.
Definition unusedDeclarations.h:90
bool warnUnused
If true, emits warnings about unused instances.
Definition unusedDeclarations.h:98
bool infoRemoved
If true, emits info messages about removed instances.
Definition unusedDeclarations.h:101
bool removeUnused
If true, removes unused instances.
Definition unusedDeclarations.h:95
std::set< const IR::Node * > warned
Definition unusedDeclarations.h:111
bool giveWarning(const IR::Node *node)
Definition unusedDeclarations.cpp:55
Definition unusedDeclarations.h:20
bool isUsed(const IR::IDeclaration *decl) const
Definition unusedDeclarations.h:36
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13