P4C
The P4 Compiler
Loading...
Searching...
No Matches
ebpf/codeGen.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_CODEGEN_H_
9#define BACKENDS_EBPF_CODEGEN_H_
10
11#include "frontends/p4/typeMap.h"
12#include "ir/ir.h"
13#include "lib/sourceCodeBuilder.h"
14#include "target.h"
15
16namespace P4 {
17
18class ReferenceMap;
19
20}
21
22namespace P4::EBPF {
23
24class CodeBuilder : public Util::SourceCodeBuilder {
25 public:
26 const Target *target;
27 explicit CodeBuilder(const Target *target) : target(target) {}
28};
29
32class CodeGenInspector : public Inspector {
33 protected:
34 CodeBuilder *builder;
35 P4::ReferenceMap *refMap;
36 P4::TypeMap *typeMap;
37 std::map<const IR::Parameter *, const IR::Parameter *> substitution;
40 std::set<cstring> asPointerVariables;
41
45
46 public:
47 int expressionPrecedence;
49 : builder(nullptr),
50 refMap(refMap),
51 typeMap(typeMap),
52 expressionPrecedence(DBPrint::Prec_Low) {
53 CHECK_NULL(refMap);
54 CHECK_NULL(typeMap);
55 visitDagOnce = false;
56 }
57
58 void setBuilder(CodeBuilder *builder) {
59 CHECK_NULL(builder);
60 this->builder = builder;
61 }
62
63 void substitute(const IR::Parameter *p, const IR::Parameter *with);
64 void copySubstitutions(CodeGenInspector *other) {
65 for (auto s : other->substitution) substitute(s.first, s.second);
66 }
67
68 void useAsPointerVariable(cstring name) { this->asPointerVariables.insert(name); }
69 void copyPointerVariables(CodeGenInspector *other) {
70 for (auto s : other->asPointerVariables) {
71 this->asPointerVariables.insert(s);
72 }
73 }
74 bool isPointerVariable(cstring name) { return asPointerVariables.count(name) > 0; }
75
76 bool notSupported(const IR::Node *n) {
77 ::P4::error(ErrorType::ERR_UNSUPPORTED, "%1%: not yet implemented", n);
78 return false;
79 }
80
81 bool preorder(const IR::Expression *expression) override { return notSupported(expression); }
82 bool preorder(const IR::Range *expression) override { return notSupported(expression); }
83 bool preorder(const IR::Mask *expression) override { return notSupported(expression); }
84 bool preorder(const IR::Slice *expression) override // should not happen
85 {
86 return notSupported(expression);
87 }
88 bool preorder(const IR::StringLiteral *expression) override;
89 bool preorder(const IR::ListExpression *expression) override;
90 bool preorder(const IR::PathExpression *expression) override;
91 bool preorder(const IR::Constant *expression) override;
92 bool preorder(const IR::Declaration_Variable *decl) override;
93 bool preorder(const IR::BoolLiteral *b) override;
94 bool preorder(const IR::Cast *c) override;
95 bool preorder(const IR::Operation_Binary *b) override;
96 bool preorder(const IR::Operation_Unary *u) override;
97 bool preorder(const IR::ArrayIndex *a) override;
98 bool preorder(const IR::Mux *a) override;
99 bool preorder(const IR::Member *e) override;
100 bool preorder(const IR::MethodCallExpression *expression) override;
101 bool comparison(const IR::Operation_Relation *comp);
102 bool preorder(const IR::Equ *e) override { return comparison(e); }
103 bool preorder(const IR::Neq *e) override { return comparison(e); }
104 bool preorder(const IR::Path *path) override;
105 bool preorder(const IR::StructExpression *expr) override;
106
107 bool preorder(const IR::Type_Typedef *type) override;
108 bool preorder(const IR::Type_Enum *type) override;
109 void emitAssignStatement(const IR::Type *ltype, const IR::Expression *lexpr, cstring lpath,
110 const IR::Expression *rexpr);
111 bool preorder(const IR::BaseAssignmentStatement *s) override { return notSupported(s); }
112 bool preorder(const IR::AssignmentStatement *s) override;
113 bool preorder(const IR::BlockStatement *s) override;
114 bool preorder(const IR::MethodCallStatement *s) override;
115 bool preorder(const IR::EmptyStatement *s) override;
116 bool preorder(const IR::ReturnStatement *s) override;
117 bool preorder(const IR::ExitStatement *s) override;
118 bool preorder(const IR::IfStatement *s) override;
119
120 void widthCheck(const IR::Node *node) const;
121 bool scalarType(const IR::Node *node) const;
122 void emitAndConvertByteOrder(const IR::Expression *expr, cstring byte_order);
123 void emitTCBinaryOperation(const IR::Operation_Binary *);
124 void emitTCAssignmentEndianessConversion(const IR::Type *ltype, const IR::Expression *lexpr,
125 const IR::Expression *rexpr, cstring lpath);
126 void getBitAlignment(const IR::Expression *expression);
127 bool storeBitAlignment(const IR::Type *ltype, const IR::Expression *lexpr, cstring lpath);
128 void emitTCLarge(const IR::Operation_Binary *, unsigned int); // catchall
129};
130
132 public:
134 static unsigned ebpfTypeWidth(P4::TypeMap *typeMap, const IR::Expression *expr);
135
137 static cstring genHexStr(const big_int &value, unsigned width, const IR::Expression *expr);
138};
139
140} // namespace P4::EBPF
141
142#endif /* BACKENDS_EBPF_CODEGEN_H_ */
Definition ebpf/codeGen.h:24
CodeGenInspector(P4::ReferenceMap *refMap, P4::TypeMap *typeMap)
precedence of current IR::Operation
Definition ebpf/codeGen.h:48
int commentDescriptionDepth
Definition ebpf/codeGen.h:44
std::set< cstring > asPointerVariables
Definition ebpf/codeGen.h:40
Definition ebpf/codeGen.h:131
static unsigned ebpfTypeWidth(P4::TypeMap *typeMap, const IR::Expression *expr)
return real number of bits required by type
Definition codeGen.cpp:645
static cstring genHexStr(const big_int &value, unsigned width, const IR::Expression *expr)
Generate hex string and prepend it with zeroes when shorter than required width.
Definition codeGen.cpp:664
Definition ebpf/target.h:35
Class used to encode maps from paths to declarations.
Definition referenceMap.h:58
Definition typeMap.h:32
Definition sourceCodeBuilder.h:20
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
void error(const char *format, Args &&...args)
Report an error with the given message.
Definition lib/error.h:49