37 std::map<const IR::Parameter *, const IR::Parameter *> substitution;
47 int expressionPrecedence;
52 expressionPrecedence(DBPrint::Prec_Low) {
60 this->builder = builder;
63 void substitute(
const IR::Parameter *p,
const IR::Parameter *with);
65 for (
auto s : other->substitution) substitute(s.first, s.second);
68 void useAsPointerVariable(cstring name) { this->asPointerVariables.insert(name); }
70 for (
auto s : other->asPointerVariables) {
76 bool notSupported(
const IR::Node *n) {
77 ::P4::error(ErrorType::ERR_UNSUPPORTED,
"%1%: not yet implemented", n);
81 bool preorder(
const IR::Expression *expression)
override {
return notSupported(expression); }
82 bool preorder(
const IR::Range *expression)
override {
return notSupported(expression); }
83 bool preorder(
const IR::Mask *expression)
override {
return notSupported(expression); }
84 bool preorder(
const IR::Slice *expression)
override
86 return notSupported(expression);
88 bool preorder(
const IR::StringLiteral *expression)
override;
89 bool preorder(
const IR::ListExpression *expression)
override;
90 bool preorder(
const IR::PathExpression *expression)
override;
91 bool preorder(
const IR::Constant *expression)
override;
92 bool preorder(
const IR::Declaration_Variable *decl)
override;
93 bool preorder(
const IR::BoolLiteral *b)
override;
94 bool preorder(
const IR::Cast *c)
override;
95 bool preorder(
const IR::Operation_Binary *b)
override;
96 bool preorder(
const IR::Operation_Unary *u)
override;
97 bool preorder(
const IR::ArrayIndex *a)
override;
98 bool preorder(
const IR::Mux *a)
override;
99 bool preorder(
const IR::Member *e)
override;
100 bool preorder(
const IR::MethodCallExpression *expression)
override;
101 bool comparison(
const IR::Operation_Relation *comp);
102 bool preorder(
const IR::Equ *e)
override {
return comparison(e); }
103 bool preorder(
const IR::Neq *e)
override {
return comparison(e); }
104 bool preorder(
const IR::Path *path)
override;
105 bool preorder(
const IR::StructExpression *expr)
override;
107 bool preorder(
const IR::Type_Typedef *type)
override;
108 bool preorder(
const IR::Type_Enum *type)
override;
109 void emitAssignStatement(
const IR::Type *ltype,
const IR::Expression *lexpr, cstring lpath,
110 const IR::Expression *rexpr);
111 bool preorder(
const IR::BaseAssignmentStatement *s)
override {
return notSupported(s); }
112 bool preorder(
const IR::AssignmentStatement *s)
override;
113 bool preorder(
const IR::BlockStatement *s)
override;
114 bool preorder(
const IR::MethodCallStatement *s)
override;
115 bool preorder(
const IR::EmptyStatement *s)
override;
116 bool preorder(
const IR::ReturnStatement *s)
override;
117 bool preorder(
const IR::ExitStatement *s)
override;
118 bool preorder(
const IR::IfStatement *s)
override;
120 void widthCheck(
const IR::Node *node)
const;
121 bool scalarType(
const IR::Node *node)
const;
122 void emitAndConvertByteOrder(
const IR::Expression *expr, cstring byte_order);
123 void emitTCBinaryOperation(
const IR::Operation_Binary *);
124 void emitTCAssignmentEndianessConversion(
const IR::Type *ltype,
const IR::Expression *lexpr,
125 const IR::Expression *rexpr, cstring lpath);
126 void getBitAlignment(
const IR::Expression *expression);
127 bool storeBitAlignment(
const IR::Type *ltype,
const IR::Expression *lexpr, cstring lpath);
128 void emitTCLarge(
const IR::Operation_Binary *,
unsigned int);
static unsigned ebpfTypeWidth(P4::TypeMap *typeMap, const IR::Expression *expr)
return real number of bits required by type
Definition codeGen.cpp:645
static cstring genHexStr(const big_int &value, unsigned width, const IR::Expression *expr)
Generate hex string and prepend it with zeroes when shorter than required width.
Definition codeGen.cpp:664
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13
void error(const char *format, Args &&...args)
Report an error with the given message.
Definition lib/error.h:49