summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2015-04-23 20:40:50 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2015-04-23 20:40:50 +0000
commit713369b057bc6401e88abbc65cab1fc0a8f688e0 (patch)
tree1ff1bc32fe2a74cf60a317285bddb4407c2f57ba /clang/lib
parent07e2d283a39a3b2a25dd642643e74e62686b5720 (diff)
downloadbcm5719-llvm-713369b057bc6401e88abbc65cab1fc0a8f688e0.tar.gz
bcm5719-llvm-713369b057bc6401e88abbc65cab1fc0a8f688e0.zip
[modules] Store a ModuleMacro* on an imported macro directive rather than duplicating the info within it.
llvm-svn: 235644
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Lex/MacroInfo.cpp19
-rw-r--r--clang/lib/Lex/PPDirectives.cpp20
-rw-r--r--clang/lib/Lex/PPMacroExpansion.cpp19
-rw-r--r--clang/lib/Lex/Pragma.cpp6
-rw-r--r--clang/lib/Serialization/ASTReader.cpp100
-rw-r--r--clang/lib/Serialization/ASTWriter.cpp17
6 files changed, 81 insertions, 100 deletions
diff --git a/clang/lib/Lex/MacroInfo.cpp b/clang/lib/Lex/MacroInfo.cpp
index d7f483192f1..dbc804490b2 100644
--- a/clang/lib/Lex/MacroInfo.cpp
+++ b/clang/lib/Lex/MacroInfo.cpp
@@ -235,6 +235,25 @@ void MacroDirective::dump() const {
Out << "\n";
}
+DefMacroDirective *
+DefMacroDirective::createImported(Preprocessor &PP, MacroInfo *MI,
+ SourceLocation Loc,
+ ModuleMacro *ImportedFrom) {
+ void *Mem = PP.getPreprocessorAllocator().Allocate(
+ sizeof(DefMacroDirective) + sizeof(MacroDirective::ImportData),
+ llvm::alignOf<DefMacroDirective>());
+ return new (Mem) DefMacroDirective(MI, Loc, ImportedFrom);
+}
+
+UndefMacroDirective *
+UndefMacroDirective::createImported(Preprocessor &PP, SourceLocation Loc,
+ ModuleMacro *ImportedFrom) {
+ void *Mem = PP.getPreprocessorAllocator().Allocate(
+ sizeof(UndefMacroDirective) + sizeof(MacroDirective::ImportData),
+ llvm::alignOf<UndefMacroDirective>());
+ return new (Mem) UndefMacroDirective(Loc, ImportedFrom);
+}
+
ModuleMacro *ModuleMacro::create(Preprocessor &PP, Module *OwningModule,
IdentifierInfo *II, MacroInfo *Macro,
ArrayRef<ModuleMacro *> Overrides) {
diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp
index c22b0592218..4f3efa526c4 100644
--- a/clang/lib/Lex/PPDirectives.cpp
+++ b/clang/lib/Lex/PPDirectives.cpp
@@ -64,24 +64,16 @@ MacroInfo *Preprocessor::AllocateDeserializedMacroInfo(SourceLocation L,
DefMacroDirective *
Preprocessor::AllocateDefMacroDirective(MacroInfo *MI, SourceLocation Loc,
- unsigned ImportedFromModuleID,
- ArrayRef<unsigned> Overrides) {
- unsigned NumExtra = (ImportedFromModuleID ? 1 : 0) + Overrides.size();
- return new (BP.Allocate(sizeof(DefMacroDirective) +
- sizeof(unsigned) * NumExtra,
- llvm::alignOf<DefMacroDirective>()))
- DefMacroDirective(MI, Loc, ImportedFromModuleID, Overrides);
+ ModuleMacro *MM) {
+ if (MM) return DefMacroDirective::createImported(*this, MI, Loc, MM);
+ return new (BP) DefMacroDirective(MI, Loc);
}
UndefMacroDirective *
Preprocessor::AllocateUndefMacroDirective(SourceLocation UndefLoc,
- unsigned ImportedFromModuleID,
- ArrayRef<unsigned> Overrides) {
- unsigned NumExtra = (ImportedFromModuleID ? 1 : 0) + Overrides.size();
- return new (BP.Allocate(sizeof(UndefMacroDirective) +
- sizeof(unsigned) * NumExtra,
- llvm::alignOf<UndefMacroDirective>()))
- UndefMacroDirective(UndefLoc, ImportedFromModuleID, Overrides);
+ ModuleMacro *MM) {
+ if (MM) return UndefMacroDirective::createImported(*this, UndefLoc, MM);
+ return new (BP) UndefMacroDirective(UndefLoc);
}
VisibilityMacroDirective *
diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp
index 883f2d5ff3b..54f72f64628 100644
--- a/clang/lib/Lex/PPMacroExpansion.cpp
+++ b/clang/lib/Lex/PPMacroExpansion.cpp
@@ -65,21 +65,18 @@ void Preprocessor::appendMacroDirective(IdentifierInfo *II, MacroDirective *MD){
return;
for (auto *PrevMD = OldMD; PrevMD; PrevMD = PrevMD->getPrevious()) {
- // FIXME: Store a ModuleMacro * on an imported directive.
Module *DirectiveMod = getModuleForLocation(PrevMD->getLocation());
- Module *PrevOwningMod =
- PrevMD->isImported()
- ? getExternalSource()->getModule(PrevMD->getOwningModuleID())
- : DirectiveMod;
- auto *MM = getModuleMacro(PrevOwningMod, II);
- if (!MM) {
+ if (ModuleMacro *PrevMM = PrevMD->getOwningModuleMacro())
+ StoredMD.addOverriddenMacro(*this, PrevMM);
+ else if (ModuleMacro *PrevMM = getModuleMacro(DirectiveMod, II))
+ // The previous macro was from another submodule that we #included.
+ // FIXME: Create an import directive when importing a macro from a local
+ // submodule.
+ StoredMD.addOverriddenMacro(*this, PrevMM);
+ else
// We're still within the module defining the previous macro. We don't
// override it.
- assert(!PrevMD->isImported() &&
- "imported macro with no corresponding ModuleMacro");
break;
- }
- StoredMD.addOverriddenMacro(*this, MM);
// Stop once we leave the original macro's submodule.
//
diff --git a/clang/lib/Lex/Pragma.cpp b/clang/lib/Lex/Pragma.cpp
index bfac3fda297..5625842145a 100644
--- a/clang/lib/Lex/Pragma.cpp
+++ b/clang/lib/Lex/Pragma.cpp
@@ -600,11 +600,9 @@ void Preprocessor::HandlePragmaPopMacro(Token &PopMacroTok) {
// Get the MacroInfo we want to reinstall.
MacroInfo *MacroToReInstall = iter->second.back();
- if (MacroToReInstall) {
+ if (MacroToReInstall)
// Reinstall the previously pushed macro.
- appendDefMacroDirective(IdentInfo, MacroToReInstall, MessageLoc,
- /*isImported=*/false, /*Overrides*/None);
- }
+ appendDefMacroDirective(IdentInfo, MacroToReInstall, MessageLoc);
// Pop PragmaPushMacroInfo stack.
iter->second.pop_back();
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).
diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp
index 59191f22e84..9714893418e 100644
--- a/clang/lib/Serialization/ASTWriter.cpp
+++ b/clang/lib/Serialization/ASTWriter.cpp
@@ -2068,20 +2068,17 @@ void ASTWriter::WritePreprocessor(const Preprocessor &PP, bool IsModule) {
if (auto *DefMD = dyn_cast<DefMacroDirective>(MD)) {
MacroID InfoID = getMacroRef(DefMD->getInfo(), Name);
Record.push_back(InfoID);
- Record.push_back(DefMD->getOwningModuleID());
Record.push_back(DefMD->isAmbiguous());
- } else if (auto *UndefMD = dyn_cast<UndefMacroDirective>(MD)) {
- Record.push_back(UndefMD->getOwningModuleID());
- } else {
- auto *VisMD = cast<VisibilityMacroDirective>(MD);
+ } else if (auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {
Record.push_back(VisMD->isPublic());
+ // No owning module macro.
+ continue;
}
- if (MD->isImported()) {
- auto Overrides = MD->getOverriddenModules();
- Record.push_back(Overrides.size());
- Record.append(Overrides.begin(), Overrides.end());
- }
+ if (auto *MM = MD->getOwningModuleMacro())
+ Record.push_back(getSubmoduleID(MM->getOwningModule()));
+ else
+ Record.push_back(0);
}
// Write out any exported module macros.
OpenPOWER on IntegriCloud