17#ifndef FRONTENDS_P4_UNUSEDDECLARATIONS_H_
18#define FRONTENDS_P4_UNUSEDDECLARATIONS_H_
20#include "../common/resolveReferences/resolveReferences.h"
22#include "ir/pass_manager.h"
23#include "lib/stringify.h"
31 absl::flat_hash_set<const IR::IDeclaration *, Util::Hash> usedDecls;
34 bool setUsed(
const IR::IDeclaration *decl) {
return usedDecls.emplace(decl).second; }
36 [[nodiscard]]
auto begin()
const {
return usedDecls.begin(); }
38 [[nodiscard]]
auto end()
const {
return usedDecls.end(); }
40 void clear() { usedDecls.clear(); }
42 void dbprint(std::ostream &cout)
const override;
54 bool removeUnused,
bool warnUnused,
55 bool infoRemoved)
const;
59class CollectUsedDeclarations :
public Inspector, ResolutionContext {
63 explicit CollectUsedDeclarations(
UsedDeclSet &used) : used(used) {}
68 auto rv = Inspector::init_apply(node);
74 bool preorder(
const IR::KeyElement *ke)
override;
75 bool preorder(
const IR::PathExpression *path)
override;
76 bool preorder(
const IR::Type_Name *type)
override;
99class UnusedDeclarations :
public Transform, ResolutionContext {
133 friend class RemoveUnusedPolicy;
137 setName(
"UnusedDeclarations");
141 using Transform::init_apply;
142 using Transform::postorder;
143 using Transform::preorder;
147 const IR::Node *preorder(IR::P4Control *cont)
override;
148 const IR::Node *preorder(IR::P4Parser *cont)
override;
149 const IR::Node *preorder(IR::P4Table *cont)
override;
150 const IR::Node *preorder(IR::ParserState *state)
override;
151 const IR::Node *preorder(IR::Type_Enum *type)
override;
152 const IR::Node *preorder(IR::Type_SerEnum *type)
override;
154 const IR::Node *preorder(IR::Declaration_Instance *decl)
override;
155 const IR::Node *preorder(IR::Method *decl)
override;
158 const IR::Node *preorder(IR::Type_Error *type)
override {
162 const IR::Node *preorder(IR::Declaration_MatchKind *decl)
override {
166 const IR::Node *preorder(IR::Type_StructLike *type)
override {
167 visit(type->typeParameters);
171 const IR::Node *preorder(IR::Type_Extern *type)
override {
172 visit(type->typeParameters);
176 const IR::Node *preorder(IR::Type_Method *type)
override {
177 visit(type->typeParameters);
181 const IR::Node *preorder(IR::Parameter *param)
override;
182 const IR::Node *preorder(IR::NamedExpression *ne)
override {
return ne; }
183 const IR::Node *preorder(IR::Type_Var *p)
override {
185 return warnIfUnused(p);
188 const IR::Node *preorder(IR::Declaration_Variable *decl)
override;
189 const IR::Node *preorder(IR::Declaration_Constant *decl)
override;
190 const IR::Node *preorder(IR::Declaration *decl)
override {
return process(decl); }
191 const IR::Node *preorder(IR::Type_Declaration *decl)
override {
return process(decl); }
196class RemoveAllUnusedDeclarations :
public PassManager {
201 bool infoRemoved =
false) {
202 setName(
"RemoveAllUnusedDeclarations");
206 setStopOnError(
true);
212class WarnAboutUnusedDeclarations :
public PassManager {
217 setName(
"WarnAboutUnusedDeclarations");
Collects all used declarations into @used set.
Definition unusedDeclarations.h:59
Definition stringify.h:33
The Declaration interface, representing objects with names.
Definition declaration.h:26
Definition ir/pass_manager.h:145
Definition unusedDeclarations.h:48
virtual UnusedDeclarations * getUnusedDeclarationsPass(const UsedDeclSet &used, bool removeUnused, bool warnUnused, bool infoRemoved) const
Definition unusedDeclarations.cpp:24
Removes unused declarations.
Definition unusedDeclarations.h:99
bool warnUnused
If true, emits warnings about unused instances.
Definition unusedDeclarations.h:107
bool infoRemoved
If true, emits info messages about removed instances.
Definition unusedDeclarations.h:110
bool removeUnused
If true, removes unused instances.
Definition unusedDeclarations.h:104
std::set< const IR::Node * > warned
Definition unusedDeclarations.h:120
bool giveWarning(const IR::Node *node)
Definition unusedDeclarations.cpp:66
Definition unusedDeclarations.h:29
bool isUsed(const IR::IDeclaration *decl) const
Definition unusedDeclarations.h:45
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24