/// been loaded.
std::vector<MacroInfo *> MacrosLoaded;
+ typedef std::pair<IdentifierInfo *, serialization::SubmoduleID>
+ LoadedMacroInfo;
+
+ /// \brief A set of #undef directives that we have loaded; used to
+ /// deduplicate the same #undef information coming from multiple module
+ /// files.
+ llvm::DenseSet<LoadedMacroInfo> LoadedUndefs;
+
typedef ContinuousRangeMap<serialization::MacroID, ModuleFile *, 4>
GlobalMacroMapType;
serialization::IdentifierID getGlobalIdentifierID(ModuleFile &M,
unsigned LocalID);
- ModuleMacroInfo *getModuleMacro(const PendingMacroInfo &PMInfo);
+ ModuleMacroInfo *getModuleMacro(IdentifierInfo *II,
+ const PendingMacroInfo &PMInfo);
void resolvePendingMacro(IdentifierInfo *II, const PendingMacroInfo &PMInfo);
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);
}
}
};
ASTReader::ModuleMacroInfo *
-ASTReader::getModuleMacro(const PendingMacroInfo &PMInfo) {
+ASTReader::getModuleMacro(IdentifierInfo *II, const PendingMacroInfo &PMInfo) {
ModuleMacroInfo Info;
uint32_t ID = PMInfo.ModuleMacroData.MacID;
// 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);
// Module Macro.
- ModuleMacroInfo *MMI = getModuleMacro(PMInfo);
+ ModuleMacroInfo *MMI = getModuleMacro(II, PMInfo);
if (!MMI)
return;
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
}
emitMacroOverrides(Out, getOverriddenSubmodules(MD, Scratch));
}
- LE.write<uint32_t>(0xdeadbeef);
+ LE.write<uint32_t>((uint32_t)-1);
}
}