35 const IR::P4Table *table;
36 const IR::MethodCallExpression *call;
38 : refMap(refMap), typeMap(typeMap), table(
nullptr), call(
nullptr) {
41 setName(
"HasTableApply");
44 void postorder(
const IR::MethodCallExpression *expression)
override {
46 if (!mi->isApply())
return;
48 if (!am->object->is<IR::P4Table>())
return;
49 BUG_CHECK(table ==
nullptr,
"%1% and %2%: multiple table applications in one expression",
51 table = am->object->to<IR::P4Table>();
53 LOG3(
"Invoked table is " << dbp(table));
185 std::set<const IR::Expression *> *added;
187 IR::IndexedVector<IR::Declaration> toInsert;
188 IR::IndexedVector<IR::StatOrDecl> statements;
191 std::set<const IR::Expression *> temporaries;
193 cstring createTemporary(
const IR::Type *type);
195 const IR::Expression *expression);
196 bool mayAlias(
const IR::Expression *left,
const IR::Expression *right)
const;
197 bool containsHeaderType(
const IR::Type *type);
201 std::set<const IR::Expression *> *added)
202 : refMap(refMap), typeMap(typeMap), added(added) {
205 setName(
"DoSimplifyExpressions");
208 const IR::Node *postorder(IR::Expression *expression)
override;
209 const IR::Node *preorder(IR::StructExpression *expression)
override;
210 const IR::Node *preorder(IR::ListExpression *expression)
override;
211 const IR::Node *preorder(IR::Literal *expression)
override;
212 const IR::Node *preorder(IR::ArrayIndex *expression)
override;
213 const IR::Node *preorder(IR::Member *expression)
override;
214 const IR::Node *preorder(IR::SelectExpression *expression)
override;
215 const IR::Node *preorder(IR::Operation_Unary *expression)
override;
216 const IR::Node *preorder(IR::Operation_Binary *expression)
override;
217 const IR::Node *shortCircuit(IR::Operation_Binary *expression);
218 const IR::Node *preorder(IR::Mux *expression)
override;
219 const IR::Node *preorder(IR::LAnd *expression)
override;
220 const IR::Node *preorder(IR::LOr *expression)
override;
221 const IR::Node *preorder(IR::MethodCallExpression *mce)
override;
223 const IR::Node *preorder(IR::ConstructorCallExpression *cce)
override {
227 const IR::Node *preorder(IR::Property *prop)
override {
231 const IR::Node *preorder(IR::Annotation *anno)
override {
236 const IR::Node *postorder(IR::P4Parser *parser)
override;
237 const IR::Node *postorder(IR::Function *function)
override;
238 const IR::Node *postorder(IR::P4Control *control)
override;
239 const IR::Node *postorder(IR::P4Action *action)
override;
240 const IR::Node *postorder(IR::ParserState *state)
override;
241 const IR::Node *postorder(IR::AssignmentStatement *statement)
override;
242 const IR::Node *postorder(IR::MethodCallStatement *statement)
override;
243 const IR::Node *postorder(IR::ReturnStatement *statement)
override;
244 const IR::Node *preorder(IR::SwitchStatement *statement)
override;
245 const IR::Node *preorder(IR::IfStatement *statement)
override;
247 void end_apply(
const IR::Node *)
override;
298 std::map<const IR::P4Table *, TableInsertions *> toInsert;
299 std::set<const IR::P4Table *> *invokedInKey;
303 std::set<const IR::P4Table *> *invokedInKey)
304 : refMap(refMap), typeMap(typeMap), invokedInKey(invokedInKey) {
307 CHECK_NULL(invokedInKey);
308 setName(
"KeySideEffect");
310 virtual const IR::Node *doStatement(
const IR::Statement *statement,
311 const IR::Expression *expression);
313 const IR::Node *preorder(IR::Key *key)
override;
317 const IR::Node *postorder(IR::MethodCallStatement *statement)
override {
318 return doStatement(statement, statement->methodCall);
320 const IR::Node *postorder(IR::IfStatement *statement)
override {
321 return doStatement(statement, statement->condition);
323 const IR::Node *postorder(IR::SwitchStatement *statement)
override {
324 return doStatement(statement, statement->expression);
326 const IR::Node *postorder(IR::AssignmentStatement *statement)
override {
327 return doStatement(statement, statement->right);
329 const IR::Node *postorder(IR::KeyElement *element)
override;
330 const IR::Node *postorder(IR::P4Table *table)
override;
331 const IR::Node *preorder(IR::P4Table *table)
override;
342 std::set<const IR::P4Table *> *invokedInKey;
346 std::set<const IR::P4Table *> *invokedInKey)
347 : refMap(refMap), typeMap(typeMap), invokedInKey(invokedInKey) {
348 CHECK_NULL(invokedInKey);
349 setName(
"TableInKeys");
351 Visitor::profile_t init_apply(
const IR::Node *node)
override {
352 invokedInKey->clear();
353 return Inspector::init_apply(node);
355 void postorder(
const IR::MethodCallExpression *mce)
override {
356 if (!findContext<IR::Key>())
return;
358 hta.setCalledBy(
this);
359 (void)mce->apply(hta);
360 if (hta.table !=
nullptr) {
361 LOG2(
"Table " << hta.table <<
" invoked in key of another table");
362 invokedInKey->emplace(hta.table);
378 void postorder(
const IR::MethodCallExpression *expression)
override {
379 if (findContext<IR::ActionList>()) {
381 hta.setCalledBy(
this);
382 (void)expression->apply(hta);
383 if (hta.table !=
nullptr) {
384 ::error(ErrorType::ERR_UNSUPPORTED,
"%1%: table invocation in action argument",
396 std::set<const IR::P4Table *> invokedInKey;
398 std::set<const IR::Expression *> added;
403 if (!typeChecking) typeChecking =
new TypeChecking(refMap, typeMap);
404 if (!skipSideEffectOrdering) {
407 passes.push_back(typeChecking);
409 passes.push_back(
new TablesInKeys(refMap, typeMap, &invokedInKey));
410 passes.push_back(
new KeySideEffect(refMap, typeMap, &invokedInKey));
412 setName(
"SideEffectOrdering");
static MethodInstance * resolve(const IR::MethodCallExpression *mce, DeclarationLookup *refMap, TypeMap *typeMap, bool useExpressionType=false, const Visitor::Context *ctxt=nullptr, bool incomplete=false)
Definition methodInstance.cpp:26
static bool check(const IR::Expression *expression, const Visitor *calledBy, ReferenceMap *refMap, TypeMap *typeMap)
Definition sideEffects.h:108