diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-04-23 20:40:50 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-04-23 20:40:50 +0000 |
commit | 713369b057bc6401e88abbc65cab1fc0a8f688e0 (patch) | |
tree | 1ff1bc32fe2a74cf60a317285bddb4407c2f57ba /clang/lib | |
parent | 07e2d283a39a3b2a25dd642643e74e62686b5720 (diff) | |
download | bcm5719-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.cpp | 19 | ||||
-rw-r--r-- | clang/lib/Lex/PPDirectives.cpp | 20 | ||||
-rw-r--r-- | clang/lib/Lex/PPMacroExpansion.cpp | 19 | ||||
-rw-r--r-- | clang/lib/Lex/Pragma.cpp | 6 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 100 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTWriter.cpp | 17 |
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. |