88
99#include  " TestDialect.h" 
1010#include  " TestOps.h" 
11+ #include  " mlir/Bytecode/BytecodeImplementation.h" 
12+ #include  " mlir/IR/Attributes.h" 
1113#include  " mlir/IR/OperationSupport.h" 
1214#include  " mlir/Interfaces/FoldInterfaces.h" 
1315#include  " mlir/Reducer/ReductionPatternInterface.h" 
1416#include  " mlir/Transforms/InliningUtils.h" 
17+ #include  " llvm/ADT/SmallVector.h" 
18+ #include  " llvm/Support/LogicalResult.h" 
1519
1620using  namespace  mlir ; 
1721using  namespace  test ; 
@@ -40,7 +44,12 @@ struct TestResourceBlobManagerInterface
4044};
4145
4246namespace  {
43- enum  test_encoding { k_attr_params = 0 , k_test_i32 = 99  };
47+ enum  test_encoding {
48+   k_attr_params = 0 ,
49+   k_test_i32 = 99 ,
50+   kCompoundAttrNoReading  = 100 ,
51+   kCompoundAttrNoReadingNested  = 101 
52+ };
4453} //  namespace
4554
4655//  Test support for interacting with the Bytecode reader/writer.
@@ -67,6 +76,39 @@ struct TestBytecodeDialectInterface : public BytecodeDialectInterface {
6776    return  Type ();
6877  }
6978
79+   struct  FallbackCompliantAttributeEncoding  {
80+     SmallVector<Attribute> requiredAttributes;
81+     SmallVector<Attribute> optionalAttributes;
82+ 
83+     LogicalResult write (DialectBytecodeWriter &writer, uint64_t  attributeCode) {
84+       writer.writeVarInt (attributeCode);
85+       writer.writeList (requiredAttributes,
86+                        [&](Attribute attr) { writer.writeAttribute (attr); });
87+       writer.writeList (optionalAttributes, [&](Attribute attr) {
88+         writer.writeOptionalAttribute (attr);
89+       });
90+       return  success ();
91+     }
92+ 
93+     LogicalResult read (DialectBytecodeReader &reader) {
94+       //  The attribute code should be pre-populated.
95+ 
96+       //  Read the required attributes.
97+       if  (failed (reader.readList (requiredAttributes, [&](Attribute &attr) {
98+             return  reader.readAttribute (attr);
99+           })))
100+         return  failure ();
101+ 
102+       //  Read the optional attributes.
103+       if  (failed (reader.readList (optionalAttributes, [&](Attribute &attr) {
104+             return  reader.readOptionalAttribute (attr);
105+           })))
106+         return  failure ();
107+ 
108+       return  success ();
109+     }
110+   };
111+ 
70112  LogicalResult writeAttribute (Attribute attr,
71113                               DialectBytecodeWriter &writer) const  final  {
72114    if  (auto  concreteAttr = llvm::dyn_cast<TestAttrParamsAttr>(attr)) {
@@ -75,6 +117,32 @@ struct TestBytecodeDialectInterface : public BytecodeDialectInterface {
75117      writer.writeVarInt (concreteAttr.getV1 ());
76118      return  success ();
77119    }
120+ 
121+     if  (auto  concreteAttr = dyn_cast<CompoundAttrNoReadingAttr>(attr)) {
122+       FallbackCompliantAttributeEncoding encoding = {
123+           .requiredAttributes  = {concreteAttr.getNoReadingNested (),
124+                                  concreteAttr.getSupportsReading ()},
125+           .optionalAttributes  = {}};
126+       return  encoding.write (writer, kCompoundAttrNoReading );
127+     }
128+ 
129+     if  (auto  concreteAttr = dyn_cast<CompoundAttrNoReadingNestedAttr>(attr)) {
130+       FallbackCompliantAttributeEncoding encoding = {
131+           .requiredAttributes  = {concreteAttr.getValue (),
132+                                  concreteAttr.getPayload ()},
133+           .optionalAttributes  = {}};
134+       return  encoding.write (writer, kCompoundAttrNoReadingNested );
135+     }
136+ 
137+     if  (auto  concreteAttr = dyn_cast<TestBytecodeFallbackAttr>(attr)) {
138+       FallbackCompliantAttributeEncoding encoding = {
139+           .requiredAttributes  =
140+               llvm::to_vector (concreteAttr.getEncodedReqdAttributes ()),
141+           .optionalAttributes  =
142+               llvm::to_vector (concreteAttr.getEncodedOptAttributes ())};
143+       return  encoding.write (writer, concreteAttr.getAttrIndex ());
144+     }
145+ 
78146    return  failure ();
79147  }
80148
@@ -146,16 +214,29 @@ struct TestBytecodeDialectInterface : public BytecodeDialectInterface {
146214
147215private: 
148216  Attribute readAttrNewEncoding (DialectBytecodeReader &reader) const  {
149-     uint64_t  encoding;
150-     if  (failed (reader.readVarInt (encoding)) ||
151-         encoding != test_encoding::k_attr_params)
217+     uint64_t  attributeCode;
218+     if  (failed (reader.readVarInt (attributeCode)))
152219      return  Attribute ();
153-     //  The new encoding has v0 first, v1 second.
154-     uint64_t  v0, v1;
155-     if  (failed (reader.readVarInt (v0)) || failed (reader.readVarInt (v1)))
156-       return  Attribute ();
157-     return  TestAttrParamsAttr::get (getContext (), static_cast <int >(v0),
158-                                    static_cast <int >(v1));
220+ 
221+     switch  (attributeCode) {
222+     case  test_encoding::k_attr_params: {
223+       //  The new encoding has v0 first, v1 second.
224+       uint64_t  v0, v1;
225+       if  (failed (reader.readVarInt (v0)) || failed (reader.readVarInt (v1)))
226+         return  Attribute ();
227+       return  TestAttrParamsAttr::get (getContext (), static_cast <int >(v0),
228+                                      static_cast <int >(v1));
229+     }
230+     default : {
231+       FallbackCompliantAttributeEncoding encoding;
232+       if  (failed (encoding.read (reader)))
233+         return  {};
234+       return  TestBytecodeFallbackAttr::get (
235+           reader.getContext (), attributeCode,
236+           ArrayAttr::get (reader.getContext (), encoding.requiredAttributes ),
237+           ArrayAttr::get (reader.getContext (), encoding.optionalAttributes ));
238+     }
239+     }
159240  }
160241
161242  Attribute readAttrOldEncoding (DialectBytecodeReader &reader) const  {
0 commit comments