17#ifndef FRONTENDS_P4_ACTIONSINLINING_H_
18#define FRONTENDS_P4_ACTIONSINLINING_H_
20#include "commonInlining.h"
21#include "frontends/p4/typeChecking/typeChecker.h"
22#include "frontends/p4/unusedDeclarations.h"
27typedef SimpleCallInfo<IR::P4Action, IR::MethodCallStatement> ActionCallInfo;
28typedef SimpleInlineWorkList<IR::P4Action, IR::MethodCallStatement, ActionCallInfo> AInlineWorkList;
29typedef SimpleInlineList<IR::P4Action, ActionCallInfo, AInlineWorkList> ActionsInlineList;
38 : toInline(toInline), refMap(refMap), typeMap(typeMap) {
42 setName(
"DiscoverActionsInlining");
44 bool preorder(
const IR::P4Parser *)
override {
return false; }
45 void postorder(
const IR::MethodCallStatement *mcs)
override;
51 std::map<const IR::MethodCallStatement *, const IR::P4Action *> *replMap;
55 Visitor::profile_t init_apply(
const IR::Node *node)
override;
56 const IR::Node *preorder(IR::P4Parser *cont)
override {
60 const IR::Node *preorder(IR::P4Action *action)
override;
61 const IR::Node *postorder(IR::P4Action *action)
override;
62 const IR::Node *preorder(IR::MethodCallStatement *statement)
override;
76 setName(
"InlineActions");
86 const IR::V1Program *global;
87 class SubstActionArgs :
public Transform {
88 const IR::ActionFunction *function;
89 const IR::Primitive *callsite;
90 const IR::Node *postorder(IR::ActionArg *arg)
override {
91 for (
unsigned i = 0; i < function->args.size(); ++i)
92 if (function->args[i] == getOriginal())
return callsite->operands[i];
93 BUG(
"Action arg not argument of action");
98 SubstActionArgs(
const IR::ActionFunction *f,
const IR::Primitive *c)
99 : function(f), callsite(c) {}
101 const IR::V1Program *preorder(IR::V1Program *gl)
override {
return global = gl; }
102 const IR::Node *preorder(IR::Primitive *p)
override {
103 if (
auto af = global->get<IR::ActionFunction>(p->name)) {
104 SubstActionArgs saa(af, p);
105 saa.setCalledBy(
this);
106 return af->action.clone()->apply(saa);
Definition commonInlining.h:137
Definition actionsInlining.h:49
Definition actionsInlining.h:31
Definition actionsInlining.h:67
Definition commonInlining.h:158
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 typeChecker.h:60
Special inliner which works directly on P4-14 representation.
Definition actionsInlining.h:85
Definition applyOptionsPragmas.cpp:24