8#ifndef MIDEND_FLATTENUNIONS_H_
9#define MIDEND_FLATTENUNIONS_H_
11#include "./frontends/p4/parserControlFlow.h"
12#include "./frontends/p4/simplifyDefUse.h"
13#include "./frontends/p4/unusedDeclarations.h"
14#include "frontends/p4/typeChecking/typeChecker.h"
43 std::map<cstring, std::map<cstring, cstring>> replacementMap;
45 std::map<IR::Declaration_Variable *, IR::IndexedVector<IR::Declaration>> replaceDVMap;
49 : refMap(refMap), typeMap(typeMap) {}
50 const IR::Node *postorder(IR::Type_Struct *sf)
override;
51 const IR::Node *postorder(IR::Declaration_Variable *dv)
override;
52 const IR::Node *postorder(IR::Member *m)
override;
53 const IR::Node *postorder(IR::P4Parser *parser)
override;
54 const IR::Node *postorder(IR::P4Control *control)
override;
55 const IR::Node *postorder(IR::P4Action *action)
override;
56 bool hasHeaderUnionField(IR::Type_Struct *s);
85class DoFlattenHeaderUnionStack :
public DoFlattenHeaderUnion {
86 std::map<cstring, std::vector<cstring>> stackMap;
90 : DoFlattenHeaderUnion(refMap, typeMap) {
91 setName(
"DoFlattenHeaderUnionStack");
93 const IR::Node *postorder(IR::Type_Struct *sf)
override;
94 const IR::Node *postorder(IR::ArrayIndex *e)
override;
95 const IR::Node *postorder(IR::Declaration_Variable *dv)
override;
96 bool hasHeaderUnionStackField(IR::Type_Struct *s);
138 : refMap(refMap), typeMap(typeMap) {
139 setName(
"HandleValidityHeaderUnion");
141 const IR::Node *postorder(IR::AssignmentStatement *assn)
override;
142 const IR::Node *postorder(IR::IfStatement *a)
override;
143 const IR::Node *postorder(IR::SwitchStatement *a)
override;
144 const IR::Node *postorder(IR::MethodCallStatement *mcs)
override;
145 const IR::Node *postorder(IR::P4Parser *parser)
override;
146 const IR::Node *postorder(IR::P4Control *control)
override;
147 const IR::Node *postorder(IR::P4Action *action)
override;
148 const IR::MethodCallStatement *processValidityForStr(
const IR::Statement *s,
149 const IR::Member *m,
cstring headerElement,
151 const IR::Node *setInvalidforRest(
const IR::Statement *s,
const IR::Member *m,
152 const IR::Type_HeaderUnion *hu,
cstring exclude,
153 bool setValidforCurrMem);
154 const IR::Node *expandIsValid(
const IR::Statement *a,
const IR::MethodCallExpression *mce,
162 explicit RemoveUnusedHUDeclarations(
const UsedDeclSet &used) : used(used) {}
164 const IR::Node *preorder(IR::Type_HeaderUnion *type)
override {
165 if (!used.isUsed(getOriginal<IR::IDeclaration>()))
return nullptr;
170class RemoveAllUnusedHUDDeclarations :
public PassManager {
174 RemoveAllUnusedHUDDeclarations()
179 setName(
"RemoveAllUnusedHUDDeclarations");
180 setStopOnError(
true);
190class FlattenHeaderUnion :
public PassManager {
Definition typeChecker.h:32
Collects all used declarations into @used set.
Definition unusedDeclarations.h:59
Definition flattenUnions.h:131
Definition indexed_vector.h:31
Class used to encode maps from paths to declarations.
Definition referenceMap.h:67
Iterates UnusedDeclarations until convergence.
Definition unusedDeclarations.h:196
Definition flattenUnions.h:170
Definition parserControlFlow.h:105
Definition flattenUnions.h:158
Definition unusedDeclarations.h:48
Definition typeChecker.h:55
Definition typeChecker.h:491
Definition unusedDeclarations.h:29
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13