Skip to content

Commit 70559cb

Browse files
committed
[clang] [Serialization] No transitive change for MacroID and PreprocessedEntityID
1 parent 77c1db4 commit 70559cb

File tree

7 files changed

+127
-109
lines changed

7 files changed

+127
-109
lines changed

clang/include/clang/Serialization/ASTBitCodes.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,14 +151,14 @@ struct UnsafeQualTypeDenseMapInfo {
151151
};
152152

153153
/// An ID number that refers to a macro in an AST file.
154-
using MacroID = uint32_t;
154+
using MacroID = uint64_t;
155155

156156
/// A global ID number that refers to a macro in an AST file.
157-
using GlobalMacroID = uint32_t;
157+
using GlobalMacroID = uint64_t;
158158

159159
/// A local to a module ID number that refers to a macro in an
160160
/// AST file.
161-
using LocalMacroID = uint32_t;
161+
using LocalMacroID = uint64_t;
162162

163163
/// The number of predefined macro IDs.
164164
const unsigned int NUM_PREDEF_MACRO_IDS = 1;
@@ -179,7 +179,7 @@ using CXXCtorInitializersID = uint32_t;
179179

180180
/// An ID number that refers to an entity in the detailed
181181
/// preprocessing record.
182-
using PreprocessedEntityID = uint32_t;
182+
using PreprocessedEntityID = uint64_t;
183183

184184
/// An ID number that refers to a submodule in a module file.
185185
using SubmoduleID = uint32_t;

clang/include/clang/Serialization/ASTReader.h

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -800,14 +800,6 @@ class ASTReader
800800
/// files.
801801
llvm::DenseSet<LoadedMacroInfo> LoadedUndefs;
802802

803-
using GlobalMacroMapType =
804-
ContinuousRangeMap<serialization::MacroID, ModuleFile *, 4>;
805-
806-
/// Mapping from global macro IDs to the module in which the
807-
/// macro resides along with the offset that should be added to the
808-
/// global macro ID to produce a local ID.
809-
GlobalMacroMapType GlobalMacroMap;
810-
811803
/// A vector containing submodules that have already been loaded.
812804
///
813805
/// This vector is indexed by the Submodule ID (-1). NULL submodule entries
@@ -1655,18 +1647,16 @@ class ASTReader
16551647

16561648
/// Returns the first preprocessed entity ID that begins or ends after
16571649
/// \arg Loc.
1658-
serialization::PreprocessedEntityID
1659-
findPreprocessedEntity(SourceLocation Loc, bool EndsAfter) const;
1650+
unsigned findPreprocessedEntity(SourceLocation Loc, bool EndsAfter) const;
16601651

16611652
/// Find the next module that contains entities and return the ID
16621653
/// of the first entry.
16631654
///
16641655
/// \param SLocMapI points at a chunk of a module that contains no
16651656
/// preprocessed entities or the entities it contains are not the
16661657
/// ones we are looking for.
1667-
serialization::PreprocessedEntityID
1668-
findNextPreprocessedEntity(
1669-
GlobalSLocOffsetMapType::const_iterator SLocMapI) const;
1658+
unsigned findNextPreprocessedEntity(
1659+
GlobalSLocOffsetMapType::const_iterator SLocMapI) const;
16701660

16711661
/// Returns (ModuleFile, Local index) pair for \p GlobalIndex of a
16721662
/// preprocessed entity.
@@ -1748,6 +1738,14 @@ class ASTReader
17481738
std::pair<ModuleFile *, unsigned>
17491739
translateIdentifierIDToIndex(serialization::IdentifierID ID) const;
17501740

1741+
/// Translate an \param MacroID ID to the index of MacrosLoaded
1742+
/// array and the corresponding module file.
1743+
std::pair<ModuleFile *, unsigned>
1744+
translateMacroIDToIndex(serialization::MacroID ID) const;
1745+
1746+
unsigned translatePreprocessedEntityIDToIndex(
1747+
serialization::PreprocessedEntityID ID) const;
1748+
17511749
/// Translate an \param TypeID ID to the index of TypesLoaded
17521750
/// array and the corresponding module file.
17531751
std::pair<ModuleFile *, unsigned>
@@ -2388,7 +2386,8 @@ class ASTReader
23882386

23892387
/// Retrieve the global macro ID corresponding to the given local
23902388
/// ID within the given module file.
2391-
serialization::MacroID getGlobalMacroID(ModuleFile &M, unsigned LocalID);
2389+
serialization::MacroID getGlobalMacroID(ModuleFile &M,
2390+
serialization::MacroID LocalID);
23922391

23932392
/// Read the source location entry with index ID.
23942393
bool ReadSLocEntry(int ID) override;
@@ -2572,8 +2571,8 @@ class ASTReader
25722571

25732572
/// Determine the global preprocessed entity ID that corresponds to
25742573
/// the given local ID within the given module.
2575-
serialization::PreprocessedEntityID
2576-
getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const;
2574+
serialization::PreprocessedEntityID getGlobalPreprocessedEntityID(
2575+
ModuleFile &M, serialization::PreprocessedEntityID LocalID) const;
25772576

25782577
/// Add a macro to deserialize its macro directive history.
25792578
///

clang/include/clang/Serialization/ModuleFile.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -353,9 +353,6 @@ class ModuleFile {
353353
/// Base macro ID for macros local to this module.
354354
serialization::MacroID BaseMacroID = 0;
355355

356-
/// Remapping table for macro IDs in this module.
357-
ContinuousRangeMap<uint32_t, int, 2> MacroRemap;
358-
359356
/// The offset of the start of the set of defined macros.
360357
uint64_t MacroStartOffset = 0;
361358

@@ -372,9 +369,6 @@ class ModuleFile {
372369
/// this module.
373370
serialization::PreprocessedEntityID BasePreprocessedEntityID = 0;
374371

375-
/// Remapping table for preprocessed entity IDs in this module.
376-
ContinuousRangeMap<uint32_t, int, 2> PreprocessedEntityRemap;
377-
378372
const PPEntityOffset *PreprocessedEntityOffsets = nullptr;
379373
unsigned NumPreprocessedEntities = 0;
380374

clang/lib/Serialization/ASTReader.cpp

Lines changed: 75 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -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

22622263
PreprocessedEntityID
22632264
ASTReader::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

22762283
OptionalFileEntryRef
@@ -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+
67216712
PreprocessedEntity *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+
97429749
MacroInfo *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

97839794
serialization::SubmoduleID

0 commit comments

Comments
 (0)