summaryrefslogtreecommitdiffstats
path: root/clang/lib/Serialization
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Serialization')
-rw-r--r--clang/lib/Serialization/ASTReader.cpp11
-rw-r--r--clang/lib/Serialization/ASTWriter.cpp3
2 files changed, 10 insertions, 4 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index da5a0e68e93..2ee4975a468 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -826,7 +826,7 @@ IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
uint32_t LocalMacroID =
endian::readNext<uint32_t, little, unaligned>(d);
DataLen -= 4;
- if (LocalMacroID == 0xdeadbeef) break;
+ if (LocalMacroID == (uint32_t)-1) break;
LocalMacroIDs.push_back(LocalMacroID);
}
}
@@ -1807,7 +1807,7 @@ struct ASTReader::ModuleMacroInfo {
};
ASTReader::ModuleMacroInfo *
-ASTReader::getModuleMacro(const PendingMacroInfo &PMInfo) {
+ASTReader::getModuleMacro(IdentifierInfo *II, const PendingMacroInfo &PMInfo) {
ModuleMacroInfo Info;
uint32_t ID = PMInfo.ModuleMacroData.MacID;
@@ -1815,6 +1815,11 @@ ASTReader::getModuleMacro(const PendingMacroInfo &PMInfo) {
// Macro undefinition.
Info.SubModID = getGlobalSubmoduleID(*PMInfo.M, ID >> 1);
Info.MI = nullptr;
+
+ // If we've already loaded the #undef of this macro from this module,
+ // don't do so again.
+ if (!LoadedUndefs.insert(std::make_pair(II, Info.SubModID)).second)
+ return nullptr;
} else {
// Macro definition.
GlobalMacroID GMacID = getGlobalMacroID(*PMInfo.M, ID >> 1);
@@ -1848,7 +1853,7 @@ void ASTReader::resolvePendingMacro(IdentifierInfo *II,
// Module Macro.
- ModuleMacroInfo *MMI = getModuleMacro(PMInfo);
+ ModuleMacroInfo *MMI = getModuleMacro(II, PMInfo);
if (!MMI)
return;
diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp
index 3f8db194d06..15e7de48c9b 100644
--- a/clang/lib/Serialization/ASTWriter.cpp
+++ b/clang/lib/Serialization/ASTWriter.cpp
@@ -3347,6 +3347,7 @@ public:
using namespace llvm::support;
endian::Writer<little> LE(Out);
+ assert((uint16_t)DataLen == DataLen && (uint16_t)KeyLen == KeyLen);
LE.write<uint16_t>(DataLen);
// We emit the key length after the data length so that every
// string is preceded by a 16-bit length. This matches the PTH
@@ -3425,7 +3426,7 @@ public:
}
emitMacroOverrides(Out, getOverriddenSubmodules(MD, Scratch));
}
- LE.write<uint32_t>(0xdeadbeef);
+ LE.write<uint32_t>((uint32_t)-1);
}
}
OpenPOWER on IntegriCloud