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.cpp100
1 files changed, 39 insertions, 61 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index 8b918326204..62fefed4107 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -1724,24 +1724,20 @@ void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
}
struct ASTReader::ModuleMacroInfo {
- SubmoduleID SubModID;
- MacroInfo *MI;
- ArrayRef<SubmoduleID> Overrides;
+ ModuleMacro *MM;
// FIXME: Remove this.
ModuleFile *F;
- bool isDefine() const { return MI; }
+ bool isDefine() const { return MM->getMacroInfo(); }
- SubmoduleID getSubmoduleID() const { return SubModID; }
-
- ArrayRef<SubmoduleID> getOverriddenSubmodules() const { return Overrides; }
+ ArrayRef<ModuleMacro *> getOverriddenMacros() const {
+ return MM->overrides();
+ }
MacroDirective *import(Preprocessor &PP, SourceLocation ImportLoc) const {
- if (!MI)
- return PP.AllocateUndefMacroDirective(ImportLoc, SubModID,
- getOverriddenSubmodules());
- return PP.AllocateDefMacroDirective(MI, ImportLoc, SubModID,
- getOverriddenSubmodules());
+ if (auto *MI = MM->getMacroInfo())
+ return PP.AllocateDefMacroDirective(MI, ImportLoc, MM);
+ return PP.AllocateUndefMacroDirective(ImportLoc, MM);
}
};
@@ -1753,7 +1749,12 @@ void ASTReader::resolvePendingMacro(IdentifierInfo *II,
SavedStreamPosition SavedPosition(Cursor);
Cursor.JumpToBit(PMInfo.MacroDirectivesOffset);
- llvm::SmallVector<ModuleMacroInfo, 8> ModuleMacros;
+ struct ModuleMacroRecord {
+ SubmoduleID SubModID;
+ MacroInfo *MI;
+ SmallVector<SubmoduleID, 8> Overrides;
+ };
+ llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros;
// We expect to see a sequence of PP_MODULE_MACRO records listing exported
// macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete
@@ -1773,20 +1774,12 @@ void ASTReader::resolvePendingMacro(IdentifierInfo *II,
break;
case PP_MODULE_MACRO: {
- ModuleMacroInfo Info;
+ ModuleMacros.push_back(ModuleMacroRecord());
+ auto &Info = ModuleMacros.back();
Info.SubModID = getGlobalSubmoduleID(M, Record[0]);
Info.MI = getMacro(getGlobalMacroID(M, Record[1]));
- Info.F = &M;
-
- if (Record.size() > 2) {
- auto *Overrides = new (Context) SubmoduleID[Record.size() - 2];
- for (int I = 2, N = Record.size(); I != N; ++I)
- Overrides[I - 2] = getGlobalSubmoduleID(M, Record[I]);
- Info.Overrides =
- llvm::makeArrayRef(Overrides, Overrides + Record.size() - 2);
- }
-
- ModuleMacros.push_back(Info);
+ for (int I = 2, N = Record.size(); I != N; ++I)
+ Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I]));
continue;
}
@@ -1804,9 +1797,9 @@ void ASTReader::resolvePendingMacro(IdentifierInfo *II,
{
std::reverse(ModuleMacros.begin(), ModuleMacros.end());
llvm::SmallVector<ModuleMacro*, 8> Overrides;
- for (auto &MMI : ModuleMacros) {
+ for (auto &MMR : ModuleMacros) {
Overrides.clear();
- for (unsigned ModID : MMI.Overrides) {
+ for (unsigned ModID : MMR.Overrides) {
Module *Mod = getSubmodule(ModID);
auto *Macro = PP.getModuleMacro(Mod, II);
assert(Macro && "missing definition for overridden macro");
@@ -1814,11 +1807,12 @@ void ASTReader::resolvePendingMacro(IdentifierInfo *II,
}
bool Inserted = false;
- Module *Owner = getSubmodule(MMI.getSubmoduleID());
- PP.addModuleMacro(Owner, II, MMI.MI, Overrides, Inserted);
+ Module *Owner = getSubmodule(MMR.SubModID);
+ auto *MM = PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
if (!Inserted)
continue;
+ ModuleMacroInfo MMI = { MM, &M };
if (Owner->NameVisibility == Module::Hidden) {
// Macros in the owning module are hidden. Just remember this macro to
// install if we make this module visible.
@@ -1844,35 +1838,21 @@ void ASTReader::resolvePendingMacro(IdentifierInfo *II,
MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
switch (K) {
case MacroDirective::MD_Define: {
- GlobalMacroID GMacID = getGlobalMacroID(M, Record[Idx++]);
- MacroInfo *MI = getMacro(GMacID);
- SubmoduleID ImportedFrom = getGlobalSubmoduleID(M, Record[Idx++]);
+ MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++]));
bool IsAmbiguous = Record[Idx++];
- llvm::SmallVector<unsigned, 4> Overrides;
- if (ImportedFrom) {
- Overrides.insert(Overrides.end(),
- &Record[Idx] + 1, &Record[Idx] + 1 + Record[Idx]);
- for (auto &ID : Overrides)
- ID = getGlobalSubmoduleID(M, ID);
- Idx += Overrides.size() + 1;
- }
- DefMacroDirective *DefMD =
- PP.AllocateDefMacroDirective(MI, Loc, ImportedFrom, Overrides);
+ ModuleMacro *MM = nullptr;
+ if (SubmoduleID ImportedFrom = getGlobalSubmoduleID(M, Record[Idx++]))
+ MM = PP.getModuleMacro(getSubmodule(ImportedFrom), II);
+ DefMacroDirective *DefMD = PP.AllocateDefMacroDirective(MI, Loc, MM);
DefMD->setAmbiguous(IsAmbiguous);
MD = DefMD;
break;
}
case MacroDirective::MD_Undefine: {
- SubmoduleID ImportedFrom = getGlobalSubmoduleID(M, Record[Idx++]);
- llvm::SmallVector<unsigned, 4> Overrides;
- if (ImportedFrom) {
- Overrides.insert(Overrides.end(),
- &Record[Idx] + 1, &Record[Idx] + 1 + Record[Idx]);
- for (auto &ID : Overrides)
- ID = getGlobalSubmoduleID(M, ID);
- Idx += Overrides.size() + 1;
- }
- MD = PP.AllocateUndefMacroDirective(Loc, ImportedFrom, Overrides);
+ ModuleMacro *MM = nullptr;
+ if (SubmoduleID ImportedFrom = getGlobalSubmoduleID(M, Record[Idx++]))
+ MM = PP.getModuleMacro(getSubmodule(ImportedFrom), II);
+ MD = PP.AllocateUndefMacroDirective(Loc, MM);
break;
}
case MacroDirective::MD_Visibility:
@@ -1912,13 +1892,11 @@ static bool areDefinedInSystemModules(MacroInfo *PrevMI, MacroInfo *NewMI,
void ASTReader::removeOverriddenMacros(IdentifierInfo *II,
SourceLocation ImportLoc,
AmbiguousMacros &Ambig,
- ArrayRef<SubmoduleID> Overrides) {
- for (unsigned OI = 0, ON = Overrides.size(); OI != ON; ++OI) {
- SubmoduleID OwnerID = Overrides[OI];
-
+ ArrayRef<ModuleMacro *> Overrides) {
+ for (ModuleMacro *Overridden : Overrides) {
+ Module *Owner = Overridden->getOwningModule();
// If this macro is not yet visible, remove it from the hidden names list.
// It won't be there if we're in the middle of making the owner visible.
- Module *Owner = getSubmodule(OwnerID);
auto HiddenIt = HiddenNamesMap.find(Owner);
if (HiddenIt != HiddenNamesMap.end()) {
HiddenNames &Hidden = HiddenIt->second;
@@ -1927,7 +1905,7 @@ void ASTReader::removeOverriddenMacros(IdentifierInfo *II,
// Register the macro now so we don't lose it when we re-export.
PP.appendMacroDirective(II, HI->second->import(PP, ImportLoc));
- auto SubOverrides = HI->second->getOverriddenSubmodules();
+ auto SubOverrides = HI->second->getOverriddenMacros();
Hidden.HiddenMacros.erase(HI);
removeOverriddenMacros(II, ImportLoc, Ambig, SubOverrides);
}
@@ -1936,7 +1914,7 @@ void ASTReader::removeOverriddenMacros(IdentifierInfo *II,
// If this macro is already in our list of conflicts, remove it from there.
Ambig.erase(
std::remove_if(Ambig.begin(), Ambig.end(), [&](DefMacroDirective *MD) {
- return MD->getInfo()->getOwningModuleID() == OwnerID;
+ return getSubmodule(MD->getInfo()->getOwningModuleID()) == Owner;
}),
Ambig.end());
}
@@ -1945,7 +1923,7 @@ void ASTReader::removeOverriddenMacros(IdentifierInfo *II,
ASTReader::AmbiguousMacros *
ASTReader::removeOverriddenMacros(IdentifierInfo *II,
SourceLocation ImportLoc,
- ArrayRef<SubmoduleID> Overrides) {
+ ArrayRef<ModuleMacro *> Overrides) {
MacroDirective *Prev = PP.getMacroDirective(II);
if (!Prev && Overrides.empty())
return nullptr;
@@ -1997,7 +1975,7 @@ void ASTReader::installImportedMacro(IdentifierInfo *II, ModuleMacroInfo &MMI,
}
AmbiguousMacros *Prev =
- removeOverriddenMacros(II, ImportLoc, MMI.getOverriddenSubmodules());
+ removeOverriddenMacros(II, ImportLoc, MMI.getOverriddenMacros());
// Create a synthetic macro definition corresponding to the import (or null
// if this was an undefinition of the macro).
OpenPOWER on IntegriCloud