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