32class DiscoverFunctionsInlining :
public Inspector,
public ResolutionContext {
33 FunctionsInlineList *toInline;
37 DiscoverFunctionsInlining(FunctionsInlineList *toInline,
P4::TypeMap *typeMap)
38 : toInline(toInline), typeMap(typeMap) {
41 setName(
"DiscoverFunctionsInlining");
44 void postorder(
const IR::MethodCallExpression *mce)
override;
51class FunctionsInliner :
public AbstractInliner<FunctionsInlineList, FunctionsInlineWorkList> {
52 std::unique_ptr<MinimalNameGenerator> nameGen;
55 using ReplacementMap = FunctionsInlineWorkList::ReplacementMap;
57 std::vector<ReplacementMap *> replacementStack;
59 std::unordered_map<const IR::MethodCallExpression *, const IR::Expression *>
69 const IR::Statement *inlineBefore(
const IR::Node *calleeNode,
70 const IR::MethodCallExpression *call,
71 const IR::Statement *before);
74 const ReplacementMap *getReplacementMap()
const;
75 void dumpReplacementMap()
const;
79 FunctionsInliner() =
default;
81 void end_apply(
const IR::Node *node)
override;
82 const IR::Node *preorder(IR::Function *function)
override;
83 const IR::Node *preorder(IR::P4Control *control)
override;
84 const IR::Node *preorder(IR::P4Parser *parser)
override;
85 const IR::Node *preorder(IR::P4Action *action)
override;
86 const IR::Node *preorder(IR::MethodCallStatement *statement)
override;
87 const IR::Node *preorder(IR::MethodCallExpression *expr)
override;
88 const IR::Node *preorder(IR::AssignmentStatement *statement)
override;
89 const IR::Node *preorder(IR::IfStatement *statement)
override;
98 CloneVariableDeclarations() {
99 setName(
"CloneVariableDeclarations");
100 visitDagOnce =
false;
102 const IR::Node *postorder(IR::Declaration_Variable *declaration)
override {
104 auto result =
new IR::Declaration_Variable(declaration->srcInfo, declaration->getName(),
105 declaration->annotations, declaration->type,
106 declaration->initializer);
107 LOG3(
"Cloned " << dbp(result));
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24