8#ifndef BACKENDS_EBPF_EBPFTYPE_H_
9#define BACKENDS_EBPF_EBPFTYPE_H_
11#include "ebpfObject.h"
13#include "lib/algorithm.h"
15#include "lib/sourceCodeBuilder.h"
22 explicit EBPFType(
const IR::Type *type) : type(type) {}
29 virtual void emitInitializer(
CodeBuilder *builder) = 0;
31 BUG(
"%1%: unsupported array", type);
49class EBPFTypeFactory {
52 explicit EBPFTypeFactory(
const P4::TypeMap *typeMap) : typeMap(typeMap) { CHECK_NULL(typeMap); }
55 static EBPFTypeFactory *instance;
57 static void createFactory(
const P4::TypeMap *typeMap,
bool TC) {
58 EBPFTypeFactory::instance =
new EBPFTypeFactory(typeMap);
59 EBPFTypeFactory::isTC =
TC;
61 virtual EBPFType *create(
const IR::Type *type);
64class EBPFBoolType :
public EBPFType,
public IHasWidth {
66 EBPFBoolType() : EBPFType(IR::Type_Boolean::get()) {}
67 void emit(
CodeBuilder *builder)
override { builder->append(
"u8"); }
70 void emitInitializer(
CodeBuilder *builder)
override { builder->append(
"0"); }
77class EBPFStackType :
public EBPFType,
public IHasWidth {
78 EBPFType *elementType;
82 EBPFStackType(
const IR::Type_Array *type, EBPFType *elementType)
83 : EBPFType(type), elementType(elementType), size(type->getSize()) {
85 CHECK_NULL(elementType);
86 BUG_CHECK(elementType->is<
IHasWidth>(),
"Unexpected element type %1%",
87 typeid(*elementType).name());
92 void emitInitializer(
CodeBuilder *builder)
override;
96 DECLARE_TYPEINFO(EBPFStackType, EBPFType,
IHasWidth);
99class EBPFScalarType :
public EBPFType,
public IHasWidth {
101 const unsigned width;
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;
113 void emitInitializer(
CodeBuilder *builder)
override;
117 static bool generatesScalar(
unsigned width) {
return width <= 64; }
119 DECLARE_TYPEINFO(EBPFScalarType, EBPFType, IHasWidth);
124 const IR::Type_Name *type;
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); }
133 void emitInitializer(
CodeBuilder *builder)
override;
138 template <
typename T>
139 bool canonicalTypeIs()
const {
140 return this->canonical->
is<T>();
143 DECLARE_TYPEINFO(EBPFTypeName, EBPFType,
IHasWidth);
147class EBPFStructType :
public EBPFType,
public IHasWidth {
152 const IR::StructField *field;
154 EBPFField(EBPFType *type,
const IR::StructField *field,
cstring comment =
nullptr)
155 : comment(comment), type(type), field(field) {}
161 std::vector<EBPFField *> fields;
166 explicit EBPFStructType(
const IR::Type_StructLike *strct);
169 void emitInitializer(
CodeBuilder *builder)
override;
180 explicit EBPFEnumType(
const IR::Type_Enum *type) : EBPFType(type) {}
184 void emitInitializer(
CodeBuilder *builder)
override { builder->append(
"0"); }
187 const IR::Type_Enum *getType()
const {
return type->to<IR::Type_Enum>(); }
189 DECLARE_TYPEINFO(EBPFEnumType, EBPFType, IHasWidth);
194 explicit EBPFErrorType(
const IR::Type_Error *type) : EBPFType(type) {}
198 void emitInitializer(
CodeBuilder *builder)
override { builder->append(
"0"); }
201 const IR::Type_Error *getType()
const {
return type->to<IR::Type_Error>(); }
203 DECLARE_TYPEINFO(EBPFErrorType, EBPFType, IHasWidth);
210 const IR::Method *method_;
213 explicit EBPFMethodDeclaration(
const IR::Method *method);
218 DECLARE_TYPEINFO(EBPFMethodDeclaration,
EBPFObject);
221class EBPFScalarTypePNA :
public EBPFScalarType {
222 bool isPrimitiveByteAligned =
false;
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));
229 unsigned alignment()
const;
Definition ebpf/codeGen.h:24
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
virtual unsigned implementationWidthInBits() const =0
virtual unsigned widthInBits() const =0
P4 width.
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