@@ -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