@@ -935,9 +935,8 @@ LocalDeclID LocalDeclID::get(ASTReader &Reader, ModuleFile &MF, DeclID Value) {
935
935
return ID;
936
936
}
937
937
938
- static LocalDeclID getLocalDeclID(ASTReader &Reader, ModuleFile &MF,
939
- unsigned ModuleFileIndex,
940
- unsigned LocalDeclID) {
938
+ LocalDeclID LocalDeclID::get(ASTReader &Reader, ModuleFile &MF,
939
+ unsigned ModuleFileIndex, unsigned LocalDeclID) {
941
940
DeclID Value = (DeclID)ModuleFileIndex << 32 | (DeclID)LocalDeclID;
942
941
return LocalDeclID::get(Reader, MF, Value);
943
942
}
@@ -1303,9 +1302,8 @@ bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M,
1303
1302
auto &Lex = LexicalDecls[DC];
1304
1303
if (!Lex.first) {
1305
1304
Lex = std::make_pair(
1306
- &M, llvm::ArrayRef(
1307
- reinterpret_cast<const unaligned_decl_id_t *>(Blob.data()),
1308
- Blob.size() / sizeof(DeclID)));
1305
+ &M, llvm::ArrayRef(reinterpret_cast<const uint32_t *>(Blob.data()),
1306
+ Blob.size() / sizeof(uint32_t)));
1309
1307
}
1310
1308
DC->setHasExternalLexicalStorage(true);
1311
1309
return false;
@@ -3426,8 +3424,8 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
3426
3424
case TU_UPDATE_LEXICAL: {
3427
3425
DeclContext *TU = ContextObj->getTranslationUnitDecl();
3428
3426
LexicalContents Contents(
3429
- reinterpret_cast<const unaligned_decl_id_t *>(Blob.data()),
3430
- static_cast<unsigned int>(Blob.size() / sizeof(DeclID )));
3427
+ reinterpret_cast<const uint32_t *>(Blob.data()),
3428
+ static_cast<unsigned int>(Blob.size() / sizeof(uint32_t )));
3431
3429
TULexicalDecls.push_back(std::make_pair(&F, Contents));
3432
3430
TU->setHasExternalLexicalStorage(true);
3433
3431
break;
@@ -3713,16 +3711,16 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
3713
3711
break;
3714
3712
3715
3713
case VTABLE_USES:
3716
- if (Record.size() % 3 != 0)
3717
- return llvm::createStringError(std::errc::illegal_byte_sequence,
3718
- "Invalid VTABLE_USES record");
3719
-
3720
3714
// Later tables overwrite earlier ones.
3721
3715
// FIXME: Modules will have some trouble with this. This is clearly not
3722
3716
// the right way to do this.
3723
3717
VTableUses.clear();
3724
3718
3725
3719
for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3720
+ if (Idx > N)
3721
+ return llvm::createStringError(std::errc::illegal_byte_sequence,
3722
+ "Invalid VTABLE_USES record");
3723
+
3726
3724
VTableUses.push_back(
3727
3725
{ReadDeclID(F, Record, Idx),
3728
3726
ReadSourceLocation(F, Record, Idx).getRawEncoding(),
@@ -3731,21 +3729,20 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
3731
3729
break;
3732
3730
3733
3731
case PENDING_IMPLICIT_INSTANTIATIONS:
3734
-
3735
- if (Record.size() % 2 != 0)
3736
- return llvm::createStringError(
3737
- std::errc::illegal_byte_sequence,
3738
- "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
3739
-
3740
3732
for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3733
+ if (I > N)
3734
+ return llvm::createStringError(
3735
+ std::errc::illegal_byte_sequence,
3736
+ "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
3737
+
3741
3738
PendingInstantiations.push_back(
3742
3739
{ReadDeclID(F, Record, I),
3743
3740
ReadSourceLocation(F, Record, I).getRawEncoding()});
3744
3741
}
3745
3742
break;
3746
3743
3747
3744
case SEMA_DECL_REFS:
3748
- if (Record.size() != 3)
3745
+ if (Record.size() != 3 * serialization::DeclIDRefSize )
3749
3746
return llvm::createStringError(std::errc::illegal_byte_sequence,
3750
3747
"Invalid SEMA_DECL_REFS block");
3751
3748
for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
@@ -3803,11 +3800,11 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
3803
3800
}
3804
3801
3805
3802
case DECL_UPDATE_OFFSETS:
3806
- if (Record.size() % 2 != 0)
3807
- return llvm::createStringError(
3808
- std::errc::illegal_byte_sequence,
3809
- "invalid DECL_UPDATE_OFFSETS block in AST file");
3810
3803
for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) {
3804
+ if (I > N)
3805
+ return llvm::createStringError(
3806
+ std::errc::illegal_byte_sequence,
3807
+ "invalid DECL_UPDATE_OFFSETS block in AST file");
3811
3808
GlobalDeclID ID = ReadDeclID(F, Record, I);
3812
3809
DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I++]));
3813
3810
@@ -3820,12 +3817,12 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
3820
3817
break;
3821
3818
3822
3819
case DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD: {
3823
- if (Record.size() % 3 != 0)
3824
- return llvm::createStringError(
3825
- std::errc::illegal_byte_sequence,
3826
- "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
3827
- "file");
3828
3820
for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) {
3821
+ if (I > N)
3822
+ return llvm::createStringError(
3823
+ std::errc::illegal_byte_sequence,
3824
+ "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
3825
+ "file");
3829
3826
GlobalDeclID ID = ReadDeclID(F, Record, I);
3830
3827
3831
3828
uint64_t BaseOffset = F.DeclsBlockStartOffset;
@@ -3915,10 +3912,11 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
3915
3912
break;
3916
3913
3917
3914
case UNDEFINED_BUT_USED:
3918
- if (Record.size() % 2 != 0)
3919
- return llvm::createStringError(std::errc::illegal_byte_sequence,
3920
- "invalid undefined-but-used record");
3921
3915
for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3916
+ if (I > N)
3917
+ return llvm::createStringError(std::errc::illegal_byte_sequence,
3918
+ "invalid undefined-but-used record");
3919
+
3922
3920
UndefinedButUsed.push_back(
3923
3921
{ReadDeclID(F, Record, I),
3924
3922
ReadSourceLocation(F, Record, I).getRawEncoding()});
@@ -7880,7 +7878,7 @@ LocalDeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
7880
7878
if (!OrignalModuleFileIndex)
7881
7879
return LocalDeclID();
7882
7880
7883
- return getLocalDeclID (*this, M, OrignalModuleFileIndex, ID);
7881
+ return LocalDeclID::get (*this, M, OrignalModuleFileIndex, ID);
7884
7882
}
7885
7883
7886
7884
GlobalDeclID ASTReader::ReadDeclID(ModuleFile &F, const RecordDataImpl &Record,
@@ -7890,7 +7888,10 @@ GlobalDeclID ASTReader::ReadDeclID(ModuleFile &F, const RecordDataImpl &Record,
7890
7888
return GlobalDeclID(0);
7891
7889
}
7892
7890
7893
- return getGlobalDeclID(F, LocalDeclID::get(*this, F, Record[Idx++]));
7891
+ uint32_t ModuleFileIndex = Record[Idx++];
7892
+ uint32_t LocalDeclIndex = Record[Idx++];
7893
+ return getGlobalDeclID(
7894
+ F, LocalDeclID::get(*this, F, ModuleFileIndex, LocalDeclIndex));
7894
7895
}
7895
7896
7896
7897
/// Resolve the offset of a statement into a statement.
@@ -7919,25 +7920,26 @@ void ASTReader::FindExternalLexicalDecls(
7919
7920
SmallVectorImpl<Decl *> &Decls) {
7920
7921
bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {};
7921
7922
7922
- auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) {
7923
- assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries");
7924
- for (int I = 0, N = LexicalDecls.size(); I != N; I += 2 ) {
7923
+ auto Visit = [&](ModuleFile *M, LexicalContents LexicalDecls) {
7924
+ assert(LexicalDecls.size() % 3 == 0 && "incorrect number of entries");
7925
+ for (int I = 0, N = LexicalDecls.size(); I != N; I += 3 ) {
7925
7926
auto K = (Decl::Kind)+LexicalDecls[I];
7926
7927
if (!IsKindWeWant(K))
7927
7928
continue;
7928
7929
7929
- auto ID = (DeclID) + LexicalDecls[I + 1];
7930
+ LocalDeclID ID =
7931
+ LocalDeclID::get(*this, *M, LexicalDecls[I + 1], LexicalDecls[I + 2]);
7930
7932
7931
7933
// Don't add predefined declarations to the lexical context more
7932
7934
// than once.
7933
7935
if (ID < NUM_PREDEF_DECL_IDS) {
7934
- if (PredefsVisited[ID])
7936
+ if (PredefsVisited[ID.getRawValue() ])
7935
7937
continue;
7936
7938
7937
- PredefsVisited[ID] = true;
7939
+ PredefsVisited[ID.getRawValue() ] = true;
7938
7940
}
7939
7941
7940
- if (Decl *D = GetLocalDecl(*M, LocalDeclID::get(*this, *M, ID) )) {
7942
+ if (Decl *D = GetLocalDecl(*M, ID )) {
7941
7943
assert(D->getKind() == K && "wrong kind for lexical decl");
7942
7944
if (!DC->isDeclInLexicalTraversal(D))
7943
7945
Decls.push_back(D);
@@ -8836,7 +8838,7 @@ void ASTReader::ReadLateParsedTemplates(
8836
8838
&LPTMap) {
8837
8839
for (auto &LPT : LateParsedTemplates) {
8838
8840
ModuleFile *FMod = LPT.first;
8839
- RecordDataImpl &LateParsed = LPT.second;
8841
+ const RecordData &LateParsed = LPT.second;
8840
8842
for (unsigned Idx = 0, N = LateParsed.size(); Idx < N;
8841
8843
/* In loop */) {
8842
8844
FunctionDecl *FD = ReadDeclAs<FunctionDecl>(*FMod, LateParsed, Idx);
0 commit comments