P4C
The P4 Compiler
Loading...
Searching...
No Matches
unusedDeclarations.h
1/*
2Copyright 2013-present Barefoot Networks, Inc.
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16
17#ifndef FRONTENDS_P4_UNUSEDDECLARATIONS_H_
18#define FRONTENDS_P4_UNUSEDDECLARATIONS_H_
19
20#include "../common/resolveReferences/resolveReferences.h"
21#include "ir/ir.h"
22#include "ir/pass_manager.h"
23#include "lib/stringify.h"
24
25namespace P4 {
26
28
29class UsedDeclSet : public IHasDbPrint {
31 absl::flat_hash_set<const IR::IDeclaration *, Util::Hash> usedDecls;
32
33 public:
34 bool setUsed(const IR::IDeclaration *decl) { return usedDecls.emplace(decl).second; }
35
36 [[nodiscard]] auto begin() const { return usedDecls.begin(); }
37
38 [[nodiscard]] auto end() const { return usedDecls.end(); }
39
40 void clear() { usedDecls.clear(); }
41
42 void dbprint(std::ostream &cout) const override;
43
45 bool isUsed(const IR::IDeclaration *decl) const { return usedDecls.contains(decl); }
46};
47
49 public:
50 virtual ~RemoveUnusedPolicy() = default;
54 bool removeUnused, bool warnUnused,
55 bool infoRemoved) const;
56};
57
59class CollectUsedDeclarations : public Inspector, ResolutionContext {
60 UsedDeclSet &used;
61
62 public:
63 explicit CollectUsedDeclarations(UsedDeclSet &used) : used(used) {}
64
65 // We might be invoked in PassRepeated scenario, so the used set should be
66 // force cleared.
67 Visitor::profile_t init_apply(const IR::Node *node) override {
68 auto rv = Inspector::init_apply(node);
69 used.clear();
70
71 return rv;
72 }
73
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;
77};
78
99class UnusedDeclarations : public Transform, ResolutionContext {
100 protected:
101 const UsedDeclSet &used;
102
105
108
111
120 std::set<const IR::Node *> warned;
121
128 bool giveWarning(const IR::Node *node);
129 const IR::Node *process(const IR::IDeclaration *decl, bool skipWarn = false);
130 const IR::Node *warnIfUnused(const IR::Node *node);
131
132 // Prevent direct instantiations of this class.
133 friend class RemoveUnusedPolicy;
134 UnusedDeclarations(const UsedDeclSet &used, bool removeUnused, bool warnUnused,
135 bool infoRemoved)
137 setName("UnusedDeclarations");
138 }
139
140 public:
141 using Transform::init_apply;
142 using Transform::postorder;
143 using Transform::preorder;
144
145 Visitor::profile_t init_apply(const IR::Node *root) override;
146
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;
153
154 const IR::Node *preorder(IR::Declaration_Instance *decl) override;
155 const IR::Node *preorder(IR::Method *decl) override;
156
157 // The following kinds of nodes are not deleted even if they are unreferenced
158 const IR::Node *preorder(IR::Type_Error *type) override {
159 prune();
160 return type;
161 }
162 const IR::Node *preorder(IR::Declaration_MatchKind *decl) override {
163 prune();
164 return decl;
165 }
166 const IR::Node *preorder(IR::Type_StructLike *type) override {
167 visit(type->typeParameters);
168 prune();
169 return type;
170 }
171 const IR::Node *preorder(IR::Type_Extern *type) override {
172 visit(type->typeParameters);
173 prune();
174 return type;
175 }
176 const IR::Node *preorder(IR::Type_Method *type) override {
177 visit(type->typeParameters);
178 prune();
179 return type;
180 }
181 const IR::Node *preorder(IR::Parameter *param) override;
182 const IR::Node *preorder(IR::NamedExpression *ne) override { return ne; } // never dead
183 const IR::Node *preorder(IR::Type_Var *p) override {
184 prune();
185 return warnIfUnused(p);
186 }
187
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); }
192};
193
196class RemoveAllUnusedDeclarations : public PassManager {
197 UsedDeclSet used;
198
199 public:
200 explicit RemoveAllUnusedDeclarations(const RemoveUnusedPolicy &policy,
201 bool infoRemoved = false) {
202 setName("RemoveAllUnusedDeclarations");
203 addPasses(
205 policy.getUnusedDeclarationsPass(used, true, false, infoRemoved)})});
206 setStopOnError(true);
207 }
208};
209
212class WarnAboutUnusedDeclarations : public PassManager {
213 UsedDeclSet used;
214
215 public:
216 explicit WarnAboutUnusedDeclarations(const RemoveUnusedPolicy &policy) {
217 setName("WarnAboutUnusedDeclarations");
218 addPasses({new CollectUsedDeclarations(used),
219 policy.getUnusedDeclarationsPass(used, false, true, false)});
220 }
221};
222
223} // namespace P4
224
225#endif /* FRONTENDS_P4_UNUSEDDECLARATIONS_H_ */
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 node.h:94
Definition visitor.h:413
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
Definition visitor.h:437
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
Definition visitor.h:78
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24