P4C
The P4 Compiler
Loading...
Searching...
No Matches
p4/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
71#ifdef SUPPORT_P4_14
72#include "frontends/p4-14/actionsInlining.h"
73#endif
74
75#endif /* FRONTENDS_P4_ACTIONSINLINING_H_ */
Definition p4/actionsInlining.h:38
Definition p4/actionsInlining.h:23
Definition node.h:44
Definition commonInlining.h:169
Definition visitor.h:409
Iterates UnusedDeclarations until convergence.
Definition unusedDeclarations.h:187
Definition unusedDeclarations.h:39
Definition commonInlining.h:30
Definition commonInlining.h:83
Definition commonInlining.h:57
Definition typeChecker.h:46
Definition typeMap.h:32
Definition visitor.h:69
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13