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