@@ -400,15 +400,25 @@ class TypeBlock
400
400
{
401
401
protected:
402
402
BitcodeReader& br_;
403
+ TypeInfo* p_;
403
404
404
405
public:
405
406
FieldId F;
406
407
TypeInfo I;
407
408
409
+ TypeBlock (
410
+ TypeInfo& I_,
411
+ BitcodeReader& br) noexcept
412
+ : br_(br)
413
+ , p_(&I_)
414
+ {
415
+ }
416
+
408
417
explicit
409
418
TypeBlock (
410
419
BitcodeReader& br) noexcept
411
420
: br_(br)
421
+ , p_(&I)
412
422
{
413
423
}
414
424
@@ -424,7 +434,7 @@ class TypeBlock
424
434
if (auto Err = br_.readBlock (B, ID))
425
435
return Err;
426
436
F = B.F ;
427
- I. Type = std::move (B.I );
437
+ p_-> Type = std::move (B.I );
428
438
return llvm::Error::success ();
429
439
}
430
440
default :
@@ -795,6 +805,17 @@ class TopLevelBlock
795
805
}
796
806
break ;
797
807
}
808
+ case FieldId::F_child_enum:
809
+ {
810
+ if constexpr (
811
+ std::derived_from<T, NamespaceInfo> ||
812
+ std::derived_from<T, RecordInfo>)
813
+ {
814
+ I->Children .Enums .emplace_back (std::move (R));
815
+ return llvm::Error::success ();
816
+ }
817
+ break ;
818
+ }
798
819
default :
799
820
return makeWrongFieldError (Id);
800
821
}
@@ -1061,10 +1082,41 @@ class TypedefBlock
1061
1082
1062
1083
// ------------------------------------------------
1063
1084
1085
+ class EnumValueBlock : public BitcodeReader ::AnyBlock
1086
+ {
1087
+ BitcodeReader& br_;
1088
+ EnumValueInfo& I_;
1089
+
1090
+ public:
1091
+ EnumValueBlock (
1092
+ EnumValueInfo& I,
1093
+ BitcodeReader& br) noexcept
1094
+ : br_(br)
1095
+ , I_(I)
1096
+ {
1097
+ }
1098
+
1099
+ llvm::Error
1100
+ parseRecord (Record const & R,
1101
+ unsigned ID, llvm::StringRef Blob) override
1102
+ {
1103
+ switch (ID)
1104
+ {
1105
+ case ENUM_VALUE_NAME:
1106
+ return decodeRecord (R, I_.Name , Blob);
1107
+ case ENUM_VALUE_VALUE:
1108
+ return decodeRecord (R, I_.Value , Blob);
1109
+ case ENUM_VALUE_EXPR:
1110
+ return decodeRecord (R, I_.ValueExpr , Blob);
1111
+ default :
1112
+ return AnyBlock::parseRecord (R, ID, Blob);
1113
+ }
1114
+ }
1115
+ };
1116
+
1064
1117
class EnumBlock
1065
1118
: public TopLevelBlock<EnumInfo>
1066
1119
{
1067
-
1068
1120
public:
1069
1121
explicit
1070
1122
EnumBlock (
@@ -1077,27 +1129,39 @@ class EnumBlock
1077
1129
parseRecord (Record const & R,
1078
1130
unsigned ID, llvm::StringRef Blob) override
1079
1131
{
1080
- #if 0
1081
1132
switch (ID)
1082
1133
{
1134
+ case ENUM_SCOPED:
1135
+ return decodeRecord (R, I->Scoped , Blob);
1083
1136
default :
1084
1137
break ;
1085
1138
}
1086
- #endif
1087
1139
return TopLevelBlock::parseRecord (R, ID, Blob);
1088
1140
}
1089
1141
1090
1142
llvm::Error
1091
1143
readSubBlock (
1092
1144
unsigned ID) override
1093
1145
{
1094
- #if 0
1095
1146
switch (ID)
1096
1147
{
1148
+ case BI_TYPE_BLOCK_ID:
1149
+ {
1150
+ I->BaseType .emplace ();
1151
+ TypeBlock B (*I->BaseType , br_);
1152
+ return br_.readBlock (B, ID);
1153
+ }
1154
+ case BI_ENUM_VALUE_BLOCK_ID:
1155
+ {
1156
+ I->Members .emplace_back ();
1157
+ EnumValueBlock B (I->Members .back (), br_);
1158
+ if (auto Err = br_.readBlock (B, ID))
1159
+ return Err;
1160
+ return llvm::Error::success ();
1161
+ }
1097
1162
default :
1098
1163
break ;
1099
1164
}
1100
- #endif
1101
1165
return TopLevelBlock::readSubBlock (ID);
1102
1166
}
1103
1167
};
@@ -1167,6 +1231,12 @@ readChild(
1167
1231
case FieldId::F_child_function:
1168
1232
I.Functions .emplace_back (B.I );
1169
1233
break ;
1234
+ case FieldId::F_child_typedef:
1235
+ I.Typedefs .emplace_back (B.I );
1236
+ break ;
1237
+ case FieldId::F_child_enum:
1238
+ I.Enums .emplace_back (B.I );
1239
+ break ;
1170
1240
default :
1171
1241
return makeWrongFieldError (B.F );
1172
1242
}
0 commit comments