Skip to content

Commit d7464ef

Browse files
author
Mihai Budiu
authored
Rename StructInitializerExpression to StructExpression; paranthesize … (#2304)
* Rename StructInitializerExpression to StructExpression; paranthesize on output
1 parent 49072aa commit d7464ef

30 files changed

+390
-44
lines changed

backends/bmv2/common/expression.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,7 @@ void ExpressionConverter::postorder(const IR::ListExpression* expression) {
592592
}
593593
}
594594

595-
void ExpressionConverter::postorder(const IR::StructInitializerExpression* expression) {
595+
void ExpressionConverter::postorder(const IR::StructExpression* expression) {
596596
// Handle like a ListExpression
597597
auto result = new Util::JsonArray();
598598
mapExpression(expression, result);

backends/bmv2/common/expression.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ class ExpressionConverter : public Inspector {
117117
void postorder(const IR::IntMod* expression) override;
118118
void postorder(const IR::Operation_Binary* expression) override;
119119
void postorder(const IR::ListExpression* expression) override;
120-
void postorder(const IR::StructInitializerExpression* expression) override;
120+
void postorder(const IR::StructExpression* expression) override;
121121
void postorder(const IR::Operation_Unary* expression) override;
122122
void postorder(const IR::PathExpression* expression) override;
123123
void postorder(const IR::StringLiteral* expression) override;

backends/bmv2/common/extern.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ ExternConverter::addToFieldList(ConversionContext* ctxt,
155155
addToFieldList(ctxt, e, fl);
156156
}
157157
return;
158-
} else if (auto si = expr->to<IR::StructInitializerExpression>()) {
158+
} else if (auto si = expr->to<IR::StructExpression>()) {
159159
for (auto e : si->components) {
160160
addToFieldList(ctxt, e->expression, fl);
161161
}

backends/bmv2/common/lower.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -207,10 +207,10 @@ RemoveComplexExpressions::simplifyExpression(const IR::Expression* expression, b
207207
if (simpl != &list->components)
208208
return new IR::ListExpression(expression->srcInfo, *simpl);
209209
return expression;
210-
} else if (auto si = expression->to<IR::StructInitializerExpression>()) {
210+
} else if (auto si = expression->to<IR::StructExpression>()) {
211211
auto simpl = simplifyExpressions(&si->components);
212212
if (simpl != &si->components)
213-
return new IR::StructInitializerExpression(
213+
return new IR::StructExpression(
214214
si->srcInfo, si->typeName, si->typeName, *simpl);
215215
return expression;
216216
} else {
@@ -313,9 +313,9 @@ RemoveComplexExpressions::postorder(IR::MethodCallExpression* expression) {
313313
auto simplified = simplifyExpressions(&list->components, true);
314314
arg1 = new IR::ListExpression(arg1->srcInfo, *simplified);
315315
vec->push_back(new IR::Argument(arg1));
316-
} else if (auto si = arg1->to<IR::StructInitializerExpression>()) {
316+
} else if (auto si = arg1->to<IR::StructExpression>()) {
317317
auto list = simplifyExpressions(&si->components);
318-
arg1 = new IR::StructInitializerExpression(
318+
arg1 = new IR::StructExpression(
319319
si->srcInfo, si->typeName, si->typeName, *list);
320320
vec->push_back(new IR::Argument(arg1));
321321
} else {

frontends/common/constantFolding.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ const IR::Expression* DoConstantFolding::getConstant(const IR::Expression* expr)
5757
if (getConstant(e) == nullptr)
5858
return nullptr;
5959
return expr;
60-
} else if (auto si = expr->to<IR::StructInitializerExpression>()) {
60+
} else if (auto si = expr->to<IR::StructExpression>()) {
6161
for (auto e : si->components)
6262
if (getConstant(e->expression) == nullptr)
6363
return nullptr;
@@ -597,7 +597,7 @@ const IR::Node* DoConstantFolding::postorder(IR::Member* e) {
597597
if (!found)
598598
BUG("Could not find field %1% in type %2%", e->member, type);
599599
result = CloneConstants::clone(list->components.at(index));
600-
} else if (auto si = expr->to<IR::StructInitializerExpression>()) {
600+
} else if (auto si = expr->to<IR::StructExpression>()) {
601601
if (origtype->is<IR::Type_Header>() && e->member.name == IR::Type_Header::isValid)
602602
return e;
603603
auto ne = si->components.getDeclaration<IR::NamedExpression>(e->member.name);

frontends/p4/alias.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ class ReadsWrites : public Inspector {
217217
rw.emplace(expression, result);
218218
}
219219

220-
void postorder(const IR::StructInitializerExpression* expression) override {
220+
void postorder(const IR::StructExpression* expression) override {
221221
const SetOfLocations* result = new SetOfLocations();
222222
for (auto e : expression->components) {
223223
auto s = ::get(rw, e->expression);

frontends/p4/setHeaders.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ void DoSetHeaders::generateSetValid(
2929

3030
auto srcType = typeMap->getType(src, true);
3131
auto list = src->to<IR::ListExpression>();
32-
auto si = src->to<IR::StructInitializerExpression>();
32+
auto si = src->to<IR::StructExpression>();
3333
if (list == nullptr && si == nullptr)
3434
return;
3535

frontends/p4/sideEffects.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ const IR::Node* DoSimplifyExpressions::preorder(IR::MethodCallExpression* mce) {
303303
continue;
304304

305305
if (arg->expression->is<IR::ListExpression>() ||
306-
arg->expression->is<IR::StructInitializerExpression>()) {
306+
arg->expression->is<IR::StructExpression>()) {
307307
LOG3("Using temporary for " << dbp(mce) <<
308308
" param " << dbp(p) << " assigning tuple to header");
309309
useTemporary.emplace(p);

frontends/p4/structInitializers.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ limitations under the License.
1919
namespace P4 {
2020

2121
/// Given an expression and a destination type, convert ListExpressions
22-
/// that occur within expression to StructInitializerExpression if the
22+
/// that occur within expression to StructExpression if the
2323
/// destination type matches.
2424
const IR::Expression*
2525
convert(const IR::Expression* expression, const IR::Type* type) {
@@ -36,10 +36,10 @@ convert(const IR::Expression* expression, const IR::Type* type) {
3636
index++;
3737
}
3838
auto type = st->getP4Type()->to<IR::Type_Name>();
39-
auto result = new IR::StructInitializerExpression(
39+
auto result = new IR::StructExpression(
4040
expression->srcInfo, type, type, *si);
4141
return result;
42-
} else if (auto sli = expression->to<IR::StructInitializerExpression>()) {
42+
} else if (auto sli = expression->to<IR::StructExpression>()) {
4343
for (auto f : st->fields) {
4444
auto ne = sli->components.getDeclaration<IR::NamedExpression>(f->name.name);
4545
BUG_CHECK(ne != nullptr, "%1%: no initializer for %2%", expression, f);
@@ -51,7 +51,7 @@ convert(const IR::Expression* expression, const IR::Type* type) {
5151
}
5252
if (modified || sli->type->is<IR::Type_Unknown>()) {
5353
auto type = st->getP4Type()->to<IR::Type_Name>();
54-
auto result = new IR::StructInitializerExpression(
54+
auto result = new IR::StructExpression(
5555
expression->srcInfo, type, type, *si);
5656
return result;
5757
}

frontends/p4/toP4/toP4.cpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -874,7 +874,9 @@ bool ToP4::preorder(const IR::NamedExpression* e) {
874874
return false;
875875
}
876876

877-
bool ToP4::preorder(const IR::StructInitializerExpression* e) {
877+
bool ToP4::preorder(const IR::StructExpression* e) {
878+
if (expressionPrecedence > DBPrint::Prec_Prefix)
879+
builder.append("(");
878880
if (e->typeName != nullptr) {
879881
builder.append("(");
880882
visit(e->typeName);
@@ -894,6 +896,8 @@ bool ToP4::preorder(const IR::StructInitializerExpression* e) {
894896
}
895897
expressionPrecedence = prec;
896898
builder.append("}");
899+
if (expressionPrecedence > DBPrint::Prec_Prefix)
900+
builder.append(")");
897901
return false;
898902
}
899903

frontends/p4/toP4/toP4.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ class ToP4 : public Inspector {
173173
bool preorder(const IR::SelectCase* e) override;
174174
bool preorder(const IR::SelectExpression* e) override;
175175
bool preorder(const IR::ListExpression* e) override;
176-
bool preorder(const IR::StructInitializerExpression* e) override;
176+
bool preorder(const IR::StructExpression* e) override;
177177
bool preorder(const IR::MethodCallExpression* e) override;
178178
bool preorder(const IR::DefaultExpression* e) override;
179179
bool preorder(const IR::This* e) override;

frontends/p4/typeChecking/typeChecker.cpp

+9-9
Original file line numberDiff line numberDiff line change
@@ -745,11 +745,11 @@ TypeInference::assignment(const IR::Node* errorPosition, const IR::Type* destTyp
745745
}
746746
if (initType->is<IR::Type_UnknownStruct>()) {
747747
if (auto ts = destType->to<IR::Type_StructLike>()) {
748-
auto si = sourceExpression->to<IR::StructInitializerExpression>();
748+
auto si = sourceExpression->to<IR::StructExpression>();
749749
CHECK_NULL(si);
750750
bool cst = isCompileTimeConstant(sourceExpression);
751751
auto type = new IR::Type_Name(ts->name);
752-
sourceExpression = new IR::StructInitializerExpression(
752+
sourceExpression = new IR::StructExpression(
753753
type, type, si->components);
754754
setType(sourceExpression, destType);
755755
if (cst)
@@ -1589,23 +1589,23 @@ const IR::Node* TypeInference::postorder(IR::Operation_Relation* expression) {
15891589
}
15901590

15911591
if (ls != nullptr) {
1592-
auto l = expression->left->to<IR::StructInitializerExpression>();
1592+
auto l = expression->left->to<IR::StructExpression>();
15931593
CHECK_NULL(l); // struct initializers are the only expressions that can
15941594
// have StructUnknown types
15951595
BUG_CHECK(rtype->is<IR::Type_StructLike>(), "%1%: expected a struct", rtype);
15961596
auto type = new IR::Type_Name(rtype->to<IR::Type_StructLike>()->name);
1597-
expression->left = new IR::StructInitializerExpression(
1597+
expression->left = new IR::StructExpression(
15981598
expression->left->srcInfo, type, type, l->components);
15991599
setType(expression->left, rtype);
16001600
if (lcst)
16011601
setCompileTimeConstant(expression->left);
16021602
} else {
1603-
auto r = expression->right->to<IR::StructInitializerExpression>();
1603+
auto r = expression->right->to<IR::StructExpression>();
16041604
CHECK_NULL(r); // struct initializers are the only expressions that can
16051605
// have StructUnknown types
16061606
BUG_CHECK(ltype->is<IR::Type_StructLike>(), "%1%: expected a struct", ltype);
16071607
auto type = new IR::Type_Name(ltype->to<IR::Type_StructLike>()->name);
1608-
expression->right = new IR::StructInitializerExpression(
1608+
expression->right = new IR::StructExpression(
16091609
expression->right->srcInfo, type, type, r->components);
16101610
setType(expression->right, rtype);
16111611
if (rcst)
@@ -1845,7 +1845,7 @@ const IR::Node* TypeInference::postorder(IR::ListExpression* expression) {
18451845
return expression;
18461846
}
18471847

1848-
const IR::Node* TypeInference::postorder(IR::StructInitializerExpression* expression) {
1848+
const IR::Node* TypeInference::postorder(IR::StructExpression* expression) {
18491849
if (done()) return expression;
18501850
bool constant = true;
18511851
auto components = new IR::IndexedVector<IR::StructField>();
@@ -2316,14 +2316,14 @@ const IR::Node* TypeInference::postorder(IR::Cast* expression) {
23162316
return expression;
23172317

23182318
if (auto st = castType->to<IR::Type_StructLike>()) {
2319-
if (auto se = expression->expr->to<IR::StructInitializerExpression>()) {
2319+
if (auto se = expression->expr->to<IR::StructExpression>()) {
23202320
// Interpret (S) { kvpairs } as a struct initializer expression
23212321
// instead of a cast to a struct.
23222322
if (se->type == nullptr || se->type->is<IR::Type_Unknown>() ||
23232323
se->type->is<IR::Type_UnknownStruct>()) {
23242324
auto type = new IR::Type_Name(st->name);
23252325
setType(type, new IR::Type_Type(st));
2326-
auto sie = new IR::StructInitializerExpression(
2326+
auto sie = new IR::StructExpression(
23272327
se->srcInfo, type, se->components);
23282328
auto result = postorder(sie); // may insert casts
23292329
setType(result, st);

frontends/p4/typeChecking/typeChecker.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ class TypeInference : public Transform {
264264
const IR::Node* postorder(IR::Member* expression) override;
265265
const IR::Node* postorder(IR::TypeNameExpression* expression) override;
266266
const IR::Node* postorder(IR::ListExpression* expression) override;
267-
const IR::Node* postorder(IR::StructInitializerExpression* expression) override;
267+
const IR::Node* postorder(IR::StructExpression* expression) override;
268268
const IR::Node* postorder(IR::MethodCallExpression* expression) override;
269269
const IR::Node* postorder(IR::ConstructorCallExpression* expression) override;
270270
const IR::Node* postorder(IR::SelectExpression* expression) override;

frontends/parsers/p4/p4parser.ypp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1321,7 +1321,7 @@ expression
13211321
| expression "[" expression "]" { $$ = new IR::ArrayIndex(@1 + @4, $1, $3); }
13221322
| expression "[" expression ":" expression "]" { $$ = new IR::Slice(@1 + @6, $1, $3, $5); }
13231323
| "{" expressionList "}" { $$ = new IR::ListExpression(@1 + @3, *$2); }
1324-
| "{" kvList "}" { $$ = new IR::StructInitializerExpression(
1324+
| "{" kvList "}" { $$ = new IR::StructExpression(
13251325
@1 + @3, IR::Type::Unknown::get(), (IR::Type_Name*)nullptr, *$2); } // experimental
13261326
| "(" expression ")" { $$ = $2; }
13271327
| "!" expression %prec PREFIX { $$ = new IR::LNot(@1 + @2, $2); }

ir/dbprint-expression.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ void IR::NamedExpression::dbprint(std::ostream &out) const {
8686
out << name << ":" << expression;
8787
}
8888

89-
void IR::StructInitializerExpression::dbprint(std::ostream& out) const {
89+
void IR::StructExpression::dbprint(std::ostream& out) const {
9090
out << "{" << indent;
9191
for (auto &field : components)
9292
out << Log::endl << field << ';';

ir/expression.def

+2-3
Original file line numberDiff line numberDiff line change
@@ -403,9 +403,8 @@ class ListExpression : Expression {
403403
void push_back(Expression e) { components.push_back(e); }
404404
}
405405

406-
/// IR representation of an initializer for a struct.
407-
/// Currently it does not have a direct representation as P4 source.
408-
class StructInitializerExpression : Expression {
406+
/// An expression that evaluates to a struct.
407+
class StructExpression : Expression {
409408
/// The struct or header type that is being intialized.
410409
/// May only be known after type checking; so it can be nullptr.
411410
NullOK optional Type_Name typeName;

midend/complexComparison.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ const IR::Expression* RemoveComplexComparisons::explode(
4343
if (auto ht = leftType->to<IR::Type_Header>()) {
4444
auto lmethod = new IR::Member(left, IR::Type_Header::isValid);
4545
const IR::Expression* lvalid;
46-
if (left->is<IR::StructInitializerExpression>()) {
46+
if (left->is<IR::StructExpression>()) {
4747
// A header defined this way is always valid
4848
lvalid = new IR::BoolLiteral(true);
4949
} else {
@@ -53,7 +53,7 @@ const IR::Expression* RemoveComplexComparisons::explode(
5353

5454
const IR::Expression* rvalid;
5555
if (!rightTuple) {
56-
if (right->is<IR::StructInitializerExpression>()) {
56+
if (right->is<IR::StructExpression>()) {
5757
rvalid = new IR::BoolLiteral(true);
5858
} else {
5959
auto rmethod = new IR::Member(right, IR::Type_Header::isValid);
@@ -73,7 +73,7 @@ const IR::Expression* RemoveComplexComparisons::explode(
7373
const IR::Expression* fright;
7474
const IR::Type* rightType;
7575
if (!rightTuple) {
76-
if (auto si = right->to<IR::StructInitializerExpression>()) {
76+
if (auto si = right->to<IR::StructExpression>()) {
7777
auto nf = si->components.getDeclaration<IR::NamedExpression>(f->name);
7878
CHECK_NULL(nf);
7979
fright = nf->expression;
@@ -101,7 +101,7 @@ const IR::Expression* RemoveComplexComparisons::explode(
101101
const IR::Expression* fright;
102102
const IR::Type* rightType;
103103
if (!rightTuple) {
104-
if (auto si = right->to<IR::StructInitializerExpression>()) {
104+
if (auto si = right->to<IR::StructExpression>()) {
105105
auto nf = si->components.getDeclaration<IR::NamedExpression>(f->name);
106106
CHECK_NULL(nf);
107107
fright = nf->expression;

midend/copyStructures.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ const IR::Node* DoCopyStructures::postorder(IR::AssignmentStatement* statement)
7878
retval->push_back(new IR::AssignmentStatement(statement->srcInfo, left, right));
7979
index++;
8080
}
81-
} else if (auto si = statement->right->to<IR::StructInitializerExpression>()) {
81+
} else if (auto si = statement->right->to<IR::StructExpression>()) {
8282
for (auto f : strct->fields) {
8383
auto right = si->components.getDeclaration<IR::NamedExpression>(f->name);
8484
auto left = new IR::Member(statement->left, f->name);

midend/eliminateTuples.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ class EliminateTuples final : public PassManager {
106106
passes.push_back(new ClearTypeMap(typeMap));
107107
// We do a round of type-checking which may mutate the program.
108108
// This will convert some ListExpressions
109-
// into StructInitializerExpression where tuples were converted
109+
// into StructExpression where tuples were converted
110110
// to structs.
111111
passes.push_back(new ResolveReferences(refMap));
112112
if (!typeInference)

midend/expandLookahead.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ const IR::Expression* DoExpandLookahead::expand(
5151
vec->push_back(new IR::NamedExpression(f->srcInfo, f->name, e));
5252
}
5353
auto type = st->getP4Type()->to<IR::Type_Name>();
54-
return new IR::StructInitializerExpression(
54+
return new IR::StructExpression(
5555
base->srcInfo, type, type, *vec);
5656
} else if (type->is<IR::Type_Bits>() || type->is<IR::Type_Boolean>()) {
5757
unsigned size = type->width_bits();

midend/flattenInterfaceStructs.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ StructTypeReplacement::StructTypeReplacement(
4141
replacementType = new IR::Type_Struct(type->name, IR::Annotations::empty, *vec);
4242
}
4343

44-
const IR::StructInitializerExpression* StructTypeReplacement::explode(
44+
const IR::StructExpression* StructTypeReplacement::explode(
4545
const IR::Expression *root, cstring prefix) {
4646
auto vec = new IR::IndexedVector<IR::NamedExpression>();
4747
auto fieldType = ::get(structFieldMap, prefix);
@@ -58,7 +58,7 @@ const IR::StructInitializerExpression* StructTypeReplacement::explode(
5858
vec->push_back(new IR::NamedExpression(f->name, expr));
5959
}
6060
auto type = fieldType->getP4Type()->to<IR::Type_Name>();
61-
return new IR::StructInitializerExpression(
61+
return new IR::StructExpression(
6262
root->srcInfo, type, type, *vec);
6363
}
6464

midend/flattenInterfaceStructs.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,11 @@ struct StructTypeReplacement : public IHasDbPrint {
7474
const IR::Type* type,
7575
IR::IndexedVector<IR::StructField> *fields);
7676

77-
/// Returns a StructInitializerExpression suitable for
77+
/// Returns a StructExpression suitable for
7878
/// initializing a struct for the fields that start with the
7979
/// given prefix. For example, for prefix .t and root R this returns
8080
/// { .s = { .a = R._t_s_a0, .b = R._t_s_b1 }, .y = R._t_y2 }
81-
const IR::StructInitializerExpression* explode(
81+
const IR::StructExpression* explode(
8282
const IR::Expression* root, cstring prefix);
8383
};
8484

0 commit comments

Comments
 (0)