P4C
The P4 Compiler
Loading...
Searching...
No Matches
functionsInlining.h
1/*
2 * Copyright 2018 VMware, Inc.
3 * SPDX-FileCopyrightText: 2018 VMware, Inc.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef FRONTENDS_P4_FUNCTIONSINLINING_H_
9#define FRONTENDS_P4_FUNCTIONSINLINING_H_
10
11#include "commonInlining.h"
12#include "frontends/common/resolveReferences/referenceMap.h"
13#include "frontends/common/resolveReferences/resolveReferences.h"
14#include "frontends/p4/typeChecking/typeChecker.h"
15#include "frontends/p4/unusedDeclarations.h"
16#include "ir/ir.h"
17
18namespace P4 {
19using FunctionCallInfo = SimpleCallInfo<IR::Node, IR::Statement>;
20using FunctionsInlineWorkList = SimpleInlineWorkList<FunctionCallInfo>;
22
23class DiscoverFunctionsInlining : public Inspector, public ResolutionContext {
24 FunctionsInlineList *toInline; // output
25 P4::TypeMap *typeMap; // input
26
27 public:
28 DiscoverFunctionsInlining(FunctionsInlineList *toInline, P4::TypeMap *typeMap)
29 : toInline(toInline), typeMap(typeMap) {
30 CHECK_NULL(toInline);
31 CHECK_NULL(typeMap);
32 setName("DiscoverFunctionsInlining");
33 }
34 Visitor::profile_t init_apply(const IR::Node *node) override;
35 void postorder(const IR::MethodCallExpression *mce) override;
36};
37
42class FunctionsInliner : public AbstractInliner<FunctionsInlineList, FunctionsInlineWorkList> {
43 std::unique_ptr<MinimalNameGenerator> nameGen;
44
45 // All elements in the replacement map are actually IR::Function objects
46 using ReplacementMap = FunctionsInlineWorkList::ReplacementMap;
48 std::vector<ReplacementMap *> replacementStack;
50 std::unordered_map<const IR::MethodCallExpression *, const IR::Expression *>
51 pendingReplacements;
52
57 const IR::Expression *cloneBody(const IR::IndexedVector<IR::StatOrDecl> &src,
60 const IR::Statement *inlineBefore(const IR::Node *calleeNode,
61 const IR::MethodCallExpression *call,
62 const IR::Statement *before);
63 bool preCaller();
64 const IR::Node *postCaller(const IR::Node *caller);
65 const ReplacementMap *getReplacementMap() const;
66 void dumpReplacementMap() const;
67 class isLocalExpression; // functor to test actual arguments scope use
68
69 public:
70 FunctionsInliner() = default;
71 Visitor::profile_t init_apply(const IR::Node *node) override;
72 void end_apply(const IR::Node *node) override;
73 const IR::Node *preorder(IR::Function *function) override;
74 const IR::Node *preorder(IR::P4Control *control) override;
75 const IR::Node *preorder(IR::P4Parser *parser) override;
76 const IR::Node *preorder(IR::P4Action *action) override;
77 const IR::Node *preorder(IR::MethodCallStatement *statement) override;
78 const IR::Node *preorder(IR::MethodCallExpression *expr) override;
79 const IR::Node *preorder(IR::BaseAssignmentStatement *statement) override;
80 const IR::Node *preorder(IR::IfStatement *statement) override;
81};
82
84
87class CloneVariableDeclarations : public Transform {
88 public:
89 CloneVariableDeclarations() {
90 setName("CloneVariableDeclarations");
91 visitDagOnce = false;
92 }
93 const IR::Node *postorder(IR::Declaration_Variable *declaration) override {
94 // this will have a different declid
95 auto result = new IR::Declaration_Variable(declaration->srcInfo, declaration->getName(),
96 declaration->annotations, declaration->type,
97 declaration->initializer);
98 LOG3("Cloned " << dbp(result));
99 return result;
100 }
101};
102
103class InlineFunctions : public PassManager {
104 FunctionsInlineList functionsToInline;
105
106 public:
107 InlineFunctions(TypeMap *typeMap, const RemoveUnusedPolicy &policy) {
108 passes.push_back(
109 new PassRepeated({new TypeChecking(nullptr, typeMap),
110 new DiscoverFunctionsInlining(&functionsToInline, typeMap),
111 new InlineFunctionsDriver(&functionsToInline, new FunctionsInliner()),
112 new RemoveAllUnusedDeclarations(policy)}));
113 passes.push_back(new CloneVariableDeclarations());
114 setName("InlineFunctions");
115 }
116};
117
118} // namespace P4
119
120#endif /* FRONTENDS_P4_FUNCTIONSINLINING_H_ */
Definition functionsInlining.h:87
Definition functionsInlining.h:23
Definition functionsInlining.cpp:68
Definition functionsInlining.h:42
Definition indexed_vector.h:31
Definition node.h:53
Definition commonInlining.h:169
Definition visitor.h:418
Definition ir/pass_manager.h:146
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 visitor.h:442
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