P4C
The P4 Compiler
Loading...
Searching...
No Matches
unusedDeclarations.h
1/*
2 * SPDX-FileCopyrightText: 2013 Barefoot Networks, Inc.
3 * Copyright 2013-present Barefoot Networks, Inc.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef FRONTENDS_P4_UNUSEDDECLARATIONS_H_
9#define FRONTENDS_P4_UNUSEDDECLARATIONS_H_
10
11#include "../common/resolveReferences/resolveReferences.h"
12#include "ir/ir.h"
13#include "ir/pass_manager.h"
14#include "lib/stringify.h"
15
16namespace P4 {
17
19
20class UsedDeclSet : public IHasDbPrint {
22 absl::flat_hash_set<const IR::IDeclaration *, Util::Hash> usedDecls;
23
24 public:
25 bool setUsed(const IR::IDeclaration *decl) { return usedDecls.emplace(decl).second; }
26
27 [[nodiscard]] auto begin() const { return usedDecls.begin(); }
28
29 [[nodiscard]] auto end() const { return usedDecls.end(); }
30
31 void clear() { usedDecls.clear(); }
32
33 void dbprint(std::ostream &cout) const override;
34
36 bool isUsed(const IR::IDeclaration *decl) const { return usedDecls.contains(decl); }
37};
38
40 public:
41 virtual ~RemoveUnusedPolicy() = default;
45 bool removeUnused, bool warnUnused,
46 bool infoRemoved) const;
47};
48
50class CollectUsedDeclarations : public Inspector, ResolutionContext {
51 UsedDeclSet &used;
52
53 public:
54 explicit CollectUsedDeclarations(UsedDeclSet &used) : used(used) {}
55
56 // We might be invoked in PassRepeated scenario, so the used set should be
57 // force cleared.
58 Visitor::profile_t init_apply(const IR::Node *node) override {
59 auto rv = Inspector::init_apply(node);
60 used.clear();
61
62 return rv;
63 }
64
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;
68};
69
90class UnusedDeclarations : public Transform, ResolutionContext {
91 protected:
92 const UsedDeclSet &used;
93
96
99
102
111 std::set<const IR::Node *> warned;
112
119 bool giveWarning(const IR::Node *node);
120 const IR::Node *process(const IR::IDeclaration *decl, bool skipWarn = false);
121 const IR::Node *warnIfUnused(const IR::Node *node);
122
123 // Prevent direct instantiations of this class.
124 friend class RemoveUnusedPolicy;
125 UnusedDeclarations(const UsedDeclSet &used, bool removeUnused, bool warnUnused,
126 bool infoRemoved)
128 setName("UnusedDeclarations");
129 }
130
131 public:
132 using Transform::init_apply;
133 using Transform::postorder;
134 using Transform::preorder;
135
136 Visitor::profile_t init_apply(const IR::Node *root) override;
137
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;
144
145 const IR::Node *preorder(IR::Declaration_Instance *decl) override;
146 const IR::Node *preorder(IR::Method *decl) override;
147
148 // The following kinds of nodes are not deleted even if they are unreferenced
149 const IR::Node *preorder(IR::Type_Error *type) override {
150 prune();
151 return type;
152 }
153 const IR::Node *preorder(IR::Declaration_MatchKind *decl) override {
154 prune();
155 return decl;
156 }
157 const IR::Node *preorder(IR::Type_StructLike *type) override {
158 visit(type->typeParameters);
159 prune();
160 return type;
161 }
162 const IR::Node *preorder(IR::Type_Extern *type) override {
163 visit(type->typeParameters);
164 prune();
165 return type;
166 }
167 const IR::Node *preorder(IR::Type_Method *type) override {
168 visit(type->typeParameters);
169 prune();
170 return type;
171 }
172 const IR::Node *preorder(IR::Parameter *param) override;
173 const IR::Node *preorder(IR::NamedExpression *ne) override { return ne; } // never dead
174 const IR::Node *preorder(IR::Type_Var *p) override {
175 prune();
176 return warnIfUnused(p);
177 }
178
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); }
183};
184
187class RemoveAllUnusedDeclarations : public PassManager {
188 UsedDeclSet used;
189
190 public:
191 explicit RemoveAllUnusedDeclarations(const RemoveUnusedPolicy &policy,
192 bool infoRemoved = false) {
193 setName("RemoveAllUnusedDeclarations");
194 addPasses(
196 policy.getUnusedDeclarationsPass(used, true, false, infoRemoved)})});
197 setStopOnError(true);
198 }
199};
200
203class WarnAboutUnusedDeclarations : public PassManager {
204 UsedDeclSet used;
205
206 public:
207 explicit WarnAboutUnusedDeclarations(const RemoveUnusedPolicy &policy) {
208 setName("WarnAboutUnusedDeclarations");
209 addPasses({new CollectUsedDeclarations(used),
210 policy.getUnusedDeclarationsPass(used, false, true, false)});
211 }
212};
213
214} // namespace P4
215
216#endif /* FRONTENDS_P4_UNUSEDDECLARATIONS_H_ */
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 node.h:44
Definition visitor.h:409
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
Definition visitor.h:433
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
Definition visitor.h:69
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13