@@ -2228,9 +2228,10 @@ MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
22282228 // We have a macro definition. Register the association
22292229 PreprocessedEntityID
22302230 GlobalID = getGlobalPreprocessedEntityID (F, Record[NextIndex]);
2231+ unsigned Index = translatePreprocessedEntityIDToIndex (GlobalID);
22312232 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord ();
22322233 PreprocessingRecord::PPEntityID PPID =
2233- PPRec.getPPEntityID (GlobalID - 1 , /* isLoaded=*/ true );
2234+ PPRec.getPPEntityID (Index , /* isLoaded=*/ true );
22342235 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>(
22352236 PPRec.getPreprocessedEntity (PPID));
22362237 if (PPDef)
@@ -2261,16 +2262,22 @@ MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
22612262
22622263PreprocessedEntityID
22632264ASTReader::getGlobalPreprocessedEntityID (ModuleFile &M,
2264- unsigned LocalID) const {
2265+ PreprocessedEntityID LocalID) const {
22652266 if (!M.ModuleOffsetMap .empty ())
22662267 ReadModuleOffsetMap (M);
22672268
2268- ContinuousRangeMap<uint32_t , int , 2 >::const_iterator
2269- I = M.PreprocessedEntityRemap .find (LocalID - NUM_PREDEF_PP_ENTITY_IDS);
2270- assert (I != M.PreprocessedEntityRemap .end ()
2271- && " Invalid index into preprocessed entity index remap" );
2269+ unsigned ModuleFileIndex = LocalID >> 32 ;
2270+ LocalID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32 );
2271+ ModuleFile *MF =
2272+ ModuleFileIndex ? M.TransitiveImports [ModuleFileIndex - 1 ] : &M;
2273+ assert (MF && " malformed identifier ID encoding?" );
22722274
2273- return LocalID + I->second ;
2275+ if (!ModuleFileIndex) {
2276+ assert (LocalID >= NUM_PREDEF_PP_ENTITY_IDS);
2277+ LocalID -= NUM_PREDEF_PP_ENTITY_IDS;
2278+ }
2279+
2280+ return ((PreprocessedEntityID)(MF->Index + 1 ) << 32 ) | LocalID;
22742281}
22752282
22762283OptionalFileEntryRef
@@ -4107,8 +4114,6 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
41074114 assert (Blob.size () % sizeof (PPEntityOffset) == 0 );
41084115 F.NumPreprocessedEntities = Blob.size () / sizeof (PPEntityOffset);
41094116
4110- unsigned LocalBasePreprocessedEntityID = Record[0 ];
4111-
41124117 unsigned StartingID;
41134118 if (!PP.getPreprocessingRecord ())
41144119 PP.createPreprocessingRecord ();
@@ -4123,12 +4128,6 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
41234128 // Introduce the global -> local mapping for preprocessed entities in
41244129 // this module.
41254130 GlobalPreprocessedEntityMap.insert (std::make_pair (StartingID, &F));
4126-
4127- // Introduce the local -> global mapping for preprocessed entities in
4128- // this module.
4129- F.PreprocessedEntityRemap .insertOrReplace (
4130- std::make_pair (LocalBasePreprocessedEntityID,
4131- F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
41324131 }
41334132
41344133 break ;
@@ -4339,21 +4338,11 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
43394338 " duplicate MACRO_OFFSET record in AST file" );
43404339 F.MacroOffsets = (const uint32_t *)Blob.data ();
43414340 F.LocalNumMacros = Record[0 ];
4342- unsigned LocalBaseMacroID = Record[1 ];
4343- F.MacroOffsetsBase = Record[2 ] + F.ASTBlockStartOffset ;
4341+ F.MacroOffsetsBase = Record[1 ] + F.ASTBlockStartOffset ;
43444342 F.BaseMacroID = getTotalNumMacros ();
43454343
4346- if (F.LocalNumMacros > 0 ) {
4347- // Introduce the global -> local mapping for macros within this module.
4348- GlobalMacroMap.insert (std::make_pair (getTotalNumMacros () + 1 , &F));
4349-
4350- // Introduce the local -> global mapping for macros within this module.
4351- F.MacroRemap .insertOrReplace (
4352- std::make_pair (LocalBaseMacroID,
4353- F.BaseMacroID - LocalBaseMacroID));
4354-
4344+ if (F.LocalNumMacros > 0 )
43554345 MacrosLoaded.resize (MacrosLoaded.size () + F.LocalNumMacros );
4356- }
43574346 break ;
43584347 }
43594348
@@ -4459,8 +4448,6 @@ void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const {
44594448 F.ModuleOffsetMap = StringRef ();
44604449
44614450 using RemapBuilder = ContinuousRangeMap<uint32_t , int , 2 >::Builder;
4462- RemapBuilder MacroRemap (F.MacroRemap );
4463- RemapBuilder PreprocessedEntityRemap (F.PreprocessedEntityRemap );
44644451 RemapBuilder SubmoduleRemap (F.SubmoduleRemap );
44654452 RemapBuilder SelectorRemap (F.SelectorRemap );
44664453
@@ -4490,10 +4477,6 @@ void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const {
44904477
44914478 ImportedModuleVector.push_back (OM);
44924479
4493- uint32_t MacroIDOffset =
4494- endian::readNext<uint32_t , llvm::endianness::little>(Data);
4495- uint32_t PreprocessedEntityIDOffset =
4496- endian::readNext<uint32_t , llvm::endianness::little>(Data);
44974480 uint32_t SubmoduleIDOffset =
44984481 endian::readNext<uint32_t , llvm::endianness::little>(Data);
44994482 uint32_t SelectorIDOffset =
@@ -4507,9 +4490,6 @@ void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const {
45074490 static_cast <int >(BaseOffset - Offset)));
45084491 };
45094492
4510- mapOffset (MacroIDOffset, OM->BaseMacroID , MacroRemap);
4511- mapOffset (PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID ,
4512- PreprocessedEntityRemap);
45134493 mapOffset (SubmoduleIDOffset, OM->BaseSubmoduleID , SubmoduleRemap);
45144494 mapOffset (SelectorIDOffset, OM->BaseSelectorID , SelectorRemap);
45154495 }
@@ -6718,11 +6698,23 @@ SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) {
67186698 return Range;
67196699}
67206700
6701+ unsigned
6702+ ASTReader::translatePreprocessedEntityIDToIndex (PreprocessedEntityID ID) const {
6703+ unsigned ModuleFileIndex = ID >> 32 ;
6704+ assert (ModuleFileIndex && " not translating loaded MacroID?" );
6705+ assert (getModuleManager ().size () > ModuleFileIndex - 1 );
6706+ ModuleFile &MF = getModuleManager ()[ModuleFileIndex - 1 ];
6707+
6708+ ID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32 );
6709+ return MF.BasePreprocessedEntityID + ID;
6710+ }
6711+
67216712PreprocessedEntity *ASTReader::ReadPreprocessedEntity (unsigned Index) {
6722- PreprocessedEntityID PPID = Index+1 ;
67236713 std::pair<ModuleFile *, unsigned > PPInfo = getModulePreprocessedEntity (Index);
67246714 ModuleFile &M = *PPInfo.first ;
67256715 unsigned LocalIndex = PPInfo.second ;
6716+ PreprocessedEntityID PPID =
6717+ (((PreprocessedEntityID)M.Index + 1 ) << 32 ) | LocalIndex;
67266718 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets [LocalIndex];
67276719
67286720 if (!PP.getPreprocessingRecord ()) {
@@ -6770,8 +6762,9 @@ PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
67706762 else {
67716763 PreprocessedEntityID GlobalID =
67726764 getGlobalPreprocessedEntityID (M, Record[1 ]);
6773- Def = cast<MacroDefinitionRecord>(
6774- PPRec.getLoadedPreprocessedEntity (GlobalID - 1 ));
6765+ unsigned Index = translatePreprocessedEntityIDToIndex (GlobalID);
6766+ Def =
6767+ cast<MacroDefinitionRecord>(PPRec.getLoadedPreprocessedEntity (Index));
67756768 }
67766769
67776770 MacroExpansion *ME;
@@ -6824,8 +6817,8 @@ PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
68246817// / \param SLocMapI points at a chunk of a module that contains no
68256818// / preprocessed entities or the entities it contains are not the ones we are
68266819// / looking for.
6827- PreprocessedEntityID ASTReader::findNextPreprocessedEntity (
6828- GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
6820+ unsigned ASTReader::findNextPreprocessedEntity (
6821+ GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
68296822 ++SLocMapI;
68306823 for (GlobalSLocOffsetMapType::const_iterator
68316824 EndI = GlobalSLocOffsetMap.end (); SLocMapI != EndI; ++SLocMapI) {
@@ -6868,8 +6861,8 @@ struct PPEntityComp {
68686861
68696862} // namespace
68706863
6871- PreprocessedEntityID ASTReader::findPreprocessedEntity (SourceLocation Loc,
6872- bool EndsAfter) const {
6864+ unsigned ASTReader::findPreprocessedEntity (SourceLocation Loc,
6865+ bool EndsAfter) const {
68736866 if (SourceMgr.isLocalSourceLocation (Loc))
68746867 return getTotalNumPreprocessedEntities ();
68756868
@@ -6929,9 +6922,8 @@ std::pair<unsigned, unsigned>
69296922 return std::make_pair (0 ,0 );
69306923 assert (!SourceMgr.isBeforeInTranslationUnit (Range.getEnd (),Range.getBegin ()));
69316924
6932- PreprocessedEntityID BeginID =
6933- findPreprocessedEntity (Range.getBegin (), false );
6934- PreprocessedEntityID EndID = findPreprocessedEntity (Range.getEnd (), true );
6925+ unsigned BeginID = findPreprocessedEntity (Range.getBegin (), false );
6926+ unsigned EndID = findPreprocessedEntity (Range.getEnd (), true );
69356927 return std::make_pair (BeginID, EndID);
69366928}
69376929
@@ -8956,7 +8948,7 @@ LLVM_DUMP_METHOD void ASTReader::dump() {
89568948 llvm::errs () << " *** PCH/ModuleFile Remappings:\n " ;
89578949 dumpModuleIDMap (" Global bit offset map" , GlobalBitOffsetsMap);
89588950 dumpModuleIDMap (" Global source location entry map" , GlobalSLocEntryMap);
8959- dumpModuleIDMap ( " Global macro map " , GlobalMacroMap);
8951+
89608952 dumpModuleIDMap (" Global submodule map" , GlobalSubmoduleMap);
89618953 dumpModuleIDMap (" Global selector map" , GlobalSelectorMap);
89628954 dumpModuleIDMap (" Global preprocessed entity map" ,
@@ -9739,6 +9731,21 @@ IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, uint64_t LocalID) {
97399731 return ((IdentifierID)(MF->Index + 1 ) << 32 ) | LocalID;
97409732}
97419733
9734+ std::pair<ModuleFile *, unsigned >
9735+ ASTReader::translateMacroIDToIndex (MacroID ID) const {
9736+ if (ID == 0 )
9737+ return {nullptr , 0 };
9738+
9739+ unsigned ModuleFileIndex = ID >> 32 ;
9740+ assert (ModuleFileIndex && " not translating loaded MacroID?" );
9741+ assert (getModuleManager ().size () > ModuleFileIndex - 1 );
9742+ ModuleFile &MF = getModuleManager ()[ModuleFileIndex - 1 ];
9743+
9744+ unsigned LocalID = ID & llvm::maskTrailingOnes<MacroID>(32 );
9745+ assert (LocalID < MF.LocalNumMacros );
9746+ return {&MF, MF.BaseMacroID + LocalID};
9747+ }
9748+
97429749MacroInfo *ASTReader::getMacro (MacroID ID) {
97439750 if (ID == 0 )
97449751 return nullptr ;
@@ -9748,36 +9755,40 @@ MacroInfo *ASTReader::getMacro(MacroID ID) {
97489755 return nullptr ;
97499756 }
97509757
9751- ID -= NUM_PREDEF_MACRO_IDS;
9752- if (!MacrosLoaded[ID]) {
9753- GlobalMacroMapType::iterator I
9754- = GlobalMacroMap.find (ID + NUM_PREDEF_MACRO_IDS);
9755- assert (I != GlobalMacroMap.end () && " Corrupted global macro map" );
9756- ModuleFile *M = I->second ;
9757- unsigned Index = ID - M->BaseMacroID ;
9758- MacrosLoaded[ID] =
9759- ReadMacroRecord (*M, M->MacroOffsetsBase + M->MacroOffsets [Index]);
9758+ auto [M, Index] = translateMacroIDToIndex (ID);
9759+ if (!MacrosLoaded[Index]) {
9760+ assert (M != nullptr && " Untranslated Macro ID?" );
9761+ assert (Index >= M->BaseMacroID );
9762+ unsigned LocalIndex = Index - M->BaseMacroID ;
9763+ uint64_t DataOffset = M->MacroOffsetsBase + M->MacroOffsets [LocalIndex];
9764+ MacrosLoaded[Index] = ReadMacroRecord (*M, DataOffset);
97609765
97619766 if (DeserializationListener)
9762- DeserializationListener->MacroRead (ID + NUM_PREDEF_MACRO_IDS,
9763- MacrosLoaded[ID]);
9767+ DeserializationListener->MacroRead (ID, MacrosLoaded[Index]);
97649768 }
97659769
9766- return MacrosLoaded[ID ];
9770+ return MacrosLoaded[Index ];
97679771}
97689772
9769- MacroID ASTReader::getGlobalMacroID (ModuleFile &M, unsigned LocalID) {
9773+ MacroID ASTReader::getGlobalMacroID (ModuleFile &M, MacroID LocalID) {
97709774 if (LocalID < NUM_PREDEF_MACRO_IDS)
97719775 return LocalID;
97729776
97739777 if (!M.ModuleOffsetMap .empty ())
97749778 ReadModuleOffsetMap (M);
97759779
9776- ContinuousRangeMap<uint32_t , int , 2 >::iterator I
9777- = M.MacroRemap .find (LocalID - NUM_PREDEF_MACRO_IDS);
9778- assert (I != M.MacroRemap .end () && " Invalid index into macro index remap" );
9780+ unsigned ModuleFileIndex = LocalID >> 32 ;
9781+ LocalID &= llvm::maskTrailingOnes<MacroID>(32 );
9782+ ModuleFile *MF =
9783+ ModuleFileIndex ? M.TransitiveImports [ModuleFileIndex - 1 ] : &M;
9784+ assert (MF && " malformed identifier ID encoding?" );
97799785
9780- return LocalID + I->second ;
9786+ if (!ModuleFileIndex) {
9787+ assert (LocalID >= NUM_PREDEF_MACRO_IDS);
9788+ LocalID -= NUM_PREDEF_MACRO_IDS;
9789+ }
9790+
9791+ return ((MacroID)(MF->Index + 1 ) << 32 ) | LocalID;
97819792}
97829793
97839794serialization::SubmoduleID
0 commit comments