17#ifndef FRONTENDS_P4_ACTIONSINLINING_H_
18#define FRONTENDS_P4_ACTIONSINLINING_H_
20#include "commonInlining.h"
21#include "frontends/common/resolveReferences/resolveReferences.h"
22#include "frontends/p4/typeChecking/typeChecker.h"
23#include "frontends/p4/unusedDeclarations.h"
32class DiscoverActionsInlining :
public Inspector,
public ResolutionContext {
33 ActionsInlineList *toInline;
36 DiscoverActionsInlining(ActionsInlineList *toInline,
P4::TypeMap *typeMap)
37 : toInline(toInline), typeMap(typeMap) {
40 setName(
"DiscoverActionsInlining");
42 bool preorder(
const IR::P4Parser *)
override {
return false; }
43 void postorder(
const IR::MethodCallStatement *mcs)
override;
47class ActionsInliner :
public AbstractInliner<ActionsInlineList, AInlineWorkList> {
48 std::unique_ptr<MinimalNameGenerator> nameGen;
49 AInlineWorkList::ReplacementMap *replMap;
52 ActionsInliner() : replMap(
nullptr) {}
54 const IR::Node *preorder(IR::P4Parser *cont)
override {
58 const IR::Node *preorder(IR::P4Action *action)
override;
59 const IR::Node *postorder(IR::P4Action *action)
override;
60 const IR::Node *preorder(IR::MethodCallStatement *statement)
override;
65class InlineActions :
public PassManager {
66 ActionsInlineList actionsToInline;
72 passes.push_back(
new InlineActionsDriver(&actionsToInline,
new ActionsInliner()));
75 setName(
"InlineActions");
85 const IR::V1Program *global;
86 class SubstActionArgs :
public Transform {
87 const IR::ActionFunction *function;
88 const IR::Primitive *callsite;
89 const IR::Node *postorder(IR::ActionArg *arg)
override {
90 for (
unsigned i = 0; i < function->args.size(); ++i)
91 if (function->args[i] == getOriginal())
return callsite->operands[i];
92 BUG(
"Action arg not argument of action");
97 SubstActionArgs(
const IR::ActionFunction *f,
const IR::Primitive *c)
98 : function(f), callsite(c) {}
100 const IR::V1Program *preorder(IR::V1Program *gl)
override {
return global = gl; }
101 const IR::Node *preorder(IR::Primitive *p)
override {
102 if (
auto af = global->get<IR::ActionFunction>(p->name)) {
103 SubstActionArgs saa(af, p);
104 saa.setCalledBy(
this);
105 return af->action.clone()->apply(saa);
Definition actionsInlining.h:47
Definition actionsInlining.h:32
Definition commonInlining.h:178
Special inliner which works directly on P4-14 representation.
Definition actionsInlining.h:84
Class used to encode maps from paths to declarations.
Definition referenceMap.h:66
Iterates RemoveUnusedDeclarations until convergence.
Definition unusedDeclarations.h:146
Definition unusedDeclarations.h:28
Definition resolveReferences.h:121
Definition commonInlining.h:39
Definition commonInlining.h:92
Definition commonInlining.h:66
Definition typeChecker.h:55
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24