P4C
The P4 Compiler
Loading...
Searching...
No Matches
has_side_effects.h
1/*
2 * Copyright 2013-present Barefoot Networks, Inc.
3 * SPDX-FileCopyrightText: 2013 Barefoot Networks, Inc.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef MIDEND_HAS_SIDE_EFFECTS_H_
9#define MIDEND_HAS_SIDE_EFFECTS_H_
10
11#include "frontends/common/resolveReferences/resolveReferences.h"
12#include "frontends/p4/methodInstance.h"
13#include "ir/ir.h"
14
15namespace P4 {
16
17/* Should this be a method on IR::Expression? Maybe after the refMap/typeMap go away */
18
19class hasSideEffects : public Inspector, public ResolutionContext {
20 P4::TypeMap *typeMap = nullptr;
21
22 bool result = false;
23 bool preorder(const IR::BaseAssignmentStatement *) override {
24 result = true;
25 return false;
26 }
27 bool preorder(const IR::MethodCallExpression *mc) override {
28 if (result) return false;
29
30 /* assume has side effects if we can't look it up */
31 if (typeMap) {
32 auto *mi = P4::MethodInstance::resolve(mc, this, typeMap, true);
33 if (auto *bm = mi->to<P4::BuiltInMethod>()) {
34 if (bm->name == IR::Type_Header::isValid) return true;
35 } else if (auto *em = mi->to<P4::ExternMethod>()) {
36 if (em->method->hasAnnotation(IR::Annotation::noSideEffectsAnnotation)) return true;
37 }
38 }
39 result = true;
40 return false;
41 }
42
43 bool preorder(const IR::Primitive *) override {
44 result = true;
45 return false;
46 }
47 bool preorder(const IR::Expression *) override { return !result; }
48
49 public:
50 explicit hasSideEffects(const IR::Expression *e) { e->apply(*this); }
51 hasSideEffects(P4::TypeMap *tm, const IR::Expression *e, const Visitor::Context *ctxt)
52 : typeMap(tm) {
53 e->apply(*this, ctxt);
54 }
55 bool operator()(const IR::Expression *e) {
56 result = false;
57 e->apply(*this);
58 return result;
59 }
60 explicit operator bool() { return result; }
61};
62
63} // namespace P4
64
65#endif /* MIDEND_HAS_SIDE_EFFECTS_H_ */
Definition methodInstance.h:260
Definition methodInstance.h:168
Definition visitor.h:418
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
Definition typeMap.h:32
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13