@@ -19,38 +19,58 @@ limitations under the License.
19
19
namespace P4 {
20
20
21
21
void DoSetHeaders::generateSetValid (
22
- const IR::Type* destType, const IR::Type* srcType,
23
- const IR::Expression* dest, IR::Vector<IR::StatOrDecl>* insert) {
24
- auto tt = srcType->to <IR::Type_Tuple>();
25
- if (tt == nullptr )
22
+ const IR::Expression* dest, const IR::Expression* src,
23
+ const IR::Type* destType,
24
+ IR::Vector<IR::StatOrDecl>* insert) {
25
+
26
+ auto structType = destType->to <IR::Type_StructLike>();
27
+ if (structType == nullptr )
26
28
return ;
27
29
28
- // The source is either a tuple, or a list expression
29
- if (destType->is <IR::Type_Struct>()) {
30
- auto it = tt->components .begin ();
31
- auto sl = destType->to <IR::Type_Struct>();
32
- for (auto f : sl->fields ) {
33
- auto ftype = typeMap->getType (f, true );
34
- auto stype = *it;
35
- auto member = new IR::Member (dest, f->name );
36
- generateSetValid (ftype, stype, member, insert);
37
- ++it;
38
- }
39
- } else if (destType->is <IR::Type_Header>()) {
30
+ auto srcType = typeMap->getType (src, true );
31
+ auto list = src->to <IR::ListExpression>();
32
+ auto si = src->to <IR::StructInitializerExpression>();
33
+ if (list == nullptr && si == nullptr )
34
+ return ;
35
+
36
+ if (structType->is <IR::Type_Header>()) {
40
37
LOG3 (" Inserting setValid for " << dest);
41
38
auto method = new IR::Member (dest->srcInfo , dest, IR::Type_Header::setValid);
42
39
auto mc = new IR::MethodCallExpression (
43
40
dest->srcInfo , method, new IR::Vector<IR::Argument>());
44
41
auto stat = new IR::MethodCallStatement (mc->srcInfo , mc);
45
42
insert->push_back (stat);
43
+ return ;
44
+ }
45
+
46
+ // Recurse on fields of structType
47
+ if (list != nullptr ) {
48
+ auto tt = srcType->to <IR::Type_Tuple>();
49
+ CHECK_NULL (tt);
50
+ auto it = list->components .begin ();
51
+ for (auto f : structType->fields ) {
52
+ auto member = new IR::Member (dest, f->name );
53
+ auto ft = typeMap->getType (f);
54
+ generateSetValid (member, *it, ft, insert);
55
+ ++it;
56
+ }
57
+ return ;
58
+ }
59
+
60
+ CHECK_NULL (si);
61
+ for (auto f : structType->fields ) {
62
+ auto member = new IR::Member (dest, f->name );
63
+ auto srcMember = si->components .getDeclaration <IR::NamedExpression>(f->name );
64
+ auto ft = typeMap->getType (f);
65
+ CHECK_NULL (srcMember);
66
+ generateSetValid (member, srcMember->expression , ft, insert);
46
67
}
47
68
}
48
69
49
70
const IR::Node* DoSetHeaders::postorder (IR::AssignmentStatement* statement) {
50
71
auto vec = new IR::Vector<IR::StatOrDecl>();
51
- auto ltype = typeMap->getType (statement->left , true );
52
- auto rtype = typeMap->getType (statement->right , true );
53
- generateSetValid (ltype, rtype, statement->left , vec);
72
+ auto destType = typeMap->getType (statement->left , true );
73
+ generateSetValid (statement->left , statement->right , destType, vec);
54
74
if (vec->empty ())
55
75
return statement;
56
76
vec->push_back (statement);
0 commit comments