P4C
The P4 Compiler
Loading...
Searching...
No Matches
ebpfCodeGen.h
1/*
2Copyright (C) 2023 Intel Corporation
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
8http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing,
11software distributed 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
14and limitations under the License.
15*/
16
17#ifndef BACKENDS_TC_EBPFCODEGEN_H_
18#define BACKENDS_TC_EBPFCODEGEN_H_
19
20// FIXME: these include each other and present file
21#include "backend.h"
22#include "tcExterns.h"
23
24namespace P4::TC {
25
26using namespace P4::literals;
27
29class EBPFPnaParser;
30class EBPFRegisterPNA;
31class EBPFHashPNA;
32class EBPFRandomPNA;
33
34// Similar to class PSAEbpfGenerator in backends/ebpf/psa/ebpfPsaGen.h
35
36class PNAEbpfGenerator : public EBPF::EbpfCodeGenerator {
37 public:
38 EBPF::EBPFPipeline *pipeline;
39 const ConvertToBackendIR *tcIR;
40
41 PNAEbpfGenerator(const EbpfOptions &options, std::vector<EBPF::EBPFType *> &ebpfTypes,
42 EBPF::EBPFPipeline *pipeline, const ConvertToBackendIR *tcIR)
43 : EBPF::EbpfCodeGenerator(options, ebpfTypes), pipeline(pipeline), tcIR(tcIR) {}
44
45 virtual void emit(EBPF::CodeBuilder *builder) const = 0;
46 virtual void emitInstances(EBPF::CodeBuilder *builder) const = 0;
47 virtual void emitParser(EBPF::CodeBuilder *builder) const = 0;
48 virtual void emitHeader(EBPF::CodeBuilder *builder) const = 0;
49 void emitPNAIncludes(EBPF::CodeBuilder *builder) const;
50 void emitPreamble(EBPF::CodeBuilder *builder) const override;
51 void emitCommonPreamble(EBPF::CodeBuilder *builder) const override;
52 void emitInternalStructures(EBPF::CodeBuilder *pBuilder) const override;
53 void emitTypes(EBPF::CodeBuilder *builder) const override;
54 void emitGlobalHeadersMetadata(EBPF::CodeBuilder *builder) const override;
55 void emitPipelineInstances(EBPF::CodeBuilder *builder) const override;
56 void emitP4TCFilterFields(EBPF::CodeBuilder *builder) const;
57 void emitP4TCActionParam(EBPF::CodeBuilder *builder) const;
58 cstring getProgramName() const;
59};
60
61// Similar to class PSAErrorCodesGen in backends/ebpf/psa/ebpfPsaGen.cpp
62
63class PNAErrorCodesGen : public Inspector {
64 EBPF::CodeBuilder *builder;
65
66 public:
67 explicit PNAErrorCodesGen(EBPF::CodeBuilder *builder) : builder(builder) {}
68
69 bool preorder(const IR::Type_Error *errors) override {
70 int id = -1;
71 for (auto decl : errors->members) {
72 ++id;
73 if (decl->srcInfo.isValid()) {
74 auto sourceFile = decl->srcInfo.getSourceFile();
75 // all the error codes are located in core.p4 file, they are defined in pna.h
76 if (sourceFile.endsWith("p4include/core.p4")) continue;
77 }
78
79 builder->emitIndent();
80 builder->appendFormat("static const ParserError_t %v = %d", decl->name, id);
81 builder->endOfStatement(true);
82
83 // type ParserError_t is u8, which can have values from 0 to 255
84 if (id > 255) {
85 ::P4::error(ErrorType::ERR_OVERLIMIT,
86 "%1%: Reached maximum number of possible errors", decl);
87 }
88 }
89 builder->newline();
90 return false;
91 }
92};
93
94// Similar to class PSAArchTC in backends/ebpf/psa/ebpfPsaGen.h
95
96class PNAArchTC : public PNAEbpfGenerator {
97 public:
99
100 PNAArchTC(const EbpfOptions &options, std::vector<EBPF::EBPFType *> &ebpfTypes,
102 const ConvertToBackendIR *tcIR)
103 : PNAEbpfGenerator(options, ebpfTypes, pipeline, tcIR), xdp(xdp) {}
104
105 void emit(EBPF::CodeBuilder *builder) const override;
106 void emitParser(EBPF::CodeBuilder *builder) const override;
107 void emitHeader(EBPF::CodeBuilder *builder) const override;
108 void emitInstances(EBPF::CodeBuilder *builder) const override;
109 void emitGlobalFunctions(EBPF::CodeBuilder *builder) const;
110};
111
112class TCIngressPipelinePNA : public EBPF::TCIngressPipeline {
113 public:
114 TCIngressPipelinePNA(cstring name, const EbpfOptions &options, P4::ReferenceMap *refMap,
115 P4::TypeMap *typeMap)
116 : EBPF::TCIngressPipeline(name, options, refMap, typeMap) {}
117
118 void emit(EBPF::CodeBuilder *builder) override;
119 void emitLocalVariables(EBPF::CodeBuilder *builder) override;
120 void emitGlobalMetadataInitializer(EBPF::CodeBuilder *builder) override;
121 void emitTrafficManager(EBPF::CodeBuilder *builder) override;
122
123 DECLARE_TYPEINFO(TCIngressPipelinePNA, EBPF::TCIngressPipeline);
124};
125
126class PnaStateTranslationVisitor : public EBPF::PsaStateTranslationVisitor {
127 public:
128 explicit PnaStateTranslationVisitor(P4::ReferenceMap *refMap, P4::TypeMap *typeMap,
130 : EBPF::PsaStateTranslationVisitor(refMap, typeMap, prsr) {}
131
132 bool preorder(const IR::Member *expression) override;
133
134 protected:
135 void compileExtractField(const IR::Expression *expr, const IR::StructField *field,
136 unsigned hdrOffsetBits, EBPF::EBPFType *type) override;
137 void compileLookahead(const IR::Expression *destination) override;
138 bool preorder(const IR::SelectCase *selectCase) override;
139 bool preorder(const IR::SelectExpression *expression) override;
140 bool preorder(const IR::AssignmentStatement *statement) override;
141};
142
143class EBPFPnaParser : public EBPF::EBPFPsaParser {
144 public:
145 EBPFPnaParser(const EBPF::EBPFProgram *program, const IR::ParserBlock *block,
146 const P4::TypeMap *typeMap);
147 void emit(EBPF::CodeBuilder *builder) override;
148 void emitRejectState(EBPF::CodeBuilder *) override;
149 void emitDeclaration(EBPF::CodeBuilder *builder, const IR::Declaration *decl) override;
150
151 DECLARE_TYPEINFO(EBPFPnaParser, EBPF::EBPFPsaParser);
152};
153
154class EBPFTablePNA : public EBPF::EBPFTablePSA {
155 protected:
156 EBPF::ActionTranslationVisitor *createActionTranslationVisitor(cstring valueName,
157 const EBPF::EBPFProgram *program,
158 const IR::P4Action *action,
159 bool isDefaultAction) const;
160 void validateKeys() const override;
161 void initDirectCounters();
162 void initDirectMeters();
163 const ConvertToBackendIR *tcIR;
164
165 public:
166 EBPFTablePNA(const EBPF::EBPFProgram *program, const IR::TableBlock *table,
167 EBPF::CodeGenInspector *codeGen, const ConvertToBackendIR *tcIR)
168 : EBPF::EBPFTablePSA(program, table, codeGen), tcIR(tcIR) {
169 initDirectCounters();
170 initDirectMeters();
171 }
172 void emitInitializer(EBPF::CodeBuilder *builder) override;
173 void emitDefaultActionStruct(EBPF::CodeBuilder *builder);
174 void emitKeyType(EBPF::CodeBuilder *builder) override;
175 void emitValueType(EBPF::CodeBuilder *builder) override;
176 void emitValueStructStructure(EBPF::CodeBuilder *builder) override;
177 void emitActionArguments(EBPF::CodeBuilder *builder, const IR::P4Action *action, cstring name);
178 void emitKeyPNA(EBPF::CodeBuilder *builder, cstring keyName);
179 bool isMatchTypeSupported(const IR::Declaration_ID *matchType) override {
180 if (matchType->name.name == "range" || matchType->name.name == "rangelist" ||
181 matchType->name.name == "optional")
182 return 1;
183 return EBPF::EBPFTable::isMatchTypeSupported(matchType);
184 }
185 void emitAction(EBPF::CodeBuilder *builder, cstring valueName,
186 cstring actionRunVariable) override;
187 void emitValueActionIDNames(EBPF::CodeBuilder *builder) override;
188 cstring p4ActionToActionIDName(const IR::P4Action *action) const;
189
190 DECLARE_TYPEINFO(EBPFTablePNA, EBPF::EBPFTablePSA);
191};
192
194
195class DeparserBodyTranslatorPNA : public EBPF::DeparserBodyTranslatorPSA {
196 public:
197 explicit DeparserBodyTranslatorPNA(const IngressDeparserPNA *deparser);
198
199 void processFunction(const P4::ExternFunction *function) override;
200 bool preorder(const IR::AssignmentStatement *a) override;
201};
202
203class IngressDeparserPNA : public EBPF::EBPFDeparserPSA {
204 public:
205 mutable bool touched_skb_metadata;
206
207 IngressDeparserPNA(const EBPF::EBPFProgram *program, const IR::ControlBlock *control,
208 const IR::Parameter *parserHeaders, const IR::Parameter *istd)
209 : EBPF::EBPFDeparserPSA(program, control, parserHeaders, istd),
210 touched_skb_metadata(false) {
211 codeGen = new DeparserBodyTranslatorPNA(this);
212 }
213
214 bool addExternDeclaration = false;
215 bool build() override;
216 void emit(EBPF::CodeBuilder *builder) override;
217 void emitPreDeparser(EBPF::CodeBuilder *builder) override;
218 void emitDeclaration(EBPF::CodeBuilder *builder, const IR::Declaration *decl) override;
219
220 void emitExternDefinition(EBPF::CodeBuilder *builder) {
221 if (addExternDeclaration) {
222 builder->emitIndent();
223 builder->appendLine("struct p4tc_ext_bpf_params ext_params = {};");
224 }
225 }
226 DECLARE_TYPEINFO(IngressDeparserPNA, EBPF::EBPFDeparserPSA);
227};
228
229// Similar to class ConvertToEbpfPSA in backends/ebpf/psa/ebpfPsaGen.h
230
231class ConvertToEbpfPNA : public Transform {
232 const EbpfOptions &options;
233 P4::TypeMap *typemap;
234 P4::ReferenceMap *refmap;
235 const PNAEbpfGenerator *ebpf_program;
236 const ConvertToBackendIR *tcIR;
237
238 public:
239 ConvertToEbpfPNA(const EbpfOptions &options, P4::ReferenceMap *refmap, P4::TypeMap *typemap,
240 const ConvertToBackendIR *tcIR)
241 : options(options), typemap(typemap), refmap(refmap), ebpf_program(nullptr), tcIR(tcIR) {}
242
243 const PNAEbpfGenerator *build(const IR::ToplevelBlock *prog);
244 const IR::Node *preorder(IR::ToplevelBlock *p) override;
245 const PNAEbpfGenerator *getEBPFProgram() { return ebpf_program; }
246};
247
248// Similar to class ConvertToEbpfPipeline in backends/ebpf/psa/ebpfPsaGen.h
249
250class ConvertToEbpfPipelineTC : public Inspector {
251 const cstring name;
252 const EBPF::pipeline_type type;
253 const EbpfOptions &options;
254 const IR::ParserBlock *parserBlock;
255 const IR::ControlBlock *controlBlock;
256 const IR::ControlBlock *deparserBlock;
257 P4::TypeMap *typemap;
258 P4::ReferenceMap *refmap;
259 EBPF::EBPFPipeline *pipeline;
260 const ConvertToBackendIR *tcIR;
261 std::vector<EBPF::EBPFType *> ebpfTypes;
262
263 public:
264 ConvertToEbpfPipelineTC(cstring name, EBPF::pipeline_type type, const EbpfOptions &options,
265 const IR::ParserBlock *parserBlock,
266 const IR::ControlBlock *controlBlock,
267 const IR::ControlBlock *deparserBlock, P4::ReferenceMap *refmap,
268 P4::TypeMap *typemap, const ConvertToBackendIR *tcIR,
269 std::vector<EBPF::EBPFType *> ebpfTypes)
270 : name(name),
271 type(type),
272 options(options),
273 parserBlock(parserBlock),
274 controlBlock(controlBlock),
275 deparserBlock(deparserBlock),
276 typemap(typemap),
277 refmap(refmap),
278 pipeline(nullptr),
279 tcIR(tcIR),
280 ebpfTypes(ebpfTypes) {}
281
282 bool preorder(const IR::PackageBlock *block) override;
283 EBPF::EBPFPipeline *getEbpfPipeline() { return pipeline; }
284};
285
286// Similar to class ConvertToEBPFParserPSA in backends/ebpf/psa/ebpfPsaGen.h
287
288class ConvertToEBPFParserPNA : public Inspector {
289 EBPF::EBPFProgram *program;
290 P4::TypeMap *typemap;
291 TC::EBPFPnaParser *parser;
292
293 public:
294 ConvertToEBPFParserPNA(EBPF::EBPFProgram *program, P4::TypeMap *typemap)
295 : program(program), typemap(typemap), parser(nullptr) {}
296
297 bool preorder(const IR::ParserBlock *prsr) override;
298 bool preorder(const IR::P4ValueSet *pvs) override;
299 EBPF::EBPFParser *getEBPFParser() { return parser; }
300};
301
302class EBPFControlPNA : public EBPF::EBPFControlPSA {
303 public:
304 bool addExternDeclaration = false;
305 std::map<cstring, EBPFRegisterPNA *> pna_registers;
306 std::map<cstring, EBPFHashPNA *> pna_hashes;
307 std::map<cstring, EBPFRandomPNA *> pna_randoms;
308
309 mutable bool touched_skb_metadata;
310
311 EBPFControlPNA(const EBPF::EBPFProgram *program, const IR::ControlBlock *control,
312 const IR::Parameter *parserHeaders)
313 : EBPF::EBPFControlPSA(program, control, parserHeaders), touched_skb_metadata(false) {}
314
315 EBPFRegisterPNA *getRegister(cstring name) const {
316 auto result = ::P4::get(pna_registers, name);
317 BUG_CHECK(result != nullptr, "No register named %1%", name);
318 return result;
319 }
320 EBPFHashPNA *getHash(cstring name) const {
321 auto result = ::P4::get(pna_hashes, name);
322 return result;
323 }
324 EBPFRandomPNA *getRandom(cstring name) const {
325 auto result = ::P4::get(pna_randoms, name);
326 return result;
327 }
328 void emitExternDefinition(EBPF::CodeBuilder *builder) {
329 if (addExternDeclaration) {
330 builder->emitIndent();
331 builder->appendLine("struct p4tc_ext_bpf_params ext_params = {};");
332 builder->emitIndent();
333 builder->appendLine("struct p4tc_ext_bpf_val ext_val = {};");
334 builder->emitIndent();
335 builder->appendLine("struct p4tc_ext_bpf_val *ext_val_ptr;");
336 }
337 }
338 void emitTableTypes(EBPF::CodeBuilder *builder) { EBPF::EBPFControl::emitTableTypes(builder); }
339 void emit(EBPF::CodeBuilder *builder);
340};
341
342// Similar to class ConvertToEBPFControlPSA in backends/ebpf/psa/ebpfPsaGen.h
343
344class ConvertToEBPFControlPNA : public Inspector {
345 EBPF::EBPFProgram *program;
346 EBPF::pipeline_type type;
347 EBPFControlPNA *control;
348
349 const IR::Parameter *parserHeaders;
350 P4::ReferenceMap *refmap;
351
352 const ConvertToBackendIR *tcIR;
353
354 public:
355 ConvertToEBPFControlPNA(EBPF::EBPFProgram *program, const IR::Parameter *parserHeaders,
356 P4::ReferenceMap *refmap, EBPF::pipeline_type type,
357 const ConvertToBackendIR *tcIR)
358 : program(program),
359 type(type),
360 control(nullptr),
361 parserHeaders(parserHeaders),
362 refmap(refmap),
363 tcIR(tcIR) {}
364
365 bool preorder(const IR::TableBlock *) override;
366 bool preorder(const IR::ControlBlock *) override;
367 bool preorder(const IR::Declaration_Variable *) override;
368 bool preorder(const IR::Member *m) override;
369 bool preorder(const IR::IfStatement *a) override;
370 bool preorder(const IR::ExternBlock *instance) override;
371 bool checkPnaTimestampMem(const IR::Member *m);
372 EBPFControlPNA *getEBPFControl() { return control; }
373};
374
375// Similar to class ConvertToEBPFDeparserPSA in backends/ebpf/psa/ebpfPsaGen.h
376
377class ConvertToEBPFDeparserPNA : public Inspector {
378 EBPF::EBPFProgram *program;
379 const IR::Parameter *parserHeaders;
380 const IR::Parameter *istd;
381 const ConvertToBackendIR *tcIR;
382 std::vector<EBPF::EBPFType *> ebpfTypes;
383 TC::IngressDeparserPNA *deparser;
384
385 public:
386 ConvertToEBPFDeparserPNA(EBPF::EBPFProgram *program, const IR::Parameter *parserHeaders,
387 const IR::Parameter *istd, const ConvertToBackendIR *tcIR,
388 std::vector<EBPF::EBPFType *> ebpfTypes)
389 : program(program),
390 parserHeaders(parserHeaders),
391 istd(istd),
392 tcIR(tcIR),
393 ebpfTypes(ebpfTypes),
394 deparser(nullptr) {}
395
396 bool preorder(const IR::ControlBlock *) override;
397 bool preorder(const IR::Declaration_Instance *) override;
398 EBPF::EBPFDeparserPSA *getEBPFDeparser() { return deparser; }
399};
400
401// Similar to class ControlBodyTranslatorPSA in backends/ebpf/psa/ebpfPsaControl.h
402
403class ControlBodyTranslatorPNA : public EBPF::ControlBodyTranslator {
404 public:
405 const ConvertToBackendIR *tcIR;
406 const EBPF::EBPFTablePSA *table;
407 explicit ControlBodyTranslatorPNA(const EBPFControlPNA *control);
408 explicit ControlBodyTranslatorPNA(const EBPFControlPNA *control,
409 const ConvertToBackendIR *tcIR);
410 explicit ControlBodyTranslatorPNA(const EBPFControlPNA *control, const ConvertToBackendIR *tcIR,
411 const EBPF::EBPFTablePSA *table);
412 void processFunction(const P4::ExternFunction *function) override;
413 void processApply(const P4::ApplyMethod *method) override;
414 virtual cstring getParamName(const IR::PathExpression *);
415 bool preorder(const IR::AssignmentStatement *a) override;
416 void processMethod(const P4::ExternMethod *method) override;
417 bool preorder(const IR::Member *) override;
418 bool IsTableAddOnMiss(const IR::P4Table *table);
419 const IR::P4Action *GetAddOnMissHitAction(cstring actionName);
420 void ValidateAddOnMissMissAction(const IR::P4Action *act);
421 bool arithCommon(const IR::Operation_Binary *, const char *, const char *);
422 bool sarithCommon(const IR::Operation_Binary *, const char *);
423 bool preorder(const IR::Concat *) override;
424 bool preorder(const IR::Add *) override;
425 bool preorder(const IR::Sub *) override;
426 bool preorder(const IR::Mul *) override;
427 bool preorder(const IR::Cast *) override;
428 bool preorder(const IR::Neg *) override;
429 bool preorder(const IR::Cmpl *) override;
430 bool preorder(const IR::Shl *) override;
431 bool preorder(const IR::Shr *) override;
432 bool preorder(const IR::Equ *) override;
433 bool preorder(const IR::Neq *) override;
434 bool preorder(const IR::Lss *) override;
435 bool preorder(const IR::Leq *) override;
436 bool preorder(const IR::Grt *) override;
437 bool preorder(const IR::Geq *) override;
438 bool preorder(const IR::BAnd *) override;
439 bool preorder(const IR::BOr *) override;
440 bool preorder(const IR::BXor *) override;
441 bool preorder(const IR::AddSat *) override;
442 bool preorder(const IR::SubSat *) override;
443 bool preorder(const IR::Constant *) override;
444 bool bigXSmallMul(const IR::Expression *, const IR::Constant *);
445 void visitHostOrder(const IR::Expression *);
446};
447
448// Similar to class ActionTranslationVisitorPSA in backends/ebpf/psa/ebpfPsaControl.h
449
450class ActionTranslationVisitorPNA : public EBPF::ActionTranslationVisitor,
451 public ControlBodyTranslatorPNA {
452 protected:
453 const EBPF::EBPFTablePSA *table;
454 bool isDefaultAction;
455
456 public:
457 const ConvertToBackendIR *tcIR;
458 ActionTranslationVisitorPNA(const EBPF::EBPFProgram *program, cstring valueName,
459 const EBPF::EBPFTablePSA *table, const ConvertToBackendIR *tcIR,
460 const IR::P4Action *act, bool isDefaultAction);
461 bool preorder(const IR::PathExpression *pe) override;
462 bool isActionParameter(const IR::Expression *expression) const;
463 void processMethod(const P4::ExternMethod *method) override;
464
465 cstring getParamInstanceName(const IR::Expression *expression) const override;
466 cstring getParamName(const IR::PathExpression *) override;
467};
468
469// Similar to class DeparserHdrEmitTranslator in backends/ebpf/ebpfDeparser.h
470
471class DeparserHdrEmitTranslatorPNA : public EBPF::DeparserPrepareBufferTranslator {
472 protected:
473 const EBPF::EBPFDeparser *deparser;
474
475 public:
476 explicit DeparserHdrEmitTranslatorPNA(const EBPF::EBPFDeparser *deparser);
477
478 void processMethod(const P4::ExternMethod *method) override;
479 void emitField(EBPF::CodeBuilder *builder, cstring field, const IR::Expression *hdrExpr,
480 unsigned alignment, EBPF::EBPFType *type, bool isMAC);
481};
482
484 public:
485 static EBPFHashAlgorithmTypeFactoryPNA *instance() {
486 static EBPFHashAlgorithmTypeFactoryPNA factory;
487 return &factory;
488 }
489
490 EBPF::EBPFHashAlgorithmPSA *create(int type, const EBPF::EBPFProgram *program, cstring name);
491};
492
494 public:
495 static EBPFChecksumAlgorithmTypeFactoryPNA *instance() {
497 return &factory;
498 }
499
500 EBPF::EBPFHashAlgorithmPSA *create(int type, const EBPF::EBPFProgram *program, cstring name);
501};
502
503} // namespace P4::TC
504
505#endif /* BACKENDS_TC_EBPFCODEGEN_H_ */
Definition methodInstance.h:129
Definition ebpfTable.h:26
Definition ebpf/codeGen.h:33
Definition ebpf/codeGen.h:41
Definition ebpfControl.h:28
Definition ebpfPsaDeparser.h:31
This translator emits buffer preparation (eg. which headers will be emitted)
Definition ebpfDeparser.h:38
Definition ebpfPsaControl.h:59
Definition ebpfDeparser.h:63
Definition ebpfPsaDeparser.h:39
Definition ebpfPsaHashAlgorithm.h:26
Definition ebpfPsaHashAlgorithm.h:172
Definition ebpfParser.h:81
EBPFPipeline represents a single eBPF program in the TC/XDP hook.
Definition ebpfPipeline.h:28
cstring name
A custom name of eBPF program.
Definition ebpfPipeline.h:31
Definition ebpfProgram.h:39
Definition ebpfPsaParser.h:40
Definition ebpfPsaTable.h:29
Base class for EBPF types.
Definition ebpfType.h:29
Definition ebpfPsaGen.h:31
Definition ebpfPsaParser.h:29
Definition ebpfPipeline.h:199
Definition xdpHelpProgram.h:24
Definition ebpfOptions.h:26
Definition methodInstance.h:194
Definition methodInstance.h:168
Definition node.h:94
Class used to encode maps from paths to declarations.
Definition referenceMap.h:67
Definition tc/backend.h:327
Definition ebpfCodeGen.h:195
Definition ebpfCodeGen.h:302
Definition ebpfCodeGen.h:483
Definition tcExterns.h:181
Definition ebpfCodeGen.h:143
Definition tcExterns.h:321
Definition tcExterns.h:53
void validateKeys() const override
Definition ebpfCodeGen.cpp:2657
Definition ebpfCodeGen.h:203
void emitPreDeparser(EBPF::CodeBuilder *builder) override
Definition ebpfCodeGen.cpp:1432
void emit(EBPF::CodeBuilder *builder) const override
Definition ebpfCodeGen.cpp:179
void emitParser(EBPF::CodeBuilder *builder) const override
Definition ebpfCodeGen.cpp:277
Definition ebpfCodeGen.h:36
void emitLocalVariables(EBPF::CodeBuilder *builder) override
Generates a set of helper variables that are used during packet processing.
Definition ebpfCodeGen.cpp:600
void emitGlobalMetadataInitializer(EBPF::CodeBuilder *builder) override
Definition ebpfCodeGen.cpp:527
void emitTrafficManager(EBPF::CodeBuilder *builder) override
Definition ebpfCodeGen.cpp:569
Definition typeMap.h:41
Definition cstring.h:85
This file defines functions for the pass to generate the introspection file.
Definition tc/backend.cpp:27
void error(const char *format, Args &&...args)
Report an error with the given message.
Definition lib/error.h:58