107class ReadsWrites :
public Inspector,
public ResolutionContext {
108 std::map<const IR::Expression *, const SetOfLocations *> rw;
111 ReadsWrites() { setName(
"ReadsWrites"); }
113 void postorder(
const IR::Operation_Binary *expression)
override {
114 auto left = ::P4::get(rw, expression->left);
115 auto right = ::P4::get(rw, expression->right);
118 rw.emplace(expression, left->join(right));
121 void postorder(
const IR::PathExpression *expression)
override {
122 auto decl = getDeclaration(expression->path);
125 rw.emplace(expression, locs);
128 void postorder(
const IR::Operation_Unary *expression)
override {
129 auto e = ::P4::get(rw, expression->expr);
131 rw.emplace(expression, e);
134 void postorder(
const IR::Member *expression)
override {
135 auto e = ::P4::get(rw, expression->expr);
137 auto result = e->append(expression->member);
138 rw.emplace(expression, result);
141 void postorder(
const IR::ArrayIndex *expression)
override {
142 auto e = ::P4::get(rw, expression->left);
145 if (expression->right->is<IR::Constant>()) {
146 int index = expression->right->to<IR::Constant>()->asInt();
147 result = e->
append(Util::toString(index));
149 auto index = ::P4::get(rw, expression->right);
150 result = e->
append(
"*"_cs)->join(index);
152 rw.emplace(expression, result);
155 void postorder(
const IR::Literal *expression)
override {
159 void postorder(
const IR::InvalidHeader *expression)
override {
163 void postorder(
const IR::InvalidHeaderUnion *expression)
override {
167 void postorder(
const IR::ArrayExpression *expression)
override {
171 void postorder(
const IR::TypeNameExpression *expression)
override {
175 void postorder(
const IR::Operation_Ternary *expression)
override {
176 auto e0 = ::P4::get(rw, expression->e0);
177 auto e1 = ::P4::get(rw, expression->e1);
178 auto e2 = ::P4::get(rw, expression->e2);
182 rw.emplace(expression, e0->join(e1)->join(e2));
185 void postorder(
const IR::AbstractSlice *expression)
override {
186 auto e = ::P4::get(rw, expression->e0);
188 rw.emplace(expression, e);
191 void postorder(
const IR::MethodCallExpression *expression)
override {
192 auto e = ::P4::get(rw, expression->method);
193 for (
auto a : *expression->arguments) {
194 auto s = ::P4::get(rw, a->expression);
198 rw.emplace(expression, e);
201 void postorder(
const IR::ConstructorCallExpression *expression)
override {
203 for (
auto e : *expression->arguments) {
204 auto s = ::P4::get(rw, e->expression);
206 result = result->join(s);
208 rw.emplace(expression, result);
211 void postorder(
const IR::StructExpression *expression)
override {
213 for (
auto e : expression->components) {
214 auto s = ::P4::get(rw, e->expression);
216 result = result->join(s);
218 rw.emplace(expression, result);
221 void postorder(
const IR::ListExpression *expression)
override {
223 for (
auto e : expression->components) {
224 auto s = ::P4::get(rw, e);
226 result = result->join(s);
228 rw.emplace(expression, result);
231 void postorder(
const IR::DefaultExpression *expression)
override {
235 const SetOfLocations *get(
const IR::Expression *expression,
const Visitor::Context *ctxt) {
236 expression->apply(*
this, ctxt);
237 auto result = ::P4::get(rw, expression);
239 LOG3(
"SetOfLocations(" << expression <<
")=" << result);
243 bool mayAlias(
const IR::Expression *left,
const IR::Expression *right,
244 const Visitor::Context *ctxt) {
245 auto llocs = get(left, ctxt);
246 auto rlocs = get(right, ctxt);
249 LOG3(
"Checking overlap between " << llocs <<
" and " << rlocs);
250 return llocs->overlaps(rlocs);