P4C
The P4 Compiler
Loading...
Searching...
No Matches
node.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 IR_NODE_H_
18#define IR_NODE_H_
19
20#include <iosfwd>
21
22#include "ir/gen-tree-macro.h"
23#include "ir/inode.h"
24#include "ir/ir-tree-macros.h"
25#include "lib/cstring.h"
26#include "lib/source_file.h"
27
28namespace P4 {
29class Visitor;
30struct Visitor_Context;
31class Inspector;
32class Modifier;
33class Transform;
34class JSONGenerator;
35class JSONLoader;
36} // namespace P4
37
38namespace P4::Util {
39class JsonObject;
40} // namespace P4::Util
41
42namespace P4::IR {
43
44using namespace P4::literals;
45
46class Node;
47class Annotation; // IWYU pragma: keep
48template <class T>
49class Vector; // IWYU pragma: keep
50template <class T>
51class IndexedVector; // IWYU pragma: keep
52
53class Node : public virtual INode {
54 public:
55 virtual bool apply_visitor_preorder(Modifier &v);
56 virtual void apply_visitor_postorder(Modifier &v);
57 virtual void apply_visitor_revisit(Modifier &v, const Node *n) const;
58 virtual void apply_visitor_loop_revisit(Modifier &v) const;
59 virtual bool apply_visitor_preorder(Inspector &v) const;
60 virtual void apply_visitor_postorder(Inspector &v) const;
61 virtual void apply_visitor_revisit(Inspector &v) const;
62 virtual void apply_visitor_loop_revisit(Inspector &v) const;
63 virtual const Node *apply_visitor_preorder(Transform &v);
64 virtual const Node *apply_visitor_postorder(Transform &v);
65 virtual void apply_visitor_revisit(Transform &v, const Node *n) const;
66 virtual void apply_visitor_loop_revisit(Transform &v) const;
67 Node &operator=(const Node &) = default;
68 Node &operator=(Node &&) = default;
69
70 protected:
71 static int currentId;
72 void traceVisit(const char *visitor) const;
73 friend class ::P4::Visitor;
74 friend class ::P4::Inspector;
75 friend class ::P4::Modifier;
76 friend class ::P4::Transform;
77 cstring prepareSourceInfoForJSON(Util::SourceInfo &si, unsigned *lineNumber,
78 unsigned *columnNumber) const;
79
80 public:
81 Util::SourceInfo srcInfo;
82 int id; // unique id for each node
83 int clone_id; // unique id this node was cloned from (recursively)
84 void traceCreation() const;
85 Node() : id(currentId++), clone_id(id) { traceCreation(); }
86 explicit Node(Util::SourceInfo si) : srcInfo(si), id(currentId++), clone_id(id) {
87 traceCreation();
88 }
89 Node(const Node &other) : srcInfo(other.srcInfo), id(currentId++), clone_id(other.clone_id) {
90 traceCreation();
91 }
92 virtual ~Node() {}
93 const Node *apply(Visitor &v, const Visitor_Context *ctxt = nullptr) const;
94 const Node *apply(Visitor &&v, const Visitor_Context *ctxt = nullptr) const {
95 return apply(v, ctxt);
96 }
97 virtual Node *clone() const = 0;
98 void dbprint(std::ostream &out) const override;
99 virtual void dump_fields(std::ostream &) const {}
100 const Node *getNode() const final { return this; }
101 Node *getNode() final { return this; }
102 Util::SourceInfo getSourceInfo() const override { return srcInfo; }
103 cstring node_type_name() const override { return "Node"_cs; }
104 static cstring static_type_name() { return "Node"_cs; }
105 virtual int num_children() { return 0; }
106 explicit Node(JSONLoader &json);
107 cstring toString() const override { return node_type_name(); }
108 void toJSON(JSONGenerator &json) const override;
109 void sourceInfoToJSON(JSONGenerator &json) const;
110 void sourceInfoFromJSON(JSONLoader &json);
111 Util::JsonObject *sourceInfoJsonObj() const;
112 /* operator== does a 'shallow' comparison, comparing two Node subclass objects for equality,
113 * and comparing pointers in the Node directly for equality */
114 virtual bool operator==(const Node &a) const { return this->typeId() == a.typeId(); }
115 /* 'equiv' does a deep-equals comparison, comparing all non-pointer fields and recursing
116 * though all Node subclass pointers to compare them with 'equiv' as well. */
117 virtual bool equiv(const Node &a) const { return this->typeId() == a.typeId(); }
118#define DEFINE_OPEQ_FUNC(CLASS, BASE) \
119 virtual bool operator==(const CLASS &) const { return false; }
120 IRNODE_ALL_SUBCLASSES(DEFINE_OPEQ_FUNC)
121#undef DEFINE_OPEQ_FUNC
122 virtual void visit_children(Visitor &, const char * /*name*/ = nullptr) {}
123 virtual void visit_children(Visitor &, const char * /*name*/ = nullptr) const {}
124
125 bool operator!=(const Node &n) const { return !operator==(n); }
126
130 template <typename Sink>
131 friend void AbslStringify(Sink &sink, const IR::Node *n) {
132 sink.Append(n->toString());
133 }
134
135 DECLARE_TYPEINFO_WITH_TYPEID(Node, NodeKind::Node, INode);
136};
137
138// simple version of dbprint
139cstring dbp(const INode *node);
140
141inline bool equal(const Node *a, const Node *b) { return a == b || (a && b && *a == *b); }
142inline bool equal(const INode *a, const INode *b) {
143 return a == b || (a && b && *a->getNode() == *b->getNode());
144}
145inline bool equiv(const Node *a, const Node *b) { return a == b || (a && b && a->equiv(*b)); }
146inline bool equiv(const INode *a, const INode *b) {
147 return a == b || (a && b && a->getNode()->equiv(*b->getNode()));
148}
149// NOLINTBEGIN(bugprone-macro-parentheses)
150/* common things that ALL Node subclasses must define */
151#define IRNODE_SUBCLASS(T) \
152 public: \
153 T *clone() const override { return new T(*this); } \
154 IRNODE_COMMON_SUBCLASS(T)
155#define IRNODE_ABSTRACT_SUBCLASS(T) \
156 public: \
157 T *clone() const override = 0; \
158 IRNODE_COMMON_SUBCLASS(T)
159
160// NOLINTEND(bugprone-macro-parentheses)
161#define IRNODE_COMMON_SUBCLASS(T) \
162 public: \
163 using Node::operator==; \
164 bool apply_visitor_preorder(Modifier &v) override; \
165 void apply_visitor_postorder(Modifier &v) override; \
166 void apply_visitor_revisit(Modifier &v, const Node *n) const override; \
167 void apply_visitor_loop_revisit(Modifier &v) const override; \
168 bool apply_visitor_preorder(Inspector &v) const override; \
169 void apply_visitor_postorder(Inspector &v) const override; \
170 void apply_visitor_revisit(Inspector &v) const override; \
171 void apply_visitor_loop_revisit(Inspector &v) const override; \
172 const Node *apply_visitor_preorder(Transform &v) override; \
173 const Node *apply_visitor_postorder(Transform &v) override; \
174 void apply_visitor_revisit(Transform &v, const Node *n) const override; \
175 void apply_visitor_loop_revisit(Transform &v) const override;
176
177/* only define 'apply' for a limited number of classes (those we want to call
178 * visitors directly on), as defining it and making it virtual would mean that
179 * NO Transform could transform the class into a sibling class */
180#define IRNODE_DECLARE_APPLY_OVERLOAD(T) \
181 const T *apply(Visitor &v, const Visitor_Context *ctxt = nullptr) const; \
182 const T *apply(Visitor &&v, const Visitor_Context *ctxt = nullptr) const { \
183 return apply(v, ctxt); \
184 }
185#define IRNODE_DEFINE_APPLY_OVERLOAD(CLASS, TEMPLATE, TT) \
186 TEMPLATE \
187 const IR::CLASS TT *IR::CLASS TT::apply(Visitor &v, const Visitor_Context *ctxt) const { \
188 const CLASS *tmp = this; \
189 auto prof = v.init_apply(tmp, ctxt); \
190 v.visit(tmp); \
191 v.end_apply(tmp); \
192 return tmp; \
193 }
194
195} // namespace P4::IR
196
197#endif /* IR_NODE_H_ */
Definition inode.h:48
Definition indexed_vector.h:40
Definition node.h:53
friend void AbslStringify(Sink &sink, const IR::Node *n)
Definition node.h:131
Definition ir/vector.h:59
Definition visitor.h:413
Definition json_generator.h:39
Definition json_loader.h:41
Definition visitor.h:385
Definition visitor.h:437
Definition lib/json.h:177
Definition source_file.h:132
Definition visitor.h:75
Definition cstring.h:85
Definition constantParsing.h:22
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24
Definition bson.cpp:69
virtual TypeId typeId() const noexcept=0
Definition visitor.h:47