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
24namespace P4 {
25
26class RemoveUnusedDeclarations;
27
29 public:
33 bool warn = false) const;
34};
35
59 protected:
60 const ReferenceMap *refMap;
61
66 std::set<const IR::Node *> *warned;
67
75 bool giveWarning(const IR::Node *node);
76 const IR::Node *process(const IR::IDeclaration *decl);
77 const IR::Node *warnIfUnused(const IR::Node *node);
78
79 // Prevent direct instantiations of this class.
80 friend class RemoveUnusedPolicy;
81 RemoveUnusedDeclarations(const ReferenceMap *refMap, bool warn)
82 : refMap(refMap), warned(warn ? new std::set<const IR::Node *> : nullptr) {
83 CHECK_NULL(refMap);
84 setName("RemoveUnusedDeclarations");
85 }
86
87 public:
88 using Transform::init_apply;
89 using Transform::postorder;
90 using Transform::preorder;
91
92 Visitor::profile_t init_apply(const IR::Node *root) override;
93
94 const IR::Node *preorder(IR::P4Control *cont) override;
95 const IR::Node *preorder(IR::P4Parser *cont) override;
96 const IR::Node *preorder(IR::P4Table *cont) override;
97 const IR::Node *preorder(IR::ParserState *state) override;
98 const IR::Node *preorder(IR::Type_Enum *type) override;
99 const IR::Node *preorder(IR::Type_SerEnum *type) override;
100
101 const IR::Node *preorder(IR::Declaration_Instance *decl) override;
102 const IR::Node *preorder(IR::Method *decl) override;
103
104 // The following kinds of nodes are not deleted even if they are unreferenced
105 const IR::Node *preorder(IR::Type_Error *type) override {
106 prune();
107 return type;
108 }
109 const IR::Node *preorder(IR::Declaration_MatchKind *decl) override {
110 prune();
111 return decl;
112 }
113 const IR::Node *preorder(IR::Type_StructLike *type) override {
114 visit(type->typeParameters);
115 prune();
116 return type;
117 }
118 const IR::Node *preorder(IR::Type_Extern *type) override {
119 visit(type->typeParameters);
120 prune();
121 return type;
122 }
123 const IR::Node *preorder(IR::Type_Method *type) override {
124 visit(type->typeParameters);
125 prune();
126 return type;
127 }
128 const IR::Node *preorder(IR::Parameter *param) override;
129 const IR::Node *preorder(IR::NamedExpression *ne) override { return ne; } // never dead
130 const IR::Node *preorder(IR::Type_Var *p) override {
131 prune();
132 return warnIfUnused(p);
133 }
134
135 const IR::Node *preorder(IR::Declaration_Variable *decl) override;
136 const IR::Node *preorder(IR::Declaration *decl) override { return process(decl); }
137 const IR::Node *preorder(IR::Type_Declaration *decl) override { return process(decl); }
138 cstring ifSystemFile(const IR::Node *node); // return file containing node if system file
139};
140
147 public:
149 bool warn = false)
150 : PassManager({new ResolveReferences(refMap),
151 policy.getRemoveUnusedDeclarationsPass(refMap, warn)}) {
152 // Unused extern instances are not removed but may still trigger
153 // warnings. The @warned set keeps track of warnings emitted in
154 // previous iterations to avoid emitting duplicate warnings.
155 CHECK_NULL(refMap);
156 setName("RemoveAllUnusedDeclarations");
157 setStopOnError(true);
158 }
159};
160
161} // namespace P4
162
163#endif /* P4_UNUSEDDECLARATIONS_H_ */
The Declaration interface, representing objects with names.
Definition declaration.h:26
Definition node.h:95
Definition pass_manager.h:40
Definition pass_manager.h:145
Class used to encode maps from paths to declarations.
Definition referenceMap.h:66
Iterates RemoveUnusedDeclarations until convergence.
Definition unusedDeclarations.h:146
Removes unused declarations.
Definition unusedDeclarations.h:58
std::set< const IR::Node * > * warned
Definition unusedDeclarations.h:66
bool giveWarning(const IR::Node *node)
Definition unusedDeclarations.cpp:34
Definition unusedDeclarations.h:28
virtual RemoveUnusedDeclarations * getRemoveUnusedDeclarationsPass(const ReferenceMap *refMap, bool warn=false) const
Definition unusedDeclarations.cpp:24
Definition resolveReferences.h:121
Definition visitor.h:424
Definition visitor.h:78
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24
STL namespace.