17#ifndef FRONTENDS_P4_SPECIALIZEGENERICTYPES_H_
18#define FRONTENDS_P4_SPECIALIZEGENERICTYPES_H_
20#include "frontends/common/resolveReferences/referenceMap.h"
21#include "frontends/p4/typeChecking/typeChecker.h"
42 const IR::Type_Declaration *decl,
const IR::Node *
insertion,
55 void dbprint(std::ostream &out)
const override {
68 std::set<TypeSpecialization *> inserted;
70 void add(
const IR::Type_Specialized *t,
const IR::Type_StructLike *decl,
71 const IR::Node *insertion);
74 void dbprint(std::ostream &out)
const override {
76 out << dbp(it.first) <<
" => " << it.second << std::endl;
82 if (inserted.find(s.second) != inserted.end())
continue;
83 if (s.second->insertion == insertionPoint) {
85 LOG2(
"Will insert " << dbp(s.second->replacement) <<
" before "
86 << dbp(insertionPoint));
87 result->push_back(s.second->replacement);
88 inserted.emplace(s.second);
104 setName(
"FindTypeSpecializations");
107 void postorder(
const IR::Type_Specialized *type)
override;
120 setName(
"CreateSpecializedTypes");
123 const IR::Node *insert(
const IR::Node *before);
124 const IR::Node *postorder(IR::Type_Declaration *type)
override;
125 const IR::Node *postorder(IR::Declaration *decl)
override {
return insert(decl); }
137 setName(
"ReplaceTypeUses");
140 const IR::Node *postorder(IR::Type_Specialized *type)
override;
141 const IR::Node *postorder(IR::StructExpression *expresison)
override;
166 passes.emplace_back(
new PassRepeated({
177 specMap.refMap = refMap;
178 specMap.typeMap = typeMap;
179 setName(
"SpecializeGenericTypes");
188 const IR::Node *postorder(IR::Type_StructLike *type)
override {
189 if (!type->typeParameters->empty())
return nullptr;
192 const IR::Node *postorder(IR::Type_Stack *type)
override {
193 if (type->elementType->is<IR::Type_Specialized>())
return nullptr;
Definition source_file.h:38
Definition externInstance.h:33
Definition typeChecker.h:37
Definition specializeGenericTypes.h:114
Definition specializeGenericTypes.h:98
Class used to encode maps from paths to declarations.
Definition referenceMap.h:66
Removes all structs or stacks that are generic.
Definition specializeGenericTypes.h:186
Definition specializeGenericTypes.h:132
Specializes each generic type by substituting type parameters.
Definition specializeGenericTypes.h:161
Definition typeChecker.h:60
Definition ordered_map.h:30
Definition applyOptionsPragmas.cpp:24
Definition specializeGenericTypes.h:26
const IR::Vector< IR::Type > * argumentTypes
Definition specializeGenericTypes.h:39
const IR::Type_StructLike * replacement
New synthesized type (created later)
Definition specializeGenericTypes.h:34
const IR::Type_Declaration * declaration
Declaration of specialized type, which will be replaced.
Definition specializeGenericTypes.h:32
const IR::Type_Specialized * specialized
Type that is being specialized.
Definition specializeGenericTypes.h:30
cstring name
Name to use for specialized type.
Definition specializeGenericTypes.h:28
const IR::Node * insertion
Insertion point.
Definition specializeGenericTypes.h:36
Definition specializeGenericTypes.h:61