P4C
The P4 Compiler
Loading...
Searching...
No Matches
specialize.h
1/*
2 * Copyright 2016 VMware, Inc.
3 * SPDX-FileCopyrightText: 2016 VMware, Inc.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef FRONTENDS_P4_SPECIALIZE_H_
9#define FRONTENDS_P4_SPECIALIZE_H_
10
11#include "frontends/common/resolveReferences/referenceMap.h"
12#include "frontends/common/resolveReferences/resolveReferences.h"
13#include "frontends/p4/typeMap.h"
14#include "ir/ir.h"
15#include "ir/pass_manager.h"
16
17namespace P4 {
18
19class FrontEndPolicy; // full definition not needed here
20
22struct SpecializationInfo {
26 const IR::IContainer *specialized;
37
38 SpecializationInfo(const IR::Node *invocation, const IR::IContainer *cont,
39 const IR::Node *insertion)
40 : specialized(cont),
41 typeArguments(nullptr),
42 constructorArguments(new IR::Vector<IR::Argument>()),
44 insertBefore(insertion) {
45 CHECK_NULL(cont);
46 CHECK_NULL(invocation);
47 CHECK_NULL(insertion);
48 }
49 const IR::Type_Declaration *synthesize(const Visitor::Context *ctxt);
50};
51
56
57 public:
58 TypeMap *typeMap = nullptr;
65 void addSpecialization(const IR::ConstructorCallExpression *invocation,
66 const IR::IContainer *container, const IR::Node *insertion,
67 DeclarationLookup *declLookup, NameGenerator *nameGen);
74 void addSpecialization(const IR::Declaration_Instance *invocation,
75 const IR::IContainer *container, const IR::Node *insertion,
76 DeclarationLookup *declLookup, NameGenerator *nameGen);
77 IR::Vector<IR::Node> *getSpecializations(const IR::Node *insertion,
78 const Visitor::Context *ctxt) const;
79 cstring getName(const IR::Node *insertion) const {
80 auto s = ::P4::get(specializations, insertion);
81 if (s == nullptr) return nullptr;
82 return s->name;
83 }
84 void clear() { specializations.clear(); }
85};
86
90class FindSpecializations : public Inspector, public ResolutionContext {
91 SpecializationMap *specMap;
93
94 public:
95 explicit FindSpecializations(SpecializationMap *specMap) : specMap(specMap) {
96 CHECK_NULL(specMap);
97 setName("FindSpecializations");
98 }
99
100 const IR::Node *findInsertionPoint() const;
101 bool isSimpleConstant(const IR::Expression *expression) const;
102 Visitor::profile_t init_apply(const IR::Node *node) override {
103 auto rv = Inspector::init_apply(node);
104
105 specMap->clear();
106 node->apply(nameGen);
107
108 return rv;
109 }
113 bool noParameters(const IR::IContainer *container);
114
115 bool preorder(const IR::P4Parser *parser) override { return noParameters(parser); }
116 bool preorder(const IR::P4Control *control) override { return noParameters(control); }
117 void postorder(const IR::ConstructorCallExpression *expression) override;
118 void postorder(const IR::Declaration_Instance *decl) override;
119
120 bool preorder(const IR::Parameter *) override {
121 // This prevents specialization of the default values of
122 // parameters; we don't care to specialize these, we only need
123 // to specialize them if they appear in a call.
124 return false;
125 }
126};
127
163class Specialize : public Transform {
164 SpecializationMap *specMap;
165 const IR::Node *instantiate(const IR::Node *node, const Visitor::Context *ctxt);
166
167 public:
168 explicit Specialize(SpecializationMap *specMap) : specMap(specMap) {
169 CHECK_NULL(specMap);
170 setName("Specialize");
171 }
172 const IR::Node *postorder(IR::P4Parser *parser) override {
173 return instantiate(parser, getContext());
174 }
175 // skip packages
176 const IR::Node *preorder(IR::Type_Package *package) override {
177 prune();
178 return package;
179 }
180 const IR::Node *postorder(IR::P4Control *control) override {
181 return instantiate(control, getContext());
182 }
183 const IR::Node *postorder(IR::ConstructorCallExpression *expression) override;
184 const IR::Node *postorder(IR::Declaration_Instance *) override;
185};
186
211class SpecializeAll : public PassRepeated {
212 SpecializationMap specMap;
213
214 public:
215 SpecializeAll(TypeMap *typeMap, FrontEndPolicy *policy);
216};
217
218} // namespace P4
219
220#endif /* FRONTENDS_P4_SPECIALIZE_H_ */
Definition referenceMap.h:57
bool noParameters(const IR::IContainer *container)
Definition specialize.cpp:185
Definition frontends/p4/frontend.h:33
Definition indexed_vector.h:31
Definition node.h:53
Definition ir/vector.h:59
Definition visitor.h:418
Definition referenceMap.h:36
Definition referenceMap.h:29
Maintains a map from invocation to a SpecializationInfo object.
Definition specialize.h:53
void addSpecialization(const IR::ConstructorCallExpression *invocation, const IR::IContainer *container, const IR::Node *insertion, DeclarationLookup *declLookup, NameGenerator *nameGen)
Definition specialize.cpp:72
Definition visitor.h:442
Definition typeMap.h:32
Definition visitor.h:78
Definition cstring.h:85
Definition ordered_map.h:32
The namespace encapsulating IR node classes.
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13
const IR::IContainer * specialized
Actual parser or control that is being specialized.
Definition specialize.h:26
cstring name
Name to use for specialized object.
Definition specialize.h:24
const IR::Node * insertBefore
Where in the program should the specialization be inserted.
Definition specialize.h:36
const IR::Node * invocation
Invocation which causes this specialization.
Definition specialize.h:34
IR::IndexedVector< IR::Declaration > declarations
Declarations to insert in the list of locals.
Definition specialize.h:32
const IR::Vector< IR::Type > * typeArguments
Values to substitute for type arguments.
Definition specialize.h:28
IR::Vector< IR::Argument > * constructorArguments
Values to substitute for constructor arguments.
Definition specialize.h:30