P4C
The P4 Compiler
Loading...
Searching...
No Matches
ebpfType.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_EBPFTYPE_H_
18#define BACKENDS_EBPF_EBPFTYPE_H_
19
20#include "ebpfObject.h"
21#include "ir/ir.h"
22#include "lib/algorithm.h"
23#include "lib/rtti.h"
24#include "lib/sourceCodeBuilder.h"
25
26namespace P4::EBPF {
27
29class EBPFType : public EBPFObject {
30 protected:
31 explicit EBPFType(const IR::Type *type) : type(type) {}
32
33 public:
34 const IR::Type *type;
35 virtual void emit(CodeBuilder *builder) = 0;
36 virtual void declare(CodeBuilder *builder, cstring id, bool asPointer) = 0;
37 virtual void declareInit(CodeBuilder *builder, cstring id, bool asPointer) = 0;
38 virtual void emitInitializer(CodeBuilder *builder) = 0;
39 virtual void declareArray(CodeBuilder * /*builder*/, cstring /*id*/, unsigned /*size*/) {
40 BUG("%1%: unsupported array", type);
41 }
42
43 DECLARE_TYPEINFO(EBPFType, EBPFObject);
44};
45
46class IHasWidth : public ICastable {
47 public:
48 virtual ~IHasWidth() {}
50 virtual unsigned widthInBits() const = 0;
53 virtual unsigned implementationWidthInBits() const = 0;
54
55 DECLARE_TYPEINFO(IHasWidth);
56};
57
58class EBPFTypeFactory {
59 protected:
60 const P4::TypeMap *typeMap;
61 explicit EBPFTypeFactory(const P4::TypeMap *typeMap) : typeMap(typeMap) { CHECK_NULL(typeMap); }
62
63 public:
64 static EBPFTypeFactory *instance;
65 static bool isTC;
66 static void createFactory(const P4::TypeMap *typeMap, bool TC) {
67 EBPFTypeFactory::instance = new EBPFTypeFactory(typeMap);
68 EBPFTypeFactory::isTC = TC;
69 }
70 virtual EBPFType *create(const IR::Type *type);
71};
72
73class EBPFBoolType : public EBPFType, public IHasWidth {
74 public:
75 EBPFBoolType() : EBPFType(IR::Type_Boolean::get()) {}
76 void emit(CodeBuilder *builder) override { builder->append("u8"); }
77 void declare(CodeBuilder *builder, cstring id, bool asPointer) override;
78 void declareInit(CodeBuilder *builder, cstring id, bool asPointer) override;
79 void emitInitializer(CodeBuilder *builder) override { builder->append("0"); }
80 unsigned widthInBits() const override { return 1; }
81 unsigned implementationWidthInBits() const override { return 8; }
82
83 DECLARE_TYPEINFO(EBPFBoolType, EBPFType, IHasWidth);
84};
85
86class EBPFStackType : public EBPFType, public IHasWidth {
87 EBPFType *elementType;
88 unsigned size;
89
90 public:
91 EBPFStackType(const IR::Type_Stack *type, EBPFType *elementType)
92 : EBPFType(type), elementType(elementType), size(type->getSize()) {
93 CHECK_NULL(type);
94 CHECK_NULL(elementType);
95 BUG_CHECK(elementType->is<IHasWidth>(), "Unexpected element type %1%",
96 typeid(*elementType).name());
97 }
98 void emit(CodeBuilder *) override {}
99 void declare(CodeBuilder *builder, cstring id, bool asPointer) override;
100 void declareInit(CodeBuilder *builder, cstring id, bool asPointer) override;
101 void emitInitializer(CodeBuilder *builder) override;
102 unsigned widthInBits() const override;
103 unsigned implementationWidthInBits() const override;
104
105 DECLARE_TYPEINFO(EBPFStackType, EBPFType, IHasWidth);
106};
107
108class EBPFScalarType : public EBPFType, public IHasWidth {
109 public:
110 const unsigned width;
111 const bool isSigned;
112 explicit EBPFScalarType(const IR::Type_Bits *bits)
113 : EBPFType(bits), width(bits->size), isSigned(bits->isSigned) {}
114 explicit EBPFScalarType(const IR::Type_Varbits *bits)
115 : EBPFType(bits), width(bits->size), isSigned(false) {}
116 unsigned bytesRequired() const { return ROUNDUP(width, 8); }
117 unsigned alignment() const;
118 void emit(CodeBuilder *builder) override;
119 void declare(CodeBuilder *builder, cstring id, bool asPointer) override;
120 void declareInit(CodeBuilder *builder, cstring id, bool asPointer) override;
121 void emitInitializer(CodeBuilder *builder) override;
122 unsigned widthInBits() const override { return width; }
123 unsigned implementationWidthInBits() const override { return bytesRequired() * 8; }
124 // True if this width is small enough to store in a machine scalar
125 static bool generatesScalar(unsigned width) { return width <= 64; }
126
127 DECLARE_TYPEINFO(EBPFScalarType, EBPFType, IHasWidth);
128};
129
131class EBPFTypeName : public EBPFType, public IHasWidth {
132 const IR::Type_Name *type;
133 EBPFType *canonical;
134
135 public:
136 EBPFTypeName(const IR::Type_Name *type, EBPFType *canonical)
137 : EBPFType(type), type(type), canonical(canonical) {}
138 void emit(CodeBuilder *builder) override { canonical->emit(builder); }
139 void declare(CodeBuilder *builder, cstring id, bool asPointer) override;
140 void declareInit(CodeBuilder *builder, cstring id, bool asPointer) override;
141 void emitInitializer(CodeBuilder *builder) override;
142 unsigned widthInBits() const override;
143 unsigned implementationWidthInBits() const override;
144 void declareArray(CodeBuilder *builder, cstring id, unsigned size) override;
145
146 template <typename T>
147 bool canonicalTypeIs() const {
148 return this->canonical->is<T>();
149 }
150
151 DECLARE_TYPEINFO(EBPFTypeName, EBPFType, IHasWidth);
152};
153
155class EBPFStructType : public EBPFType, public IHasWidth {
156 class EBPFField {
157 public:
158 cstring comment;
159 EBPFType *type;
160 const IR::StructField *field;
161
162 EBPFField(EBPFType *type, const IR::StructField *field, cstring comment = nullptr)
163 : comment(comment), type(type), field(field) {}
164 };
165
166 public:
167 cstring kind;
168 cstring name;
169 std::vector<EBPFField *> fields;
170 unsigned width;
171 unsigned implWidth;
172
173 explicit EBPFStructType(const IR::Type_StructLike *strct);
174 void declare(CodeBuilder *builder, cstring id, bool asPointer) override;
175 void declareInit(CodeBuilder *builder, cstring id, bool asPointer) override;
176 void emitInitializer(CodeBuilder *builder) override;
177 unsigned widthInBits() const override { return width; }
178 unsigned implementationWidthInBits() const override { return implWidth; }
179 void emit(CodeBuilder *builder) override;
180 void declareArray(CodeBuilder *builder, cstring id, unsigned size) override;
181
182 DECLARE_TYPEINFO(EBPFStructType, EBPFType, IHasWidth);
183};
184
185class EBPFEnumType : public EBPFType, public EBPF::IHasWidth {
186 public:
187 explicit EBPFEnumType(const IR::Type_Enum *type) : EBPFType(type) {}
188 void emit(CodeBuilder *builder) override;
189 void declare(CodeBuilder *builder, cstring id, bool asPointer) override;
190 void declareInit(CodeBuilder *builder, cstring id, bool asPointer) override;
191 void emitInitializer(CodeBuilder *builder) override { builder->append("0"); }
192 unsigned widthInBits() const override { return 32; }
193 unsigned implementationWidthInBits() const override { return 32; }
194 const IR::Type_Enum *getType() const { return type->to<IR::Type_Enum>(); }
195
196 DECLARE_TYPEINFO(EBPFEnumType, EBPFType, IHasWidth);
197};
198
199class EBPFErrorType : public EBPFType, public EBPF::IHasWidth {
200 public:
201 explicit EBPFErrorType(const IR::Type_Error *type) : EBPFType(type) {}
202 void emit(CodeBuilder *builder) override;
203 void declare(CodeBuilder *builder, cstring id, bool asPointer) override;
204 void declareInit(CodeBuilder *builder, cstring id, bool asPointer) override;
205 void emitInitializer(CodeBuilder *builder) override { builder->append("0"); }
206 unsigned widthInBits() const override { return 32; }
207 unsigned implementationWidthInBits() const override { return 32; }
208 const IR::Type_Error *getType() const { return type->to<IR::Type_Error>(); }
209
210 DECLARE_TYPEINFO(EBPFErrorType, EBPFType, IHasWidth);
211};
212
214class EBPFMethodDeclaration : public EBPFObject {
215 private:
217 const IR::Method *method_;
218
219 public:
220 explicit EBPFMethodDeclaration(const IR::Method *method);
221
223 void emit(CodeBuilder *builder);
224
225 DECLARE_TYPEINFO(EBPFMethodDeclaration, EBPFObject);
226};
227
228class EBPFScalarTypePNA : public EBPFScalarType {
229 bool isPrimitiveByteAligned = false;
230
231 public:
232 explicit EBPFScalarTypePNA(const IR::Type_Bits *bits) : EBPFScalarType(bits) {
233 isPrimitiveByteAligned = (width <= 8 || width <= 16 || (width > 24 && width <= 32) ||
234 (width > 56 && width <= 64));
235 }
236 unsigned alignment() const;
237 void declare(CodeBuilder *builder, cstring id, bool asPointer);
238 void declareInit(CodeBuilder *builder, cstring id, bool asPointer);
239 void emitInitializer(CodeBuilder *builder);
240};
241
242} // namespace P4::EBPF
243
244#endif /* BACKENDS_EBPF_EBPFTYPE_H_ */
Definition ebpf/codeGen.h:33
Definition ebpfType.h:73
unsigned implementationWidthInBits() const override
Definition ebpfType.h:81
unsigned widthInBits() const override
P4 width.
Definition ebpfType.h:80
unsigned widthInBits() const override
P4 width.
Definition ebpfType.h:192
unsigned implementationWidthInBits() const override
Definition ebpfType.h:193
unsigned implementationWidthInBits() const override
Definition ebpfType.h:207
unsigned widthInBits() const override
P4 width.
Definition ebpfType.h:206
void emit(CodeBuilder *builder)
Emit the signature declaration of this method in C-style form.
Definition ebpfType.cpp:370
Base class for EBPF objects.
Definition ebpfObject.h:31
unsigned widthInBits() const override
P4 width.
Definition ebpfType.h:122
unsigned implementationWidthInBits() const override
Definition ebpfType.h:123
unsigned widthInBits() const override
P4 width.
Definition ebpfType.cpp:96
unsigned implementationWidthInBits() const override
Definition ebpfType.cpp:100
Also represents headers and unions.
Definition ebpfType.h:155
unsigned implementationWidthInBits() const override
Definition ebpfType.h:178
unsigned widthInBits() const override
P4 width.
Definition ebpfType.h:177
Base class for EBPF types.
Definition ebpfType.h:29
unsigned implementationWidthInBits() const override
Definition ebpfType.cpp:297
unsigned widthInBits() const override
P4 width.
Definition ebpfType.cpp:287
Definition ebpfType.h:46
virtual unsigned implementationWidthInBits() const =0
virtual unsigned widthInBits() const =0
P4 width.
Definition castable.h:36
Definition typeMap.h:41
Definition cstring.h:85
Definition codeGen.cpp:25
This file defines functions for the pass to generate the introspection file.
Definition tc/backend.cpp:24
bool is() const noexcept
Definition rtti.h:216