8#ifndef FRONTENDS_P4_METHODINSTANCE_H_
9#define FRONTENDS_P4_METHODINSTANCE_H_
11#include "frontends/common/resolveReferences/referenceMap.h"
12#include "frontends/p4/parameterSubstitution.h"
13#include "frontends/p4/typeMap.h"
49 MethodInstance(
const IR::MethodCallExpression *mce,
const IR::IDeclaration *decl,
61 void bindParameters() {
62 auto params = getActualParameters();
67 const IR::MethodCallExpression *expr;
77 virtual bool isApply()
const {
return false; }
87 bool useExpressionType =
false,
88 const Visitor::Context *ctxt =
nullptr,
bool incomplete =
false);
91 const Visitor::Context *ctxt,
bool incomplete =
false) {
92 return resolve(mce, refMap, typeMap,
false, ctxt, incomplete);
94 static MethodInstance *
resolve(
const IR::MethodCallStatement *mcs,
95 const DeclarationLookup *refMap,
TypeMap *typeMap,
96 const Visitor::Context *ctxt =
nullptr) {
97 return resolve(mcs->methodCall, refMap, typeMap,
false, ctxt,
false);
99 static MethodInstance *
resolve(
const IR::MethodCallExpression *mce,
100 const DeclarationLookup *refMap,
101 const Visitor::Context *ctxt =
nullptr) {
102 return resolve(mce, refMap,
nullptr,
true, ctxt,
false);
104 static MethodInstance *
resolve(
const IR::MethodCallStatement *mcs,
105 const DeclarationLookup *refMap,
106 const Visitor::Context *ctxt =
nullptr) {
107 return resolve(mcs->methodCall, refMap,
nullptr,
true, ctxt,
false);
110 const IR::ParameterList *getOriginalParameters()
const {
113 const IR::ParameterList *getActualParameters()
const {
return actualMethodType->parameters; }
115 DECLARE_TYPEINFO(MethodInstance, InstanceBase);
120class ApplyMethod final :
public MethodInstance {
121 ApplyMethod(
const IR::MethodCallExpression *expr,
const IR::IDeclaration *decl,
122 const IR::IApply *applyObject)
123 : MethodInstance(expr, decl, applyObject->getApplyMethodType(),
124 applyObject->getApplyMethodType()),
125 applyObject(applyObject) {
126 CHECK_NULL(applyObject);
129 friend class MethodInstance;
132 const IR::IApply *applyObject;
133 bool isApply()
const override {
return true; }
134 bool isTableApply()
const {
return object->is<IR::P4Table>(); }
136 DECLARE_TYPEINFO(ApplyMethod, MethodInstance);
140class ExternCall :
public MethodInstance {
142 ExternCall(
const IR::MethodCallExpression *expr,
const IR::IDeclaration *decl,
149 typeSubstitution.setBindings(expr, method->type->typeParameters, expr->typeArguments);
153 const IR::Method *method;
155 DECLARE_TYPEINFO(ExternCall, MethodInstance);
159class ExternMethod final :
public ExternCall {
160 ExternMethod(
const IR::MethodCallExpression *expr,
const IR::IDeclaration *decl,
161 const IR::Method *method,
const IR::Type_Extern *originalExternType,
165 originalExternType(originalExternType),
166 actualExternType(actualExternType) {
167 CHECK_NULL(originalExternType);
168 CHECK_NULL(actualExternType);
170 friend class MethodInstance;
173 const IR::Type_Extern *originalExternType;
174 const IR::Type_Extern *actualExternType;
179 std::vector<const IR::IDeclaration *>
mayCall()
const;
181 DECLARE_TYPEINFO(ExternMethod, ExternCall);
185class ExternFunction final :
public ExternCall {
186 ExternFunction(
const IR::MethodCallExpression *expr,
const IR::Method *method,
190 friend class MethodInstance;
193 DECLARE_TYPEINFO(ExternFunction, ExternCall);
200class ActionCall final :
public MethodInstance {
201 ActionCall(
const IR::MethodCallExpression *expr,
const IR::P4Action *action,
202 const IR::Type_Action *actionType)
204 MethodInstance(expr,
nullptr, actionType, actionType),
209 friend class MethodInstance;
212 const IR::P4Action *action;
217 DECLARE_TYPEINFO(ActionCall, MethodInstance);
223class FunctionCall final :
public MethodInstance {
224 FunctionCall(
const IR::MethodCallExpression *expr,
const IR::Function *function,
228 CHECK_NULL(function);
232 expr->typeArguments);
234 friend class MethodInstance;
237 const IR::Function *function;
239 DECLARE_TYPEINFO(FunctionCall, MethodInstance);
251class BuiltInMethod final :
public MethodInstance {
252 friend class MethodInstance;
253 BuiltInMethod(
const IR::MethodCallExpression *expr,
IR::ID name,
254 const IR::Expression *appliedTo,
const IR::Type_Method *methodType)
255 : MethodInstance(expr,
nullptr, methodType, methodType), name(name), appliedTo(appliedTo) {
256 CHECK_NULL(appliedTo);
262 const IR::Expression *appliedTo;
264 DECLARE_TYPEINFO(BuiltInMethod, MethodInstance);
277 virtual ~ConstructorCall() {}
278 explicit ConstructorCall(
const IR::ConstructorCallExpression *cce) : cce(cce) {
283 const IR::ConstructorCallExpression *cce =
nullptr;
285 const IR::ParameterList *constructorParameters =
nullptr;
286 static ConstructorCall *resolve(
const IR::ConstructorCallExpression *cce,
292class ExternConstructorCall :
public ConstructorCall {
293 explicit ExternConstructorCall(
const IR::ConstructorCallExpression *cce,
294 const IR::Type_Extern *type,
const IR::Method *constructor)
295 : ConstructorCall(cce), type(type), constructor(constructor) {
297 CHECK_NULL(constructor);
299 friend class ConstructorCall;
302 const IR::Type_Extern *type;
303 const IR::Method *constructor;
305 DECLARE_TYPEINFO(ExternConstructorCall, ConstructorCall);
310class ContainerConstructorCall :
public ConstructorCall {
311 explicit ContainerConstructorCall(
const IR::ConstructorCallExpression *cce,
312 const IR::IContainer *cont)
313 : ConstructorCall(cce), container(cont) {
316 friend class ConstructorCall;
319 const IR::IContainer *container;
321 DECLARE_TYPEINFO(ContainerConstructorCall, ConstructorCall);
330 substitution.populate(constructorParameters, constructorArguments);
335 Instantiation(
const IR::Declaration_Instance *instance,
337 : instance(instance), typeArguments(typeArguments) {
338 CHECK_NULL(instance);
339 constructorArguments = instance->arguments;
342 const IR::Declaration_Instance *instance;
345 const IR::ParameterList *constructorParameters =
nullptr;
346 const IR::TypeParameters *typeParameters =
nullptr;
348 static Instantiation *resolve(
const IR::Declaration_Instance *instance,
354class ExternInstantiation :
public Instantiation {
356 ExternInstantiation(
const IR::Declaration_Instance *instance,
358 : Instantiation(instance, typeArguments), type(type) {
359 auto constructor = type->lookupConstructor(constructorArguments);
360 BUG_CHECK(constructor,
"%1%: could not find constructor", type);
361 constructorParameters = constructor->type->parameters;
362 typeParameters = type->typeParameters;
365 const IR::Type_Extern *type;
367 DECLARE_TYPEINFO(ExternInstantiation, Instantiation);
370class PackageInstantiation :
public Instantiation {
372 PackageInstantiation(
const IR::Declaration_Instance *instance,
374 : Instantiation(instance, typeArguments), package(package) {
375 constructorParameters = package->getConstructorParameters();
376 typeParameters = package->typeParameters;
379 const IR::Type_Package *package;
381 DECLARE_TYPEINFO(PackageInstantiation, Instantiation);
384class ParserInstantiation :
public Instantiation {
386 ParserInstantiation(
const IR::Declaration_Instance *instance,
388 : Instantiation(instance, typeArguments), parser(parser) {
389 typeParameters = parser->type->typeParameters;
390 constructorParameters = parser->getConstructorParameters();
393 const IR::P4Parser *parser;
395 DECLARE_TYPEINFO(ParserInstantiation, Instantiation);
398class ControlInstantiation :
public Instantiation {
400 ControlInstantiation(
const IR::Declaration_Instance *instance,
402 : Instantiation(instance, typeArguments), control(control) {
403 typeParameters = control->type->typeParameters;
404 constructorParameters = control->getConstructorParameters();
407 const IR::P4Control *control;
409 DECLARE_TYPEINFO(ControlInstantiation, Instantiation);
const IR::P4Action * specialize(const DeclarationLookup *refMap) const
Definition methodInstance.cpp:118
Definition referenceMap.h:48
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:191
The Declaration interface, representing objects with names.
Definition declaration.h:17
Definition ir/vector.h:50
Definition methodInstance.h:18
TypeVariableSubstitution typeSubstitution
Definition methodInstance.h:27
ParameterSubstitution substitution
For each callee parameter the corresponding argument.
Definition methodInstance.h:24
Definition methodInstance.h:47
const IR::Type_MethodBase * actualMethodType
Definition methodInstance.h:76
const IR::Type_MethodBase * originalMethodType
Definition methodInstance.h:73
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:16
const IR::IDeclaration * object
Definition methodInstance.h:70
Definition parameterSubstitution.h:21
Definition typeSubstitution.h:64
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13