17#ifndef FRONTENDS_P4_SPECIALIZEGENERICFUNCTIONS_H_
18#define FRONTENDS_P4_SPECIALIZEGENERICFUNCTIONS_H_
20#include "frontends/common/resolveReferences/referenceMap.h"
21#include "frontends/p4/typeChecking/typeChecker.h"
40 const IR::Function *function,
const IR::Node *insert)
58 std::set<FunctionSpecialization *> inserted;
60 void add(
const IR::MethodCallExpression *mce,
const IR::Function *func,
61 const IR::Node *insert) {
67 return ::get(map, mce);
72 if (inserted.find(s.second) != inserted.end())
continue;
73 if (s.second->insertBefore == insertionPoint) {
75 LOG2(
"Will insert " << dbp(s.second->specialized) <<
" before "
76 << dbp(insertionPoint));
77 result->push_back(s.second->specialized);
78 inserted.emplace(s.second);
94 setName(
"FindFunctionSpecializations");
97 bool preorder(
const IR::MethodCallExpression *call)
override;
125 setName(
"SpecializeFunctions");
127 const IR::Node *postorder(IR::Function *function)
override;
128 const IR::Node *postorder(IR::MethodCallExpression *)
override;
129 const IR::Node *insert(
const IR::Node *before);
130 const IR::Node *preorder(IR::P4Control *control)
override {
return insert(control); }
131 const IR::Node *preorder(IR::P4Parser *parser)
override {
return insert(parser); }
132 const IR::Node *preorder(IR::Function *function)
override {
return insert(function); }
143 specMap.refMap = refMap;
144 specMap.typeMap = typeMap;
145 setName(
"SpecializeGenericFunctions");
Definition externInstance.h:33
Definition specializeGenericFunctions.h:88
Class used to encode maps from paths to declarations.
Definition referenceMap.h:66
cstring newName(cstring base) override
Generate a name from base that fresh for the program.
Definition referenceMap.cpp:96
Specializes each generic function by substituting type parameters.
Definition specializeGenericFunctions.h:119
Definition specializeGenericFunctions.h:135
Definition typeChecker.h:60
Definition ordered_map.h:30
Definition applyOptionsPragmas.cpp:24
Describes how a generic function is specialized.
Definition specializeGenericFunctions.h:27
const IR::Function * specialized
Result of specialization.
Definition specializeGenericFunctions.h:33
const IR::Node * insertBefore
Point in IR tree where to insert the function.
Definition specializeGenericFunctions.h:37
const IR::Function * original
Function that is being specialized.
Definition specializeGenericFunctions.h:31
const IR::MethodCallExpression * invocation
Invocation which causes this specialization.
Definition specializeGenericFunctions.h:35
cstring name
Name to use for specialized function.
Definition specializeGenericFunctions.h:29
Definition specializeGenericFunctions.h:52