P4C
The P4 Compiler
Loading...
Searching...
No Matches
ebpfControl.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 BACKENDS_EBPF_EBPFCONTROL_H_
9#define BACKENDS_EBPF_EBPFCONTROL_H_
10
11#include "ebpfObject.h"
12#include "ebpfTable.h"
13#include "ebpfType.h"
14
15namespace P4::EBPF {
16
17class EBPFControl;
18
19class ControlBodyTranslator : public virtual CodeGenInspector {
20 protected:
21 const EBPFControl *control;
22 std::set<const IR::Parameter *> toDereference;
23 std::vector<cstring> saveAction;
24 P4::P4CoreLibrary &p4lib;
25
26 public:
27 explicit ControlBodyTranslator(const EBPFControl *control);
28
30 virtual void compileEmitField(const IR::Expression *expr, cstring field, unsigned alignment,
31 EBPFType *type);
32 virtual void compileEmit(const IR::Vector<IR::Argument> *args);
33 virtual void processMethod(const P4::ExternMethod *method);
34 virtual void processApply(const P4::ApplyMethod *method);
35 virtual void processFunction(const P4::ExternFunction *function);
36 void processCustomExternFunction(const P4::ExternFunction *function,
37 EBPFTypeFactory *typeFactory);
38
39 bool preorder(const IR::PathExpression *expression) override;
40 bool preorder(const IR::MethodCallExpression *expression) override;
41 bool preorder(const IR::ExitStatement *) override;
42 bool preorder(const IR::ReturnStatement *) override;
43 bool preorder(const IR::IfStatement *statement) override;
44 bool preorder(const IR::SwitchStatement *statement) override;
45 bool preorder(const IR::StructExpression *expr) override;
46};
47
48class EBPFControl : public EBPFObject {
49 public:
50 const EBPFProgram *program;
51 const IR::ControlBlock *controlBlock;
52 const IR::Parameter *headers;
53 const IR::Parameter *accept; // only for ebpfFilter progs
54 const IR::Parameter *xdpInputMeta; // only for xdp progs
55 const IR::Parameter *xdpOutputMeta; // only for xdp progs
56 const IR::Parameter *parserHeaders;
59 ControlBodyTranslator *codeGen;
60 const bool emitExterns;
61
62 std::set<const IR::Parameter *> toDereference;
63 std::map<cstring, EBPFTable *> tables;
64 std::map<cstring, EBPFCounterTable *> counters;
65
66 EBPFControl(const EBPFProgram *program, const IR::ControlBlock *block,
67 const IR::Parameter *parserHeaders);
68 virtual void emit(CodeBuilder *builder);
69 virtual void emitDeclaration(CodeBuilder *builder, const IR::Declaration *decl);
70 virtual void emitTableTypes(CodeBuilder *builder);
71 virtual void emitTableInitializers(CodeBuilder *builder);
72 virtual void emitTableInstances(CodeBuilder *builder);
73 virtual bool build();
74 EBPFTable *getTable(cstring name) const {
75 auto result = ::P4::get(tables, name);
76 BUG_CHECK(result != nullptr, "No table named %1%", name);
77 return result;
78 }
79 EBPFCounterTable *getCounter(cstring name) const {
80 auto result = ::P4::get(counters, name);
81 BUG_CHECK(result != nullptr, "No counter named %1%", name);
82 return result;
83 }
84
85 protected:
86 void scanConstants();
87
88 DECLARE_TYPEINFO(EBPFControl, EBPFObject);
89};
90
91} // namespace P4::EBPF
92
93#endif /* BACKENDS_EBPF_EBPFCONTROL_H_ */
Definition methodInstance.h:120
Definition ebpf/codeGen.h:24
CodeGenInspector(P4::ReferenceMap *refMap, P4::TypeMap *typeMap)
precedence of current IR::Operation
Definition ebpf/codeGen.h:48
Definition ebpfControl.h:19
virtual void compileEmitField(const IR::Expression *expr, cstring field, unsigned alignment, EBPFType *type)
Handle the packet_out.emit method.
Definition ebpfControl.cpp:144
Definition ebpfControl.h:48
cstring hitVariable
Replace references to headers with references to parserHeaders.
Definition ebpfControl.h:58
Definition ebpfTable.h:141
Base class for EBPF objects.
Definition ebpfObject.h:22
Definition ebpfProgram.h:30
Definition ebpfTable.h:63
Definition ebpfType.h:49
Base class for EBPF types.
Definition ebpfType.h:20
Definition methodInstance.h:185
Definition methodInstance.h:159
Definition ir/vector.h:50
Definition coreLibrary.h:94
Definition cstring.h:76
Definition codeGen.cpp:14