17#ifndef MIDEND_CHECKEXTERNINVOCATIONCOMMON_H_
18#define MIDEND_CHECKEXTERNINVOCATIONCOMMON_H_
20#include "frontends/common/resolveReferences/resolveReferences.h"
21#include "frontends/p4/methodInstance.h"
23#include "ir/visitor.h"
24#include "lib/bitvec.h"
89 const IR::MethodCallExpression *expr) {
101 int bit = vec.ffs(0);
102 BUG_CHECK(vec.ffs(bit),
"Trying to extract multiple block encodings");
116 if (!pipeConstraints.count(extType)) {
117 pipeConstraints.emplace(extType, vec);
119 auto &cons = pipeConstraints.at(extType);
139 BUG_CHECK(pipeConstraints.count(extType),
"pipe constraints not defined for %1%", extType);
140 auto constraint = pipeConstraints.at(extType) & bv;
141 if (!bv.empty() && constraint.empty()) {
143 ::P4::error(ErrorType::ERR_UNSUPPORTED,
"%s %s %s cannot be used in the %s %s",
144 expr->srcInfo, extType, extName, pipe,
extractBlock(bv));
146 ::P4::error(ErrorType::ERR_UNSUPPORTED,
"%s %s cannot be used in the %s %s",
154 bool preorder(
const IR::MethodCallExpression *expr)
override {
156 if (
auto extMethod = mi->to<ExternMethod>()) {
158 }
else if (
auto extFunction = mi->to<ExternFunction>()) {
Base class which can be used to prepare classes for checking constraints for invocations of externs (...
Definition checkExternInvocationCommon.h:41
void setPipeConstraints(cstring extType, bitvec vec)
Set the pipe (parser/control block) constraints.
Definition checkExternInvocationCommon.h:115
cstring extractBlock(bitvec vec)
Get the name of the block which is represented by bit set in the bitvec.
Definition checkExternInvocationCommon.h:100
virtual cstring getBlockName(int bit)=0
Get the name of the block which is represented in bit vector (bitvec) by bit with index given by 'bit...
virtual void initPipeConstraints()=0
Method used to initialize the constraints.
virtual void checkExtern(const ExternMethod *extMethod, const IR::MethodCallExpression *expr)
Method for checking constraints of extern method given by parameters.
Definition checkExternInvocationCommon.h:74
virtual void checkExtern(const ExternFunction *extFunction, const IR::MethodCallExpression *expr)
Method for checking constraints of extern functions given by parameters.
Definition checkExternInvocationCommon.h:88
void checkPipeConstraints(cstring extType, bitvec bv, const IR::MethodCallExpression *expr, cstring extName, cstring pipe)
Check if the invocation of extern object method or extern function is valid in the block where it is ...
Definition checkExternInvocationCommon.h:137
Definition methodInstance.h:194
Definition methodInstance.h:168
static MethodInstance * resolve(const IR::MethodCallExpression *mce, const DeclarationLookup *refMap, TypeMap *typeMap, bool useExpressionType=false, const Visitor::Context *ctxt=nullptr, bool incomplete=false)
Definition methodInstance.cpp:27
Visitor mixin for looking up names in enclosing scopes from the Visitor::Context.
Definition resolveReferences.h:35
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24
void error(const char *format, Args &&...args)
Report an error with the given message.
Definition lib/error.h:51