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_Array *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 const bool isvariable;
113 explicit EBPFScalarType(const IR::Type_Bits *bits)
114 : EBPFType(bits), width(bits->size), isSigned(bits->isSigned), isvariable(false) {}
115 explicit EBPFScalarType(const IR::Type_Varbits *bits)
116 : EBPFType(bits), width(bits->size), isSigned(false), isvariable(true) {}
117 unsigned bytesRequired() const { return ROUNDUP(width, 8); }
118 unsigned alignment() const;
119 void emit(CodeBuilder *builder) override;
120 void declare(CodeBuilder *builder, cstring id, bool asPointer) override;
121 void declareInit(CodeBuilder *builder, cstring id, bool asPointer) override;
122 void emitInitializer(CodeBuilder *builder) override;
123 unsigned widthInBits() const override { return width; }
124 unsigned implementationWidthInBits() const override { return bytesRequired() * 8; }
125 // True if this width is small enough to store in a machine scalar
126 static bool generatesScalar(unsigned width) { return width <= 64; }
127
128 DECLARE_TYPEINFO(EBPFScalarType, EBPFType, IHasWidth);
129};
130
132class EBPFTypeName : public EBPFType, public IHasWidth {
133 const IR::Type_Name *type;
134 EBPFType *canonical;
135
136 public:
137 EBPFTypeName(const IR::Type_Name *type, EBPFType *canonical)
138 : EBPFType(type), type(type), canonical(canonical) {}
139 void emit(CodeBuilder *builder) override { canonical->emit(builder); }
140 void declare(CodeBuilder *builder, cstring id, bool asPointer) override;
141 void declareInit(CodeBuilder *builder, cstring id, bool asPointer) override;
142 void emitInitializer(CodeBuilder *builder) override;
143 unsigned widthInBits() const override;
144 unsigned implementationWidthInBits() const override;
145 void declareArray(CodeBuilder *builder, cstring id, unsigned size) override;
146
147 template <typename T>
148 bool canonicalTypeIs() const {
149 return this->canonical->is<T>();
150 }
151
152 DECLARE_TYPEINFO(EBPFTypeName, EBPFType, IHasWidth);
153};
154
156class EBPFStructType : public EBPFType, public IHasWidth {
157 class EBPFField {
158 public:
159 cstring comment;
160 EBPFType *type;
161 const IR::StructField *field;
162
163 EBPFField(EBPFType *type, const IR::StructField *field, cstring comment = nullptr)
164 : comment(comment), type(type), field(field) {}
165 };
166
167 public:
168 cstring kind;
169 cstring name;
170 std::vector<EBPFField *> fields;
171 unsigned width;
172 unsigned implWidth;
173 bool packed;
174
175 explicit EBPFStructType(const IR::Type_StructLike *strct);
176 void declare(CodeBuilder *builder, cstring id, bool asPointer) override;
177 void declareInit(CodeBuilder *builder, cstring id, bool asPointer) override;
178 void emitInitializer(CodeBuilder *builder) override;
179 unsigned widthInBits() const override { return width; }
180 unsigned implementationWidthInBits() const override { return implWidth; }
181 void emit(CodeBuilder *builder) override;
182 void declareArray(CodeBuilder *builder, cstring id, unsigned size) override;
183
184 DECLARE_TYPEINFO(EBPFStructType, EBPFType, IHasWidth);
185};
186
187class EBPFEnumType : public EBPFType, public EBPF::IHasWidth {
188 public:
189 explicit EBPFEnumType(const IR::Type_Enum *type) : EBPFType(type) {}
190 void emit(CodeBuilder *builder) override;
191 void declare(CodeBuilder *builder, cstring id, bool asPointer) override;
192 void declareInit(CodeBuilder *builder, cstring id, bool asPointer) override;
193 void emitInitializer(CodeBuilder *builder) override { builder->append("0"); }
194 unsigned widthInBits() const override { return 32; }
195 unsigned implementationWidthInBits() const override { return 32; }
196 const IR::Type_Enum *getType() const { return type->to<IR::Type_Enum>(); }
197
198 DECLARE_TYPEINFO(EBPFEnumType, EBPFType, IHasWidth);
199};
200
201class EBPFErrorType : public EBPFType, public EBPF::IHasWidth {
202 public:
203 explicit EBPFErrorType(const IR::Type_Error *type) : EBPFType(type) {}
204 void emit(CodeBuilder *builder) override;
205 void declare(CodeBuilder *builder, cstring id, bool asPointer) override;
206 void declareInit(CodeBuilder *builder, cstring id, bool asPointer) override;
207 void emitInitializer(CodeBuilder *builder) override { builder->append("0"); }
208 unsigned widthInBits() const override { return 32; }
209 unsigned implementationWidthInBits() const override { return 32; }
210 const IR::Type_Error *getType() const { return type->to<IR::Type_Error>(); }
211
212 DECLARE_TYPEINFO(EBPFErrorType, EBPFType, IHasWidth);
213};
214
216class EBPFMethodDeclaration : public EBPFObject {
217 private:
219 const IR::Method *method_;
220
221 public:
222 explicit EBPFMethodDeclaration(const IR::Method *method);
223
225 void emit(CodeBuilder *builder);
226
227 DECLARE_TYPEINFO(EBPFMethodDeclaration, EBPFObject);
228};
229
230class EBPFScalarTypePNA : public EBPFScalarType {
231 bool isPrimitiveByteAligned = false;
232
233 public:
234 explicit EBPFScalarTypePNA(const IR::Type_Bits *bits) : EBPFScalarType(bits) {
235 isPrimitiveByteAligned = (width <= 8 || width <= 16 || (width > 24 && width <= 32) ||
236 (width > 56 && width <= 64));
237 }
238 unsigned alignment() const;
239 void declare(CodeBuilder *builder, cstring id, bool asPointer);
240 void declareInit(CodeBuilder *builder, cstring id, bool asPointer);
241 void emitInitializer(CodeBuilder *builder);
242};
243
244} // namespace P4::EBPF
245
246#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:194
unsigned implementationWidthInBits() const override
Definition ebpfType.h:195
unsigned implementationWidthInBits() const override
Definition ebpfType.h:209
unsigned widthInBits() const override
P4 width.
Definition ebpfType.h:208
void emit(CodeBuilder *builder)
Emit the signature declaration of this method in C-style form.
Definition ebpfType.cpp:376
Base class for EBPF objects.
Definition ebpfObject.h:31
unsigned widthInBits() const override
P4 width.
Definition ebpfType.h:123
unsigned implementationWidthInBits() const override
Definition ebpfType.h:124
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:156
unsigned implementationWidthInBits() const override
Definition ebpfType.h:180
unsigned widthInBits() const override
P4 width.
Definition ebpfType.h:179
Base class for EBPF types.
Definition ebpfType.h:29
unsigned implementationWidthInBits() const override
Definition ebpfType.cpp:303
unsigned widthInBits() const override
P4 width.
Definition ebpfType.cpp:293
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:27
bool is() const noexcept
Definition rtti.h:216