P4C
The P4 Compiler
Loading...
Searching...
No Matches
ebpfParser.h
1/*
2Copyright 2013-present Barefoot Networks, Inc.
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16
17#ifndef BACKENDS_EBPF_EBPFPARSER_H_
18#define BACKENDS_EBPF_EBPFPARSER_H_
19
20#include "ebpfObject.h"
21#include "ebpfProgram.h"
22#include "ebpfTable.h"
23#include "frontends/p4/methodInstance.h"
24#include "ir/ir.h"
25
26namespace P4::EBPF {
27
28class EBPFParser;
29class EBPFParserState;
30
31class StateTranslationVisitor : public CodeGenInspector {
32 protected:
35 const IR::Type *selectType;
36
37 P4::P4CoreLibrary &p4lib;
38 const EBPFParserState *state;
39
40 virtual void compileExtractField(const IR::Expression *expr, const IR::StructField *field,
41 unsigned hdrOffsetBits, EBPFType *type);
42 virtual void compileExtract(const IR::Expression *destination);
43 virtual void compileLookahead(const IR::Expression *destination);
44 void compileAdvance(const P4::ExternMethod *ext);
45 void compileVerify(const IR::MethodCallExpression *expression);
46
47 virtual void processFunction(const P4::ExternFunction *function);
48 virtual void processMethod(const P4::ExternMethod *method);
49
50 public:
51 explicit StateTranslationVisitor(P4::ReferenceMap *refMap, P4::TypeMap *typeMap)
52 : CodeGenInspector(refMap, typeMap), p4lib(P4::P4CoreLibrary::instance()), state(nullptr) {}
53
54 void setState(const EBPFParserState *state) { this->state = state; }
55 bool preorder(const IR::ParserState *state) override;
56 bool preorder(const IR::SelectCase *selectCase) override;
57 bool preorder(const IR::SelectExpression *expression) override;
58 bool preorder(const IR::Member *expression) override;
59 bool preorder(const IR::MethodCallExpression *expression) override;
60 bool preorder(const IR::MethodCallStatement *stat) override {
61 visit(stat->methodCall);
62 builder->endOfStatement(true);
63 return false;
64 }
65 bool preorder(const IR::BaseAssignmentStatement *stat) override { return notSupported(stat); }
66 bool preorder(const IR::AssignmentStatement *stat) override;
67};
68
69class EBPFParserState : public EBPFObject {
70 public:
71 const IR::ParserState *state;
72 const EBPFParser *parser;
73
74 EBPFParserState(const IR::ParserState *state, EBPFParser *parser)
75 : state(state), parser(parser) {}
76 void emit(CodeBuilder *builder);
77
78 DECLARE_TYPEINFO(EBPFParserState, EBPFObject);
79};
80
81class EBPFParser : public EBPFObject {
82 public:
83 const EBPFProgram *program;
84 const P4::TypeMap *typeMap;
85 const IR::ParserBlock *parserBlock;
86 std::vector<EBPFParserState *> states;
87 const IR::Parameter *packet;
88 const IR::Parameter *headers;
89 const IR::Parameter *user_metadata;
90 EBPFType *headerType;
91
93
94 std::map<cstring, EBPFValueSet *> valueSets;
95
96 explicit EBPFParser(const EBPFProgram *program, const IR::ParserBlock *block,
97 const P4::TypeMap *typeMap);
98 virtual void emitDeclaration(CodeBuilder *builder, const IR::Declaration *decl);
99 virtual void emit(CodeBuilder *builder);
100 virtual bool build();
101
102 virtual void emitTypes(CodeBuilder *builder);
103 virtual void emitValueSetInstances(CodeBuilder *builder);
104 virtual void emitRejectState(CodeBuilder *builder);
105
106 EBPFValueSet *getValueSet(cstring name) const { return ::P4::get(valueSets, name); }
107
108 DECLARE_TYPEINFO(EBPFParser, EBPFObject);
109};
110
111} // namespace P4::EBPF
112
113#endif /* BACKENDS_EBPF_EBPFPARSER_H_ */
Definition ebpf/codeGen.h:33
CodeGenInspector(P4::ReferenceMap *refMap, P4::TypeMap *typeMap)
precedence of current IR::Operation
Definition ebpf/codeGen.h:57
Base class for EBPF objects.
Definition ebpfObject.h:31
Definition ebpfParser.h:81
Definition ebpfParser.h:69
Definition ebpfProgram.h:39
Base class for EBPF types.
Definition ebpfType.h:29
Definition ebpfTable.h:171
Definition ebpfParser.h:31
cstring selectValue
Stores the result of evaluating the select argument.
Definition ebpfParser.h:34
Definition methodInstance.h:194
Definition methodInstance.h:168
Definition coreLibrary.h:103
Class used to encode maps from paths to declarations.
Definition referenceMap.h:67
Definition typeMap.h:41
Definition cstring.h:85
Definition codeGen.cpp:25
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24