8#ifndef FRONTENDS_P4_SPECIALIZEGENERICFUNCTIONS_H_
9#define FRONTENDS_P4_SPECIALIZEGENERICFUNCTIONS_H_
11#include "frontends/common/resolveReferences/referenceMap.h"
12#include "frontends/common/resolveReferences/resolveReferences.h"
13#include "frontends/p4/typeChecking/typeChecker.h"
19struct FunctionSpecialization {
32 const IR::Function *function,
const IR::Node *insert)
49 std::set<FunctionSpecialization *> inserted;
51 void add(
const IR::MethodCallExpression *mce,
const IR::Function *func,
const IR::Node *insert,
53 cstring name = nameGen->newName(func->name.string_view());
57 return ::P4::get(map, mce);
62 if (inserted.find(s.second) != inserted.end())
continue;
63 if (s.second->insertBefore == insertionPoint) {
65 LOG2(
"Will insert " << dbp(s.second->specialized) <<
" before "
66 << dbp(insertionPoint));
67 result->push_back(s.second->specialized);
68 inserted.emplace(s.second);
78class FindFunctionSpecializations :
public Inspector,
public ResolutionContext {
85 setName(
"FindFunctionSpecializations");
88 bool preorder(
const IR::MethodCallExpression *call)
override;
117 setName(
"SpecializeFunctions");
119 const IR::Node *postorder(IR::Function *function)
override;
120 const IR::Node *postorder(IR::MethodCallExpression *)
override;
122 const IR::Node *preorder(IR::P4Control *control)
override {
return insert(control); }
123 const IR::Node *preorder(IR::P4Parser *parser)
override {
return insert(parser); }
124 const IR::Node *preorder(IR::Function *function)
override {
return insert(function); }
127class SpecializeGenericFunctions :
public PassManager {
131 explicit SpecializeGenericFunctions(
TypeMap *typeMap) {
132 passes.emplace_back(
new TypeChecking(
nullptr, typeMap));
135 specMap.typeMap = typeMap;
136 setName(
"SpecializeGenericFunctions");
Definition specializeGenericFunctions.h:78
Definition ir/vector.h:59
Definition referenceMap.h:36
Definition referenceMap.h:29
Specializes each generic function by substituting type parameters.
Definition specializeGenericFunctions.h:111
Definition typeChecker.h:55
Definition ordered_map.h:32
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13
Describes how a generic function is specialized.
Definition specializeGenericFunctions.h:19
const IR::Function * specialized
Result of specialization.
Definition specializeGenericFunctions.h:25
const IR::Node * insertBefore
Point in IR tree where to insert the function.
Definition specializeGenericFunctions.h:29
const IR::Function * original
Function that is being specialized.
Definition specializeGenericFunctions.h:23
const IR::MethodCallExpression * invocation
Invocation which causes this specialization.
Definition specializeGenericFunctions.h:27
cstring name
Name to use for specialized function.
Definition specializeGenericFunctions.h:21
Definition specializeGenericFunctions.h:44