17#ifndef FRONTENDS_P4_METHODINSTANCE_H_
18#define FRONTENDS_P4_METHODINSTANCE_H_
20#include "frontends/common/resolveReferences/referenceMap.h"
21#include "frontends/p4/parameterSubstitution.h"
22#include "frontends/p4/typeMap.h"
58 MethodInstance(
const IR::MethodCallExpression *mce,
const IR::IDeclaration *decl,
70 void bindParameters() {
71 auto params = getActualParameters();
76 const IR::MethodCallExpression *expr;
86 virtual bool isApply()
const {
return false; }
96 bool useExpressionType =
false,
97 const Visitor::Context *ctxt =
nullptr,
bool incomplete =
false);
100 const Visitor::Context *ctxt,
bool incomplete =
false) {
101 return resolve(mce, refMap, typeMap,
false, ctxt, incomplete);
103 static MethodInstance *
resolve(
const IR::MethodCallStatement *mcs,
104 const DeclarationLookup *refMap,
TypeMap *typeMap,
105 const Visitor::Context *ctxt =
nullptr) {
106 return resolve(mcs->methodCall, refMap, typeMap,
false, ctxt,
false);
108 static MethodInstance *
resolve(
const IR::MethodCallExpression *mce,
109 const DeclarationLookup *refMap,
110 const Visitor::Context *ctxt =
nullptr) {
111 return resolve(mce, refMap,
nullptr,
true, ctxt,
false);
113 static MethodInstance *
resolve(
const IR::MethodCallStatement *mcs,
114 const DeclarationLookup *refMap,
115 const Visitor::Context *ctxt =
nullptr) {
116 return resolve(mcs->methodCall, refMap,
nullptr,
true, ctxt,
false);
119 const IR::ParameterList *getOriginalParameters()
const {
122 const IR::ParameterList *getActualParameters()
const {
return actualMethodType->parameters; }
124 DECLARE_TYPEINFO(MethodInstance, InstanceBase);
129class ApplyMethod final :
public MethodInstance {
130 ApplyMethod(
const IR::MethodCallExpression *expr,
const IR::IDeclaration *decl,
131 const IR::IApply *applyObject)
132 : MethodInstance(expr, decl, applyObject->getApplyMethodType(),
133 applyObject->getApplyMethodType()),
134 applyObject(applyObject) {
135 CHECK_NULL(applyObject);
138 friend class MethodInstance;
141 const IR::IApply *applyObject;
142 bool isApply()
const override {
return true; }
143 bool isTableApply()
const {
return object->is<IR::P4Table>(); }
145 DECLARE_TYPEINFO(ApplyMethod, MethodInstance);
149class ExternMethod final :
public MethodInstance {
150 ExternMethod(
const IR::MethodCallExpression *expr,
const IR::IDeclaration *decl,
151 const IR::Method *method,
const IR::Type_Extern *originalExternType,
156 originalExternType(originalExternType),
157 actualExternType(actualExternType) {
159 CHECK_NULL(originalExternType);
160 CHECK_NULL(actualExternType);
163 typeSubstitution.setBindings(expr, method->type->typeParameters, expr->typeArguments);
165 friend class MethodInstance;
168 const IR::Method *method;
169 const IR::Type_Extern *originalExternType;
170 const IR::Type_Extern *actualExternType;
175 std::vector<const IR::IDeclaration *>
mayCall()
const;
177 DECLARE_TYPEINFO(ExternMethod, MethodInstance);
181class ExternFunction final :
public MethodInstance {
182 ExternFunction(
const IR::MethodCallExpression *expr,
const IR::Method *method,
189 typeSubstitution.setBindings(expr, method->type->typeParameters, expr->typeArguments);
191 friend class MethodInstance;
194 const IR::Method *method;
196 DECLARE_TYPEINFO(ExternFunction, MethodInstance);
203class ActionCall final :
public MethodInstance {
204 ActionCall(
const IR::MethodCallExpression *expr,
const IR::P4Action *action,
205 const IR::Type_Action *actionType)
207 MethodInstance(expr,
nullptr, actionType, actionType),
212 friend class MethodInstance;
215 const IR::P4Action *action;
220 DECLARE_TYPEINFO(ActionCall, MethodInstance);
226class FunctionCall final :
public MethodInstance {
227 FunctionCall(
const IR::MethodCallExpression *expr,
const IR::Function *function,
231 CHECK_NULL(function);
235 expr->typeArguments);
237 friend class MethodInstance;
240 const IR::Function *function;
242 DECLARE_TYPEINFO(FunctionCall, MethodInstance);
254class BuiltInMethod final :
public MethodInstance {
255 friend class MethodInstance;
256 BuiltInMethod(
const IR::MethodCallExpression *expr,
IR::ID name,
257 const IR::Expression *appliedTo,
const IR::Type_Method *methodType)
258 : MethodInstance(expr,
nullptr, methodType, methodType), name(name), appliedTo(appliedTo) {
259 CHECK_NULL(appliedTo);
265 const IR::Expression *appliedTo;
267 DECLARE_TYPEINFO(BuiltInMethod, MethodInstance);
280 virtual ~ConstructorCall() {}
281 explicit ConstructorCall(
const IR::ConstructorCallExpression *cce) : cce(cce) {
286 const IR::ConstructorCallExpression *cce =
nullptr;
288 const IR::ParameterList *constructorParameters =
nullptr;
289 static ConstructorCall *resolve(
const IR::ConstructorCallExpression *cce,
295class ExternConstructorCall :
public ConstructorCall {
296 explicit ExternConstructorCall(
const IR::ConstructorCallExpression *cce,
297 const IR::Type_Extern *type,
const IR::Method *constructor)
298 : ConstructorCall(cce), type(type), constructor(constructor) {
300 CHECK_NULL(constructor);
302 friend class ConstructorCall;
305 const IR::Type_Extern *type;
306 const IR::Method *constructor;
308 DECLARE_TYPEINFO(ExternConstructorCall, ConstructorCall);
313class ContainerConstructorCall :
public ConstructorCall {
314 explicit ContainerConstructorCall(
const IR::ConstructorCallExpression *cce,
315 const IR::IContainer *cont)
316 : ConstructorCall(cce), container(cont) {
319 friend class ConstructorCall;
322 const IR::IContainer *container;
324 DECLARE_TYPEINFO(ContainerConstructorCall, ConstructorCall);
333 substitution.populate(constructorParameters, constructorArguments);
338 Instantiation(
const IR::Declaration_Instance *instance,
340 : instance(instance), typeArguments(typeArguments) {
341 CHECK_NULL(instance);
342 constructorArguments = instance->arguments;
345 const IR::Declaration_Instance *instance;
348 const IR::ParameterList *constructorParameters =
nullptr;
349 const IR::TypeParameters *typeParameters =
nullptr;
351 static Instantiation *resolve(
const IR::Declaration_Instance *instance,
357class ExternInstantiation :
public Instantiation {
359 ExternInstantiation(
const IR::Declaration_Instance *instance,
361 : Instantiation(instance, typeArguments), type(type) {
362 auto constructor = type->lookupConstructor(constructorArguments);
363 BUG_CHECK(constructor,
"%1%: could not find constructor", type);
364 constructorParameters = constructor->type->parameters;
365 typeParameters = type->typeParameters;
368 const IR::Type_Extern *type;
370 DECLARE_TYPEINFO(ExternInstantiation, Instantiation);
373class PackageInstantiation :
public Instantiation {
375 PackageInstantiation(
const IR::Declaration_Instance *instance,
377 : Instantiation(instance, typeArguments), package(package) {
378 constructorParameters = package->getConstructorParameters();
379 typeParameters = package->typeParameters;
382 const IR::Type_Package *package;
384 DECLARE_TYPEINFO(PackageInstantiation, Instantiation);
387class ParserInstantiation :
public Instantiation {
389 ParserInstantiation(
const IR::Declaration_Instance *instance,
391 : Instantiation(instance, typeArguments), parser(parser) {
392 typeParameters = parser->type->typeParameters;
393 constructorParameters = parser->getConstructorParameters();
396 const IR::P4Parser *parser;
398 DECLARE_TYPEINFO(ParserInstantiation, Instantiation);
401class ControlInstantiation :
public Instantiation {
403 ControlInstantiation(
const IR::Declaration_Instance *instance,
405 : Instantiation(instance, typeArguments), control(control) {
406 typeParameters = control->type->typeParameters;
407 constructorParameters = control->getConstructorParameters();
410 const IR::P4Control *control;
412 DECLARE_TYPEINFO(ControlInstantiation, Instantiation);
const IR::P4Action * specialize(const DeclarationLookup *refMap) const
Definition methodInstance.cpp:126
Definition referenceMap.h:57
std::vector< const IR::IDeclaration * > mayCall() const
Set of IR::Method and IR::Function objects that may be called by this method.
Definition methodInstance.cpp:198
The Declaration interface, representing objects with names.
Definition declaration.h:26
Definition methodInstance.h:27
TypeVariableSubstitution typeSubstitution
Definition methodInstance.h:36
ParameterSubstitution substitution
For each callee parameter the corresponding argument.
Definition methodInstance.h:33
Definition methodInstance.h:56
const IR::Type_MethodBase * actualMethodType
Definition methodInstance.h:85
const IR::Type_MethodBase * originalMethodType
Definition methodInstance.h:82
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
const IR::IDeclaration * object
Definition methodInstance.h:79
Definition parameterSubstitution.h:30
Definition typeSubstitution.h:73
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24