P4C
The P4 Compiler
Loading...
Searching...
No Matches
actionsInlining.h
1/*
2 * SPDX-FileCopyrightText: 2013 Barefoot Networks, Inc.
3 * Copyright 2013-present Barefoot Networks, Inc.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef FRONTENDS_P4_ACTIONSINLINING_H_
9#define FRONTENDS_P4_ACTIONSINLINING_H_
10
11#include "commonInlining.h"
12#include "frontends/common/resolveReferences/resolveReferences.h"
13#include "frontends/p4/typeChecking/typeChecker.h"
14#include "frontends/p4/unusedDeclarations.h"
15#include "ir/ir.h"
16
17namespace P4 {
18
20using AInlineWorkList = SimpleInlineWorkList<ActionCallInfo>;
22
23class DiscoverActionsInlining : public Inspector, public ResolutionContext {
24 ActionsInlineList *toInline; // output
25 P4::TypeMap *typeMap; // input
26 public:
27 DiscoverActionsInlining(ActionsInlineList *toInline, P4::TypeMap *typeMap)
28 : toInline(toInline), typeMap(typeMap) {
29 CHECK_NULL(toInline);
30 CHECK_NULL(typeMap);
31 setName("DiscoverActionsInlining");
32 }
33 bool preorder(const IR::P4Parser *) override { return false; } // skip
34 void postorder(const IR::MethodCallStatement *mcs) override;
35};
36
37// General-purpose actions inliner.
38class ActionsInliner : public AbstractInliner<ActionsInlineList, AInlineWorkList> {
39 std::unique_ptr<MinimalNameGenerator> nameGen;
40 AInlineWorkList::ReplacementMap *replMap;
41
42 public:
43 ActionsInliner() : replMap(nullptr) {}
44 Visitor::profile_t init_apply(const IR::Node *node) override;
45 const IR::Node *preorder(IR::P4Parser *cont) override {
46 prune();
47 return cont;
48 } // skip
49 const IR::Node *preorder(IR::P4Action *action) override;
50 const IR::Node *postorder(IR::P4Action *action) override;
51 const IR::Node *preorder(IR::MethodCallStatement *statement) override;
52};
53
54typedef InlineDriver<ActionsInlineList, AInlineWorkList> InlineActionsDriver;
55
56class InlineActions : public PassManager {
57 ActionsInlineList actionsToInline;
58
59 public:
60 InlineActions(TypeMap *typeMap, const RemoveUnusedPolicy &policy) {
61 passes.push_back(new TypeChecking(nullptr, typeMap));
62 passes.push_back(new DiscoverActionsInlining(&actionsToInline, typeMap));
63 passes.push_back(new InlineActionsDriver(&actionsToInline, new ActionsInliner()));
64 passes.push_back(new RemoveAllUnusedDeclarations(policy));
65 setName("InlineActions");
66 }
67};
68
69} // namespace P4
70
71namespace P4::P4_14 {
72
74class InlineActions : public Transform {
75 const IR::V1Program *global;
76 class SubstActionArgs : public Transform {
77 const IR::ActionFunction *function;
78 const IR::Primitive *callsite;
79 const IR::Node *postorder(IR::ActionArg *arg) override {
80 for (unsigned i = 0; i < function->args.size(); ++i)
81 if (function->args[i] == getOriginal()) return callsite->operands[i];
82 BUG("Action arg not argument of action");
83 return arg;
84 }
85
86 public:
87 SubstActionArgs(const IR::ActionFunction *f, const IR::Primitive *c)
88 : function(f), callsite(c) {}
89 };
90 const IR::V1Program *preorder(IR::V1Program *gl) override { return global = gl; }
91 const IR::Node *preorder(IR::Primitive *p) override {
92 if (auto af = global->get<IR::ActionFunction>(p->name)) {
93 SubstActionArgs saa(af, p);
94 saa.setCalledBy(this);
95 return af->action.clone()->apply(saa);
96 }
97 return p;
98 }
99};
100
101} // namespace P4::P4_14
102
103#endif /* FRONTENDS_P4_ACTIONSINLINING_H_ */
Definition actionsInlining.h:38
Definition actionsInlining.h:23
Definition node.h:53
Definition commonInlining.h:169
Definition visitor.h:418
Special inliner which works directly on P4-14 representation.
Definition actionsInlining.h:74
Iterates UnusedDeclarations until convergence.
Definition unusedDeclarations.h:196
Definition unusedDeclarations.h:48
Definition commonInlining.h:30
Definition commonInlining.h:83
Definition commonInlining.h:57
Definition typeChecker.h:55
Definition typeMap.h:32
Definition visitor.h:78
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13