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 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 bool packed;
173
174 explicit EBPFStructType(const IR::Type_StructLike *strct);
175 void declare(CodeBuilder *builder, cstring id, bool asPointer) override;
176 void declareInit(CodeBuilder *builder, cstring id, bool asPointer) override;
177 void emitInitializer(CodeBuilder *builder) override;
178 unsigned widthInBits() const override { return width; }
179 unsigned implementationWidthInBits() const override { return implWidth; }
180 void emit(CodeBuilder *builder) override;
181 void declareArray(CodeBuilder *builder, cstring id, unsigned size) override;
182
183 DECLARE_TYPEINFO(EBPFStructType, EBPFType, IHasWidth);
184};
185
186class EBPFEnumType : public EBPFType, public EBPF::IHasWidth {
187 public:
188 explicit EBPFEnumType(const IR::Type_Enum *type) : EBPFType(type) {}
189 void emit(CodeBuilder *builder) override;
190 void declare(CodeBuilder *builder, cstring id, bool asPointer) override;
191 void declareInit(CodeBuilder *builder, cstring id, bool asPointer) override;
192 void emitInitializer(CodeBuilder *builder) override { builder->append("0"); }
193 unsigned widthInBits() const override { return 32; }
194 unsigned implementationWidthInBits() const override { return 32; }
195 const IR::Type_Enum *getType() const { return type->to<IR::Type_Enum>(); }
196
197 DECLARE_TYPEINFO(EBPFEnumType, EBPFType, IHasWidth);
198};
199
200class EBPFErrorType : public EBPFType, public EBPF::IHasWidth {
201 public:
202 explicit EBPFErrorType(const IR::Type_Error *type) : EBPFType(type) {}
203 void emit(CodeBuilder *builder) override;
204 void declare(CodeBuilder *builder, cstring id, bool asPointer) override;
205 void declareInit(CodeBuilder *builder, cstring id, bool asPointer) override;
206 void emitInitializer(CodeBuilder *builder) override { builder->append("0"); }
207 unsigned widthInBits() const override { return 32; }
208 unsigned implementationWidthInBits() const override { return 32; }
209 const IR::Type_Error *getType() const { return type->to<IR::Type_Error>(); }
210
211 DECLARE_TYPEINFO(EBPFErrorType, EBPFType, IHasWidth);
212};
213
215class EBPFMethodDeclaration : public EBPFObject {
216 private:
218 const IR::Method *method_;
219
220 public:
221 explicit EBPFMethodDeclaration(const IR::Method *method);
222
224 void emit(CodeBuilder *builder);
225
226 DECLARE_TYPEINFO(EBPFMethodDeclaration, EBPFObject);
227};
228
229class EBPFScalarTypePNA : public EBPFScalarType {
230 bool isPrimitiveByteAligned = false;
231
232 public:
233 explicit EBPFScalarTypePNA(const IR::Type_Bits *bits) : EBPFScalarType(bits) {
234 isPrimitiveByteAligned = (width <= 8 || width <= 16 || (width > 24 && width <= 32) ||
235 (width > 56 && width <= 64));
236 }
237 unsigned alignment() const;
238 void declare(CodeBuilder *builder, cstring id, bool asPointer);
239 void declareInit(CodeBuilder *builder, cstring id, bool asPointer);
240 void emitInitializer(CodeBuilder *builder);
241};
242
243} // namespace P4::EBPF
244
245#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:193
unsigned implementationWidthInBits() const override
Definition ebpfType.h:194
unsigned implementationWidthInBits() const override
Definition ebpfType.h:208
unsigned widthInBits() const override
P4 width.
Definition ebpfType.h:207
void emit(CodeBuilder *builder)
Emit the signature declaration of this method in C-style form.
Definition ebpfType.cpp:373
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:179
unsigned widthInBits() const override
P4 width.
Definition ebpfType.h:178
Base class for EBPF types.
Definition ebpfType.h:29
unsigned implementationWidthInBits() const override
Definition ebpfType.cpp:300
unsigned widthInBits() const override
P4 width.
Definition ebpfType.cpp:290
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