88 const IR::Node *initialNode;
94 bool checkArrays =
true);
99 bool checkArrays =
true;
100 const IR::Type *getType(
const IR::Node *element)
const;
101 const IR::Type *getTypeType(
const IR::Node *element)
const;
102 void setType(
const IR::Node *element,
const IR::Type *type);
103 void setLeftValue(
const IR::Expression *expression) { typeMap->setLeftValue(expression); }
104 bool isLeftValue(
const IR::Expression *expression)
const {
105 return typeMap->isLeftValue(expression) || expression->is<IR::DefaultExpression>();
107 void setCompileTimeConstant(
const IR::Expression *expression) {
108 typeMap->setCompileTimeConstant(expression);
110 bool isCompileTimeConstant(
const IR::Expression *expression)
const {
111 return typeMap->isCompileTimeConstant(expression);
119 const IR::Type *destType,
const IR::Type *srcType,
121 std::initializer_list<const IR::Node *> errorArgs);
127 const IR::Type *srcType,
cstring errorFormat =
nullptr,
128 std::initializer_list<const IR::Node *> errorArgs = {}) {
129 return unifyBase(
true, errorPosition, destType, srcType, errorFormat, errorArgs);
133 const IR::Type *srcType,
cstring errorFormat =
nullptr,
134 std::initializer_list<const IR::Node *> errorArgs = {}) {
135 return unifyBase(
false, errorPosition, destType, srcType, errorFormat, errorArgs);
142 const IR::Expression *
assignment(
const IR::Node *errorPosition,
const IR::Type *destType,
143 const IR::Expression *sourceExpression);
144 const IR::SelectCase *matchCase(
const IR::SelectExpression *select,
145 const IR::Type_BaseList *selectType,
146 const IR::SelectCase *selectCase,
const IR::Type *caseType);
147 bool canCastBetween(
const IR::Type *dest,
const IR::Type *src)
const;
148 bool checkAbstractMethods(
const IR::Declaration_Instance *inst,
const IR::Type_Extern *type);
149 void addSubstitutions(
const TypeVariableSubstitution *tvs);
151 const IR::Expression *constantFold(
const IR::Expression *expression);
156 virtual const IR::Type *
canonicalize(
const IR::Type *type);
157 const IR::Type *canonicalizeFields(
158 const IR::Type_StructLike *type,
159 std::function<
const IR::Type *(
const IR::IndexedVector<IR::StructField> *)> constructor);
160 virtual const IR::ParameterList *canonicalizeParameters(
const IR::ParameterList *params);
163 bool onlyBitsOrBitStructs(
const IR::Type *type)
const;
164 bool containsHeader(
const IR::Type *canonType);
165 bool validateFields(
const IR::Type *type, std::function<
bool(
const IR::Type *)> checker)
const;
166 const IR::Node *binaryBool(
const IR::Operation_Binary *op);
167 const IR::Node *binaryArith(
const IR::Operation_Binary *op);
168 const IR::Node *unsBinaryArith(
const IR::Operation_Binary *op);
169 const IR::Node *shift(
const IR::Operation_Binary *op);
170 const IR::Node *typeSet(
const IR::Operation_Binary *op);
172 const IR::Type *cloneWithFreshTypeVariables(
const IR::IMayBeGenericType *type);
175 const IR::IContainer *container);
176 const IR::Expression *actionCall(
178 const IR::MethodCallExpression *actionCall);
179 std::pair<const IR::Type *, const IR::Vector<IR::Argument> *> checkExternConstructor(
180 const IR::Node *errorPosition,
const IR::Type_Extern *ext,
183 static constexpr bool forbidModules =
true;
184 static constexpr bool forbidPackages =
true;
185 bool checkParameters(
const IR::ParameterList *paramList,
bool forbidModules =
false,
186 bool forbidPackage =
false)
const;
187 virtual const IR::Type *setTypeType(
const IR::Type *type,
bool learn =
true);
195 bool containsActionEnum(
const IR::Type *type)
const;
204 using Transform::postorder;
205 using Transform::preorder;
207 static const IR::Type *
specialize(
const IR::IMayBeGenericType *type,
209 const IR::Node *pruneIfDone(
const IR::Node *node) {
215 const IR::Node *preorder(IR::Expression *expression)
override {
216 return pruneIfDone(expression);
218 const IR::Node *preorder(IR::Type *type)
override {
return pruneIfDone(type); }
221 const IR::Expression *left;
222 const IR::Expression *right;
226 bool compare(
const IR::Node *errorPosition,
const IR::Type *ltype,
const IR::Type *rtype,
231 const IR::Node *preorder(IR::Function *function)
override;
232 const IR::Node *preorder(IR::P4Program *program)
override;
233 const IR::Node *preorder(IR::Declaration_Instance *decl)
override;
235 const IR::Node *preorder(IR::EntriesList *el)
override;
236 const IR::Node *preorder(IR::Type_SerEnum *type)
override;
238 const IR::Node *postorder(IR::Declaration_MatchKind *decl)
override;
239 const IR::Node *postorder(IR::Declaration_Variable *decl)
override;
240 const IR::Node *postorder(IR::Declaration_Constant *constant)
override;
241 const IR::Node *postorder(IR::P4Control *cont)
override;
242 const IR::Node *postorder(IR::P4Parser *cont)
override;
243 const IR::Node *postorder(IR::Method *method)
override;
245 const IR::Node *postorder(IR::Type_Type *type)
override;
246 const IR::Node *postorder(IR::Type_Table *type)
override;
247 const IR::Node *postorder(IR::Type_Error *decl)
override;
248 const IR::Node *postorder(IR::Type_InfInt *type)
override;
249 const IR::Node *postorder(IR::Type_Method *type)
override;
250 const IR::Node *postorder(IR::Type_Action *type)
override;
251 const IR::Node *postorder(IR::Type_Name *type)
override;
252 const IR::Node *postorder(IR::Type_Base *type)
override;
253 const IR::Node *postorder(IR::Type_Var *type)
override;
254 const IR::Node *postorder(IR::Type_Enum *type)
override;
255 const IR::Node *postorder(IR::Type_Extern *type)
override;
256 const IR::Node *postorder(IR::StructField *field)
override;
257 const IR::Node *postorder(IR::Type_Header *type)
override;
258 const IR::Node *postorder(IR::Type_Stack *type)
override;
259 const IR::Node *postorder(IR::Type_Struct *type)
override;
260 const IR::Node *postorder(IR::Type_HeaderUnion *type)
override;
261 const IR::Node *postorder(IR::Type_Typedef *type)
override;
262 const IR::Node *postorder(IR::Type_Specialized *type)
override;
263 const IR::Node *postorder(IR::Type_SpecializedCanonical *type)
override;
264 const IR::Node *postorder(IR::Type_Tuple *type)
override;
265 const IR::Node *postorder(IR::Type_P4List *type)
override;
266 const IR::Node *postorder(IR::Type_List *type)
override;
267 const IR::Node *postorder(IR::Type_Set *type)
override;
268 const IR::Node *postorder(IR::Type_ArchBlock *type)
override;
269 const IR::Node *postorder(IR::Type_Newtype *type)
override;
270 const IR::Node *postorder(IR::Type_Package *type)
override;
271 const IR::Node *postorder(IR::Type_ActionEnum *type)
override;
272 const IR::Node *postorder(IR::P4Table *type)
override;
273 const IR::Node *postorder(IR::P4Action *type)
override;
274 const IR::Node *postorder(IR::P4ValueSet *type)
override;
275 const IR::Node *postorder(IR::Key *key)
override;
276 const IR::Node *postorder(IR::Entry *e)
override;
278 const IR::Node *postorder(IR::Dots *expression)
override;
279 const IR::Node *postorder(IR::Argument *arg)
override;
280 const IR::Node *postorder(IR::SerEnumMember *member)
override;
281 const IR::Node *postorder(IR::Parameter *param)
override;
282 const IR::Node *postorder(IR::Constant *expression)
override;
283 const IR::Node *postorder(IR::BoolLiteral *expression)
override;
284 const IR::Node *postorder(IR::StringLiteral *expression)
override;
285 const IR::Node *postorder(IR::Operation_Relation *expression)
override;
286 const IR::Node *postorder(IR::Concat *expression)
override;
287 const IR::Node *postorder(IR::ArrayIndex *expression)
override;
288 const IR::Node *postorder(IR::LAnd *expression)
override {
return binaryBool(expression); }
289 const IR::Node *postorder(IR::LOr *expression)
override {
return binaryBool(expression); }
290 const IR::Node *postorder(IR::Add *expression)
override {
return binaryArith(expression); }
291 const IR::Node *postorder(IR::Sub *expression)
override {
return binaryArith(expression); }
292 const IR::Node *postorder(IR::AddSat *expression)
override {
return binaryArith(expression); }
293 const IR::Node *postorder(IR::SubSat *expression)
override {
return binaryArith(expression); }
294 const IR::Node *postorder(IR::Mul *expression)
override {
return binaryArith(expression); }
295 const IR::Node *postorder(IR::Div *expression)
override {
return unsBinaryArith(expression); }
296 const IR::Node *postorder(IR::Mod *expression)
override {
return unsBinaryArith(expression); }
297 const IR::Node *postorder(IR::Shl *expression)
override {
return shift(expression); }
298 const IR::Node *postorder(IR::Shr *expression)
override {
return shift(expression); }
299 const IR::Node *postorder(IR::BXor *expression)
override {
return binaryArith(expression); }
300 const IR::Node *postorder(IR::BAnd *expression)
override {
return binaryArith(expression); }
301 const IR::Node *postorder(IR::BOr *expression)
override {
return binaryArith(expression); }
302 const IR::Node *postorder(IR::Mask *expression)
override {
return typeSet(expression); }
303 const IR::Node *postorder(IR::Range *expression)
override {
return typeSet(expression); }
304 const IR::Node *postorder(IR::LNot *expression)
override;
305 const IR::Node *postorder(IR::Neg *expression)
override;
306 const IR::Node *postorder(IR::UPlus *expression)
override;
307 const IR::Node *postorder(IR::Cmpl *expression)
override;
308 const IR::Node *postorder(IR::Cast *expression)
override;
309 const IR::Node *postorder(IR::Mux *expression)
override;
310 const IR::Node *postorder(IR::Slice *expression)
override;
311 const IR::Node *postorder(IR::PathExpression *expression)
override;
312 const IR::Node *postorder(IR::Member *expression)
override;
313 const IR::Node *postorder(IR::TypeNameExpression *expression)
override;
314 const IR::Node *postorder(IR::ListExpression *expression)
override;
315 const IR::Node *postorder(IR::InvalidHeader *expression)
override;
316 const IR::Node *postorder(IR::InvalidHeaderUnion *expression)
override;
317 const IR::Node *postorder(IR::Invalid *expression)
override;
318 const IR::Node *postorder(IR::P4ListExpression *expression)
override;
319 const IR::Node *postorder(IR::StructExpression *expression)
override;
320 const IR::Node *postorder(IR::HeaderStackExpression *expression)
override;
321 const IR::Node *postorder(IR::MethodCallExpression *expression)
override;
322 const IR::Node *postorder(IR::ConstructorCallExpression *expression)
override;
323 const IR::Node *postorder(IR::SelectExpression *expression)
override;
324 const IR::Node *postorder(IR::DefaultExpression *expression)
override;
325 const IR::Node *postorder(IR::This *expression)
override;
326 const IR::Node *postorder(IR::AttribLocal *local)
override;
327 const IR::Node *postorder(IR::ActionList *al)
override;
329 const IR::Node *postorder(IR::ReturnStatement *stat)
override;
330 const IR::Node *postorder(IR::IfStatement *stat)
override;
331 const IR::Node *postorder(IR::SwitchStatement *stat)
override;
332 const IR::Node *postorder(IR::AssignmentStatement *stat)
override;
333 const IR::Node *postorder(IR::ActionListElement *elem)
override;
334 const IR::Node *postorder(IR::KeyElement *elem)
override;
335 const IR::Node *postorder(IR::Property *elem)
override;
336 const IR::Node *postorder(IR::SelectCase *elem)
override;
337 const IR::Node *postorder(IR::Annotation *annotation)
override;
339 Visitor::profile_t init_apply(
const IR::Node *node)
override;
340 void end_apply(
const IR::Node *Node)
override;
341 const IR::Node *apply_visitor(
const IR::Node *,
const char *name = 0)
override;
343 TypeInference *clone()
const override;
347 bool learn(
const IR::Node *node, Visitor *caller);