@@ -954,7 +954,7 @@ ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
954
954
SelectorTable &SelTable = Reader.getContext ().Selectors ;
955
955
unsigned N = endian::readNext<uint16_t , llvm::endianness::little>(d);
956
956
const IdentifierInfo *FirstII = Reader.getLocalIdentifier (
957
- F, endian::readNext<uint32_t , llvm::endianness::little>(d));
957
+ F, endian::readNext<IdentifierID , llvm::endianness::little>(d));
958
958
if (N == 0 )
959
959
return SelTable.getNullarySelector (FirstII);
960
960
else if (N == 1 )
@@ -964,7 +964,7 @@ ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
964
964
Args.push_back (FirstII);
965
965
for (unsigned I = 1 ; I != N; ++I)
966
966
Args.push_back (Reader.getLocalIdentifier (
967
- F, endian::readNext<uint32_t , llvm::endianness::little>(d)));
967
+ F, endian::readNext<IdentifierID , llvm::endianness::little>(d)));
968
968
969
969
return SelTable.getSelector (N, Args.data ());
970
970
}
@@ -1047,7 +1047,8 @@ static bool readBit(unsigned &Bits) {
1047
1047
IdentifierID ASTIdentifierLookupTrait::ReadIdentifierID (const unsigned char *d) {
1048
1048
using namespace llvm ::support;
1049
1049
1050
- unsigned RawID = endian::readNext<uint32_t , llvm::endianness::little>(d);
1050
+ IdentifierID RawID =
1051
+ endian::readNext<IdentifierID, llvm::endianness::little>(d);
1051
1052
return Reader.getGlobalIdentifierID (F, RawID >> 1 );
1052
1053
}
1053
1054
@@ -1065,9 +1066,12 @@ IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
1065
1066
unsigned DataLen) {
1066
1067
using namespace llvm ::support;
1067
1068
1068
- unsigned RawID = endian::readNext<uint32_t , llvm::endianness::little>(d);
1069
+ IdentifierID RawID =
1070
+ endian::readNext<IdentifierID, llvm::endianness::little>(d);
1069
1071
bool IsInteresting = RawID & 0x01 ;
1070
1072
1073
+ DataLen -= sizeof (IdentifierID);
1074
+
1071
1075
// Wipe out the "is interesting" bit.
1072
1076
RawID = RawID >> 1 ;
1073
1077
@@ -1098,7 +1102,7 @@ IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
1098
1102
bool HadMacroDefinition = readBit (Bits);
1099
1103
1100
1104
assert (Bits == 0 && " Extra bits in the identifier?" );
1101
- DataLen -= 8 ;
1105
+ DataLen -= sizeof ( uint16_t ) * 2 ;
1102
1106
1103
1107
// Set or check the various bits in the IdentifierInfo structure.
1104
1108
// Token IDs are read-only.
@@ -1225,7 +1229,7 @@ ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1225
1229
case DeclarationName::CXXLiteralOperatorName:
1226
1230
case DeclarationName::CXXDeductionGuideName:
1227
1231
Data = (uint64_t )Reader.getLocalIdentifier (
1228
- F, endian::readNext<uint32_t , llvm::endianness::little>(d));
1232
+ F, endian::readNext<IdentifierID , llvm::endianness::little>(d));
1229
1233
break ;
1230
1234
case DeclarationName::ObjCZeroArgSelector:
1231
1235
case DeclarationName::ObjCOneArgSelector:
@@ -2093,7 +2097,7 @@ HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
2093
2097
HFI.DirInfo = (Flags >> 1 ) & 0x07 ;
2094
2098
HFI.IndexHeaderMapHeader = Flags & 0x01 ;
2095
2099
HFI.LazyControllingMacro = Reader.getGlobalIdentifierID (
2096
- M, endian::readNext<uint32_t , llvm::endianness::little>(d));
2100
+ M, endian::readNext<IdentifierID , llvm::endianness::little>(d));
2097
2101
if (unsigned FrameworkOffset =
2098
2102
endian::readNext<uint32_t , llvm::endianness::little>(d)) {
2099
2103
// The framework offset is 1 greater than the actual offset,
@@ -3467,24 +3471,11 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
3467
3471
" duplicate IDENTIFIER_OFFSET record in AST file" );
3468
3472
F.IdentifierOffsets = (const uint32_t *)Blob.data ();
3469
3473
F.LocalNumIdentifiers = Record[0 ];
3470
- unsigned LocalBaseIdentifierID = Record[1 ];
3471
3474
F.BaseIdentifierID = getTotalNumIdentifiers ();
3472
3475
3473
- if (F.LocalNumIdentifiers > 0 ) {
3474
- // Introduce the global -> local mapping for identifiers within this
3475
- // module.
3476
- GlobalIdentifierMap.insert (std::make_pair (getTotalNumIdentifiers () + 1 ,
3477
- &F));
3478
-
3479
- // Introduce the local -> global mapping for identifiers within this
3480
- // module.
3481
- F.IdentifierRemap .insertOrReplace (
3482
- std::make_pair (LocalBaseIdentifierID,
3483
- F.BaseIdentifierID - LocalBaseIdentifierID));
3484
-
3476
+ if (F.LocalNumIdentifiers > 0 )
3485
3477
IdentifiersLoaded.resize (IdentifiersLoaded.size ()
3486
3478
+ F.LocalNumIdentifiers );
3487
- }
3488
3479
break ;
3489
3480
}
3490
3481
@@ -4089,7 +4080,6 @@ void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const {
4089
4080
F.ModuleOffsetMap = StringRef ();
4090
4081
4091
4082
using RemapBuilder = ContinuousRangeMap<uint32_t , int , 2 >::Builder;
4092
- RemapBuilder IdentifierRemap (F.IdentifierRemap );
4093
4083
RemapBuilder MacroRemap (F.MacroRemap );
4094
4084
RemapBuilder PreprocessedEntityRemap (F.PreprocessedEntityRemap );
4095
4085
RemapBuilder SubmoduleRemap (F.SubmoduleRemap );
@@ -4122,8 +4112,6 @@ void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const {
4122
4112
4123
4113
ImportedModuleVector.push_back (OM);
4124
4114
4125
- uint32_t IdentifierIDOffset =
4126
- endian::readNext<uint32_t , llvm::endianness::little>(Data);
4127
4115
uint32_t MacroIDOffset =
4128
4116
endian::readNext<uint32_t , llvm::endianness::little>(Data);
4129
4117
uint32_t PreprocessedEntityIDOffset =
@@ -4143,7 +4131,6 @@ void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const {
4143
4131
static_cast <int >(BaseOffset - Offset)));
4144
4132
};
4145
4133
4146
- mapOffset (IdentifierIDOffset, OM->BaseIdentifierID , IdentifierRemap);
4147
4134
mapOffset (MacroIDOffset, OM->BaseMacroID , MacroRemap);
4148
4135
mapOffset (PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID ,
4149
4136
PreprocessedEntityRemap);
@@ -8238,7 +8225,6 @@ LLVM_DUMP_METHOD void ASTReader::dump() {
8238
8225
dumpModuleIDMap (" Global bit offset map" , GlobalBitOffsetsMap);
8239
8226
dumpModuleIDMap (" Global source location entry map" , GlobalSLocEntryMap);
8240
8227
dumpModuleIDMap (" Global type map" , GlobalTypeMap);
8241
- dumpModuleIDMap (" Global identifier map" , GlobalIdentifierMap);
8242
8228
dumpModuleIDMap (" Global macro map" , GlobalMacroMap);
8243
8229
dumpModuleIDMap (" Global submodule map" , GlobalSubmoduleMap);
8244
8230
dumpModuleIDMap (" Global selector map" , GlobalSelectorMap);
@@ -8878,8 +8864,9 @@ void ASTReader::LoadSelector(Selector Sel) {
8878
8864
8879
8865
void ASTReader::SetIdentifierInfo (IdentifierID ID, IdentifierInfo *II) {
8880
8866
assert (ID && " Non-zero identifier ID required" );
8881
- assert (ID <= IdentifiersLoaded.size () && " identifier ID out of range" );
8882
- IdentifiersLoaded[ID - 1 ] = II;
8867
+ unsigned Index = translateIdentifierIDToIndex (ID).second ;
8868
+ assert (Index < IdentifiersLoaded.size () && " identifier ID out of range" );
8869
+ IdentifiersLoaded[Index] = II;
8883
8870
if (DeserializationListener)
8884
8871
DeserializationListener->IdentifierRead (ID, II);
8885
8872
}
@@ -8932,6 +8919,22 @@ void ASTReader::SetGloballyVisibleDecls(
8932
8919
}
8933
8920
}
8934
8921
8922
+ std::pair<ModuleFile *, unsigned >
8923
+ ASTReader::translateIdentifierIDToIndex (IdentifierID ID) const {
8924
+ if (ID == 0 )
8925
+ return {nullptr , 0 };
8926
+
8927
+ unsigned ModuleFileIndex = ID >> 32 ;
8928
+ unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32 );
8929
+
8930
+ assert (ModuleFileIndex && " not translating loaded IdentifierID?" );
8931
+ assert (getModuleManager ().size () > ModuleFileIndex - 1 );
8932
+
8933
+ ModuleFile &MF = getModuleManager ()[ModuleFileIndex - 1 ];
8934
+ assert (LocalID < MF.LocalNumIdentifiers );
8935
+ return {&MF, MF.BaseIdentifierID + LocalID};
8936
+ }
8937
+
8935
8938
IdentifierInfo *ASTReader::DecodeIdentifierInfo (IdentifierID ID) {
8936
8939
if (ID == 0 )
8937
8940
return nullptr ;
@@ -8941,45 +8944,48 @@ IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
8941
8944
return nullptr ;
8942
8945
}
8943
8946
8944
- ID -= 1 ;
8945
- if (!IdentifiersLoaded[ID]) {
8946
- GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find (ID + 1 );
8947
- assert (I != GlobalIdentifierMap.end () && " Corrupted global identifier map" );
8948
- ModuleFile *M = I->second ;
8949
- unsigned Index = ID - M->BaseIdentifierID ;
8947
+ auto [M, Index] = translateIdentifierIDToIndex (ID);
8948
+ if (!IdentifiersLoaded[Index]) {
8949
+ assert (M != nullptr && " Untranslated Identifier ID?" );
8950
+ assert (Index >= M->BaseIdentifierID );
8951
+ unsigned LocalIndex = Index - M->BaseIdentifierID ;
8950
8952
const unsigned char *Data =
8951
- M->IdentifierTableData + M->IdentifierOffsets [Index ];
8953
+ M->IdentifierTableData + M->IdentifierOffsets [LocalIndex ];
8952
8954
8953
8955
ASTIdentifierLookupTrait Trait (*this , *M);
8954
8956
auto KeyDataLen = Trait.ReadKeyDataLength (Data);
8955
8957
auto Key = Trait.ReadKey (Data, KeyDataLen.first );
8956
8958
auto &II = PP.getIdentifierTable ().get (Key);
8957
- IdentifiersLoaded[ID ] = &II;
8959
+ IdentifiersLoaded[Index ] = &II;
8958
8960
markIdentifierFromAST (*this , II);
8959
8961
if (DeserializationListener)
8960
- DeserializationListener->IdentifierRead (ID + 1 , &II);
8962
+ DeserializationListener->IdentifierRead (ID, &II);
8961
8963
}
8962
8964
8963
- return IdentifiersLoaded[ID ];
8965
+ return IdentifiersLoaded[Index ];
8964
8966
}
8965
8967
8966
- IdentifierInfo *ASTReader::getLocalIdentifier (ModuleFile &M, unsigned LocalID) {
8968
+ IdentifierInfo *ASTReader::getLocalIdentifier (ModuleFile &M, uint64_t LocalID) {
8967
8969
return DecodeIdentifierInfo (getGlobalIdentifierID (M, LocalID));
8968
8970
}
8969
8971
8970
- IdentifierID ASTReader::getGlobalIdentifierID (ModuleFile &M, unsigned LocalID) {
8972
+ IdentifierID ASTReader::getGlobalIdentifierID (ModuleFile &M, uint64_t LocalID) {
8971
8973
if (LocalID < NUM_PREDEF_IDENT_IDS)
8972
8974
return LocalID;
8973
8975
8974
8976
if (!M.ModuleOffsetMap .empty ())
8975
8977
ReadModuleOffsetMap (M);
8976
8978
8977
- ContinuousRangeMap<uint32_t , int , 2 >::iterator I
8978
- = M.IdentifierRemap .find (LocalID - NUM_PREDEF_IDENT_IDS);
8979
- assert (I != M.IdentifierRemap .end ()
8980
- && " Invalid index into identifier index remap" );
8979
+ unsigned ModuleFileIndex = LocalID >> 32 ;
8980
+ LocalID &= llvm::maskTrailingOnes<IdentifierID>(32 );
8981
+ ModuleFile *MF =
8982
+ ModuleFileIndex ? M.TransitiveImports [ModuleFileIndex - 1 ] : &M;
8983
+ assert (MF && " malformed identifier ID encoding?" );
8981
8984
8982
- return LocalID + I->second ;
8985
+ if (!ModuleFileIndex)
8986
+ LocalID -= NUM_PREDEF_IDENT_IDS;
8987
+
8988
+ return ((IdentifierID)(MF->Index + 1 ) << 32 ) | LocalID;
8983
8989
}
8984
8990
8985
8991
MacroInfo *ASTReader::getMacro (MacroID ID) {
0 commit comments