P4C
The P4 Compiler
Loading...
Searching...
No Matches
ebpfParser.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_EBPFPARSER_H_
9#define BACKENDS_EBPF_EBPFPARSER_H_
10
11#include "ebpfObject.h"
12#include "ebpfProgram.h"
13#include "ebpfTable.h"
14#include "frontends/p4/methodInstance.h"
15#include "ir/ir.h"
16
17namespace P4::EBPF {
18
19class EBPFParser;
20class EBPFParserState;
21
22class StateTranslationVisitor : public CodeGenInspector {
23 protected:
26 const IR::Type *selectType;
27
28 P4::P4CoreLibrary &p4lib;
29 const EBPFParserState *state;
30
31 virtual void compileExtractField(const IR::Expression *expr, const IR::StructField *field,
32 unsigned hdrOffsetBits, EBPFType *type);
33 virtual void compileExtract(const IR::Expression *destination);
34 virtual void compileLookahead(const IR::Expression *destination);
35 void compileAdvance(const P4::ExternMethod *ext);
36 void compileVerify(const IR::MethodCallExpression *expression);
37
38 virtual void processFunction(const P4::ExternFunction *function);
39 virtual void processMethod(const P4::ExternMethod *method);
40
41 public:
42 explicit StateTranslationVisitor(P4::ReferenceMap *refMap, P4::TypeMap *typeMap)
43 : CodeGenInspector(refMap, typeMap), p4lib(P4::P4CoreLibrary::instance()), state(nullptr) {}
44
45 void setState(const EBPFParserState *state) { this->state = state; }
46 bool preorder(const IR::ParserState *state) override;
47 bool preorder(const IR::SelectCase *selectCase) override;
48 bool preorder(const IR::SelectExpression *expression) override;
49 bool preorder(const IR::Member *expression) override;
50 bool preorder(const IR::MethodCallExpression *expression) override;
51 bool preorder(const IR::MethodCallStatement *stat) override {
52 visit(stat->methodCall);
53 builder->endOfStatement(true);
54 return false;
55 }
56 bool preorder(const IR::BaseAssignmentStatement *stat) override { return notSupported(stat); }
57 bool preorder(const IR::AssignmentStatement *stat) override;
58};
59
60class EBPFParserState : public EBPFObject {
61 public:
62 const IR::ParserState *state;
63 const EBPFParser *parser;
64
65 EBPFParserState(const IR::ParserState *state, EBPFParser *parser)
66 : state(state), parser(parser) {}
67 void emit(CodeBuilder *builder);
68
69 DECLARE_TYPEINFO(EBPFParserState, EBPFObject);
70};
71
72class EBPFParser : public EBPFObject {
73 public:
74 const EBPFProgram *program;
75 const P4::TypeMap *typeMap;
76 const IR::ParserBlock *parserBlock;
77 std::vector<EBPFParserState *> states;
78 const IR::Parameter *packet;
79 const IR::Parameter *headers;
80 const IR::Parameter *user_metadata;
81 EBPFType *headerType;
82
84
85 std::map<cstring, EBPFValueSet *> valueSets;
86
87 explicit EBPFParser(const EBPFProgram *program, const IR::ParserBlock *block,
88 const P4::TypeMap *typeMap);
89 virtual void emitDeclaration(CodeBuilder *builder, const IR::Declaration *decl);
90 virtual void emit(CodeBuilder *builder);
91 virtual bool build();
92
93 virtual void emitTypes(CodeBuilder *builder);
94 virtual void emitValueSetInstances(CodeBuilder *builder);
95 virtual void emitRejectState(CodeBuilder *builder);
96
97 EBPFValueSet *getValueSet(cstring name) const { return ::P4::get(valueSets, name); }
98
99 DECLARE_TYPEINFO(EBPFParser, EBPFObject);
100};
101
102} // namespace P4::EBPF
103
104#endif /* BACKENDS_EBPF_EBPFPARSER_H_ */
Definition ebpf/codeGen.h:24
CodeGenInspector(P4::ReferenceMap *refMap, P4::TypeMap *typeMap)
precedence of current IR::Operation
Definition ebpf/codeGen.h:48
Base class for EBPF objects.
Definition ebpfObject.h:22
Definition ebpfParser.h:72
Definition ebpfParser.h:60
Definition ebpfProgram.h:30
Base class for EBPF types.
Definition ebpfType.h:20
Definition ebpfTable.h:162
Definition ebpfParser.h:22
cstring selectValue
Stores the result of evaluating the select argument.
Definition ebpfParser.h:25
Definition methodInstance.h:185
Definition methodInstance.h:159
Definition coreLibrary.h:94
Class used to encode maps from paths to declarations.
Definition referenceMap.h:58
Definition typeMap.h:32
Definition cstring.h:76
Definition codeGen.cpp:14
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13