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_Stack *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 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;
121 void emitInitializer(
CodeBuilder *builder)
override;
125 static bool generatesScalar(
unsigned width) {
return width <= 64; }
127 DECLARE_TYPEINFO(EBPFScalarType, EBPFType, IHasWidth);
132 const IR::Type_Name *type;
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); }
141 void emitInitializer(
CodeBuilder *builder)
override;
146 template <
typename T>
147 bool canonicalTypeIs()
const {
148 return this->canonical->
is<T>();
151 DECLARE_TYPEINFO(EBPFTypeName, EBPFType,
IHasWidth);
155class EBPFStructType :
public EBPFType,
public IHasWidth {
160 const IR::StructField *field;
162 EBPFField(EBPFType *type,
const IR::StructField *field,
cstring comment =
nullptr)
163 : comment(comment), type(type), field(field) {}
169 std::vector<EBPFField *> fields;
173 explicit EBPFStructType(
const IR::Type_StructLike *strct);
176 void emitInitializer(
CodeBuilder *builder)
override;
187 explicit EBPFEnumType(
const IR::Type_Enum *type) : EBPFType(type) {}
191 void emitInitializer(
CodeBuilder *builder)
override { builder->append(
"0"); }
194 const IR::Type_Enum *getType()
const {
return type->to<IR::Type_Enum>(); }
196 DECLARE_TYPEINFO(EBPFEnumType, EBPFType, IHasWidth);
201 explicit EBPFErrorType(
const IR::Type_Error *type) : EBPFType(type) {}
205 void emitInitializer(
CodeBuilder *builder)
override { builder->append(
"0"); }
208 const IR::Type_Error *getType()
const {
return type->to<IR::Type_Error>(); }
210 DECLARE_TYPEINFO(EBPFErrorType, EBPFType, IHasWidth);
217 const IR::Method *method_;
220 explicit EBPFMethodDeclaration(
const IR::Method *method);
225 DECLARE_TYPEINFO(EBPFMethodDeclaration,
EBPFObject);
228class EBPFScalarTypePNA :
public EBPFScalarType {
229 bool isPrimitiveByteAligned =
false;
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));
236 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: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
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:24
bool is() const noexcept
Definition rtti.h:216