summaryrefslogtreecommitdiffstats
path: root/clang/lib/Serialization/ASTReader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Serialization/ASTReader.cpp')
-rw-r--r--clang/lib/Serialization/ASTReader.cpp56
1 files changed, 30 insertions, 26 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index 1bafc2a4c58..17669b441c1 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -525,13 +525,9 @@ IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
// If this identifier is a macro, deserialize the macro
// definition.
if (hadMacroDefinition) {
- SmallVector<MacroID, 4> MacroIDs;
- while (uint32_t LocalID = ReadUnalignedLE32(d)) {
- MacroIDs.push_back(Reader.getGlobalMacroID(F, LocalID));
- DataLen -= 4;
- }
DataLen -= 4;
- Reader.setIdentifierIsMacro(II, MacroIDs);
+ uint32_t LocalID = ReadUnalignedLE32(d);
+ Reader.addMacroIDForDeserialization(II, Reader.getGlobalMacroID(F,LocalID));
}
Reader.SetIdentifierInfo(ID, II);
@@ -1061,8 +1057,7 @@ bool ASTReader::ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor,
}
}
-void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset,
- MacroInfo *Hint) {
+void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
llvm::BitstreamCursor &Stream = F.MacroCursor;
// Keep track of where we are in the stream, then jump back there
@@ -1078,19 +1073,18 @@ void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset,
// adding tokens.
struct AddLoadedMacroInfoRAII {
Preprocessor &PP;
- MacroInfo *Hint;
MacroInfo *MI;
IdentifierInfo *II;
- AddLoadedMacroInfoRAII(Preprocessor &PP, MacroInfo *Hint)
- : PP(PP), Hint(Hint), MI(), II() { }
+ explicit AddLoadedMacroInfoRAII(Preprocessor &PP)
+ : PP(PP), MI(), II() { }
~AddLoadedMacroInfoRAII( ) {
if (MI) {
// Finally, install the macro.
- PP.addLoadedMacroInfo(II, MI, Hint);
+ PP.addLoadedMacroInfo(II, MI);
}
}
- } AddLoadedMacroInfo(PP, Hint);
+ } AddLoadedMacroInfo(PP);
while (true) {
unsigned Code = Stream.ReadCode();
@@ -1146,6 +1140,9 @@ void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset,
SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
MacroInfo *MI = PP.AllocateMacroInfo(Loc);
MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
+ bool isHeadMI = Record[NextIndex++];
+ MacroInfo *PrevMI = getMacro(getGlobalMacroID(F, Record[NextIndex++]));
+ MI->setPreviousDefinition(PrevMI);
// Record this macro.
MacrosLoaded[GlobalID - NUM_PREDEF_MACRO_IDS] = MI;
@@ -1230,9 +1227,11 @@ void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset,
}
MI->setHidden(Hidden);
- // Make sure we install the macro once we're done.
- AddLoadedMacroInfo.MI = MI;
- AddLoadedMacroInfo.II = II;
+ if (isHeadMI) {
+ // Make sure we install the macro once we're done.
+ AddLoadedMacroInfo.MI = MI;
+ AddLoadedMacroInfo.II = II;
+ }
// Remember that we saw this macro last so that we add the tokens that
// form its body to it.
@@ -1341,10 +1340,13 @@ HeaderFileInfoTrait::ReadData(const internal_key_type, const unsigned char *d,
return HFI;
}
-void ASTReader::setIdentifierIsMacro(IdentifierInfo *II, ArrayRef<MacroID> IDs){
+void ASTReader::addMacroIDForDeserialization(IdentifierInfo *II, MacroID ID){
II->setHadMacroDefinition(true);
assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
- PendingMacroIDs[II].append(IDs.begin(), IDs.end());
+ SmallVector<serialization::MacroID, 2> &MacroIDs = PendingMacroIDs[II];
+ assert(std::find(MacroIDs.begin(), MacroIDs.end(), ID) == MacroIDs.end() &&
+ "Already added the macro ID for deserialization");
+ MacroIDs.push_back(ID);
}
void ASTReader::ReadDefinedMacros() {
@@ -6160,7 +6162,7 @@ IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
return LocalID + I->second;
}
-MacroInfo *ASTReader::getMacro(MacroID ID, MacroInfo *Hint) {
+MacroInfo *ASTReader::getMacro(MacroID ID) {
if (ID == 0)
return 0;
@@ -6176,7 +6178,7 @@ MacroInfo *ASTReader::getMacro(MacroID ID, MacroInfo *Hint) {
assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
ModuleFile *M = I->second;
unsigned Index = ID - M->BaseMacroID;
- ReadMacroRecord(*M, M->MacroOffsets[Index], Hint);
+ ReadMacroRecord(*M, M->MacroOffsets[Index]);
}
return MacrosLoaded[ID];
@@ -6875,13 +6877,15 @@ void ASTReader::finishPendingActions() {
PendingDeclChains.clear();
// Load any pending macro definitions.
+ // Note that new macros may be added while deserializing a macro.
for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
- // FIXME: std::move here
- SmallVector<MacroID, 2> GlobalIDs = PendingMacroIDs.begin()[I].second;
- MacroInfo *Hint = 0;
- for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
- ++IDIdx) {
- Hint = getMacro(GlobalIDs[IDIdx], Hint);
+ PendingMacroIDsMap::iterator PMIt = PendingMacroIDs.begin() + I;
+ IdentifierInfo *II = PMIt->first;
+ SmallVector<serialization::MacroID, 2> MacroIDs;
+ MacroIDs.swap(PMIt->second);
+ for (SmallVectorImpl<serialization::MacroID>::iterator
+ MIt = MacroIDs.begin(), ME = MacroIDs.end(); MIt != ME; ++MIt) {
+ getMacro(*MIt);
}
}
PendingMacroIDs.clear();
OpenPOWER on IntegriCloud