17#ifndef BACKENDS_EBPF_EBPFTYPE_H_
18#define BACKENDS_EBPF_EBPFTYPE_H_
20#include "ebpfObject.h"
22#include "lib/algorithm.h"
24#include "lib/sourceCodeBuilder.h"
31 explicit EBPFType(
const IR::Type *type) : type(type) {}
38 virtual void emitInitializer(
CodeBuilder *builder) = 0;
40 BUG(
"%1%: unsupported array", type);
58class EBPFTypeFactory {
61 explicit EBPFTypeFactory(
const P4::TypeMap *typeMap) : typeMap(typeMap) { CHECK_NULL(typeMap); }
64 static EBPFTypeFactory *instance;
66 static void createFactory(
const P4::TypeMap *typeMap,
bool TC) {
67 EBPFTypeFactory::instance =
new EBPFTypeFactory(typeMap);
68 EBPFTypeFactory::isTC =
TC;
70 virtual EBPFType *create(
const IR::Type *type);
73class EBPFBoolType :
public EBPFType,
public IHasWidth {
75 EBPFBoolType() : EBPFType(IR::Type_Boolean::get()) {}
76 void emit(
CodeBuilder *builder)
override { builder->append(
"u8"); }
79 void emitInitializer(
CodeBuilder *builder)
override { builder->append(
"0"); }
86class EBPFStackType :
public EBPFType,
public IHasWidth {
87 EBPFType *elementType;
91 EBPFStackType(
const IR::Type_Array *type, EBPFType *elementType)
92 : EBPFType(type), elementType(elementType), size(type->getSize()) {
94 CHECK_NULL(elementType);
95 BUG_CHECK(elementType->is<
IHasWidth>(),
"Unexpected element type %1%",
96 typeid(*elementType).name());
101 void emitInitializer(
CodeBuilder *builder)
override;
105 DECLARE_TYPEINFO(EBPFStackType, EBPFType,
IHasWidth);
108class EBPFScalarType :
public EBPFType,
public IHasWidth {
110 const unsigned width;
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;
122 void emitInitializer(
CodeBuilder *builder)
override;
126 static bool generatesScalar(
unsigned width) {
return width <= 64; }
128 DECLARE_TYPEINFO(EBPFScalarType, EBPFType, IHasWidth);
133 const IR::Type_Name *type;
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); }
142 void emitInitializer(
CodeBuilder *builder)
override;
147 template <
typename T>
148 bool canonicalTypeIs()
const {
149 return this->canonical->
is<T>();
152 DECLARE_TYPEINFO(EBPFTypeName, EBPFType,
IHasWidth);
156class EBPFStructType :
public EBPFType,
public IHasWidth {
161 const IR::StructField *field;
163 EBPFField(EBPFType *type,
const IR::StructField *field,
cstring comment =
nullptr)
164 : comment(comment), type(type), field(field) {}
170 std::vector<EBPFField *> fields;
175 explicit EBPFStructType(
const IR::Type_StructLike *strct);
178 void emitInitializer(
CodeBuilder *builder)
override;
189 explicit EBPFEnumType(
const IR::Type_Enum *type) : EBPFType(type) {}
193 void emitInitializer(
CodeBuilder *builder)
override { builder->append(
"0"); }
196 const IR::Type_Enum *getType()
const {
return type->to<IR::Type_Enum>(); }
198 DECLARE_TYPEINFO(EBPFEnumType, EBPFType, IHasWidth);
203 explicit EBPFErrorType(
const IR::Type_Error *type) : EBPFType(type) {}
207 void emitInitializer(
CodeBuilder *builder)
override { builder->append(
"0"); }
210 const IR::Type_Error *getType()
const {
return type->to<IR::Type_Error>(); }
212 DECLARE_TYPEINFO(EBPFErrorType, EBPFType, IHasWidth);
219 const IR::Method *method_;
222 explicit EBPFMethodDeclaration(
const IR::Method *method);
227 DECLARE_TYPEINFO(EBPFMethodDeclaration,
EBPFObject);
230class EBPFScalarTypePNA :
public EBPFScalarType {
231 bool isPrimitiveByteAligned =
false;
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));
238 unsigned alignment()
const;
Definition ebpf/codeGen.h:33
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
virtual unsigned implementationWidthInBits() const =0
virtual unsigned widthInBits() const =0
P4 width.
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