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 P4_UNUSEDDECLARATIONS_H_
18#define 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 warn = false) const;
55};
56
58class CollectUsedDeclarations : public Inspector, ResolutionContext {
59 UsedDeclSet &used;
60
61 public:
62 explicit CollectUsedDeclarations(UsedDeclSet &used) : used(used) {}
63
64 // We might be invoked in PassRepeated scenario, so the used set should be
65 // force cleared.
66 Visitor::profile_t init_apply(const IR::Node *node) override {
67 auto rv = Inspector::init_apply(node);
68 used.clear();
69
70 return rv;
71 }
72
73 bool preorder(const IR::KeyElement *ke) override;
74 bool preorder(const IR::PathExpression *path) override;
75 bool preorder(const IR::Type_Name *type) override;
76};
77
100class RemoveUnusedDeclarations : public Transform, ResolutionContext {
101 protected:
102 const UsedDeclSet &used;
103
112 std::set<const IR::Node *> *warned;
113
121 bool giveWarning(const IR::Node *node);
122 const IR::Node *process(const IR::IDeclaration *decl);
123 const IR::Node *warnIfUnused(const IR::Node *node);
124
125 // Prevent direct instantiations of this class.
126 friend class RemoveUnusedPolicy;
127 RemoveUnusedDeclarations(const UsedDeclSet &used, bool warn)
128 : used(used), warned(warn ? new std::set<const IR::Node *> : nullptr) {
129 setName("RemoveUnusedDeclarations");
130 }
131
132 public:
133 using Transform::init_apply;
134 using Transform::postorder;
135 using Transform::preorder;
136
137 Visitor::profile_t init_apply(const IR::Node *root) override;
138
139 const IR::Node *preorder(IR::P4Control *cont) override;
140 const IR::Node *preorder(IR::P4Parser *cont) override;
141 const IR::Node *preorder(IR::P4Table *cont) override;
142 const IR::Node *preorder(IR::ParserState *state) override;
143 const IR::Node *preorder(IR::Type_Enum *type) override;
144 const IR::Node *preorder(IR::Type_SerEnum *type) override;
145
146 const IR::Node *preorder(IR::Declaration_Instance *decl) override;
147 const IR::Node *preorder(IR::Method *decl) override;
148
149 // The following kinds of nodes are not deleted even if they are unreferenced
150 const IR::Node *preorder(IR::Type_Error *type) override {
151 prune();
152 return type;
153 }
154 const IR::Node *preorder(IR::Declaration_MatchKind *decl) override {
155 prune();
156 return decl;
157 }
158 const IR::Node *preorder(IR::Type_StructLike *type) override {
159 visit(type->typeParameters);
160 prune();
161 return type;
162 }
163 const IR::Node *preorder(IR::Type_Extern *type) override {
164 visit(type->typeParameters);
165 prune();
166 return type;
167 }
168 const IR::Node *preorder(IR::Type_Method *type) override {
169 visit(type->typeParameters);
170 prune();
171 return type;
172 }
173 const IR::Node *preorder(IR::Parameter *param) override;
174 const IR::Node *preorder(IR::NamedExpression *ne) override { return ne; } // never dead
175 const IR::Node *preorder(IR::Type_Var *p) override {
176 prune();
177 return warnIfUnused(p);
178 }
179
180 const IR::Node *preorder(IR::Declaration_Variable *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
190class RemoveAllUnusedDeclarations : public PassRepeated {
191 UsedDeclSet used;
192
193 public:
194 explicit RemoveAllUnusedDeclarations(const RemoveUnusedPolicy &policy, bool warn = false)
196 policy.getRemoveUnusedDeclarationsPass(used, warn)}) {
197 setName("RemoveAllUnusedDeclarations");
198 setStopOnError(true);
199 }
200};
201
202} // namespace P4
203
204#endif /* P4_UNUSEDDECLARATIONS_H_ */
Collects all used declarations into @used set.
Definition unusedDeclarations.h:58
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:40
Removes unused declarations.
Definition unusedDeclarations.h:100
std::set< const IR::Node * > * warned
Definition unusedDeclarations.h:112
bool giveWarning(const IR::Node *node)
Definition unusedDeclarations.cpp:63
Definition unusedDeclarations.h:48
virtual RemoveUnusedDeclarations * getRemoveUnusedDeclarationsPass(const UsedDeclSet &used, bool warn=false) const
Definition unusedDeclarations.cpp:23
Definition visitor.h:437
Definition unusedDeclarations.h:29
bool isUsed(const IR::IDeclaration *decl) const
Definition unusedDeclarations.h:45
Definition visitor.h:78
The namespace encapsulating IR node classes.
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24
STL namespace.