@@ -30,39 +30,32 @@ std::shared_ptr<Type> IR::addEnum(std::string name, const std::string &type,
3030 return nullptr ;
3131}
3232
33- std::shared_ptr<Type> IR::addStruct (std::string name,
34- std::vector<Field *> fields,
35- uint64_t typeSize) {
36- std::shared_ptr<Struct> s =
37- std::make_shared<Struct>(std::move (name), std::move (fields), typeSize);
38- structs.push_back (s);
39- typeDefs.push_back (s->generateTypeDef ());
40- return typeDefs.back ();
41- }
42-
4333void IR::addStruct (std::string name, std::vector<Field *> fields,
44- uint64_t typeSize, const std::shared_ptr<TypeDef> &typeDef ) {
34+ uint64_t typeSize) {
4535 std::shared_ptr<Struct> s =
46- std::make_shared<Struct>(std::move ( name) , std::move (fields), typeSize);
36+ std::make_shared<Struct>(name, std::move (fields), typeSize);
4737 structs.push_back (s);
48- typeDef.get ()->setType (s);
49- }
50-
51- std::shared_ptr<Type>
52- IR::addUnion (std::string name, std::vector<Field *> fields, uint64_t maxSize) {
53- std::shared_ptr<Union> u =
54- std::make_shared<Union>(std::move (name), std::move (fields), maxSize);
55- unions.push_back (u);
56- typeDefs.push_back (u->generateTypeDef ());
57- return typeDefs.back ();
38+ std::shared_ptr<TypeDef> typeDef = getTypeDefWithName (" struct_" + name);
39+ if (typeDef) {
40+ /* the struct type used to be opaque type, typeDef contains nullptr */
41+ typeDef.get ()->setType (s);
42+ } else {
43+ typeDefs.push_back (s->generateTypeDef ());
44+ }
5845}
5946
6047void IR::addUnion (std::string name, std::vector<Field *> fields,
61- uint64_t maxSize, const std::shared_ptr<TypeDef> &typeDef ) {
48+ uint64_t maxSize) {
6249 std::shared_ptr<Union> u =
63- std::make_shared<Union>(std::move ( name) , std::move (fields), maxSize);
50+ std::make_shared<Union>(name, std::move (fields), maxSize);
6451 unions.push_back (u);
65- typeDef.get ()->setType (u);
52+ std::shared_ptr<TypeDef> typeDef = getTypeDefWithName (" union_" + name);
53+ if (typeDef) {
54+ /* the union type used to be opaque type, typeDef contains nullptr */
55+ typeDef.get ()->setType (u);
56+ } else {
57+ typeDefs.push_back (u->generateTypeDef ());
58+ }
6659}
6760
6861void IR::addLiteralDefine (std::string name, std::string literal,
0 commit comments