diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-12-01 22:20:10 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-12-01 22:20:10 +0000 |
commit | ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0 (patch) | |
tree | a836f1b947d7804a2b4a593ccbed8d25e02a5c31 /lib/Serialization | |
parent | 403bc3f85f3b3461b73abdd9c632980bf95f34bd (diff) |
Implement name hiding for declarations deserialized from a non-visible
module. When that module becomes visible, so do those declarations.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@145640 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Serialization')
-rw-r--r-- | lib/Serialization/ASTReader.cpp | 21 | ||||
-rw-r--r-- | lib/Serialization/ASTReaderDecl.cpp | 31 | ||||
-rw-r--r-- | lib/Serialization/ASTWriter.cpp | 4 |
3 files changed, 51 insertions, 5 deletions
diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 258baebc05..a083e24e9e 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -2439,6 +2439,11 @@ ASTReader::ASTReadResult ASTReader::validateFileEntries(ModuleFile &M) { return Success; } +void ASTReader::makeNamesVisible(const HiddenNames &Names) { + for (unsigned I = 0, N = Names.size(); I != N; ++I) + Names[I]->ModulePrivate = false; +} + void ASTReader::makeModuleVisible(Module *Mod, Module::NameVisibilityKind NameVisibility) { llvm::SmallPtrSet<Module *, 4> Visited; @@ -2457,8 +2462,13 @@ void ASTReader::makeModuleVisible(Module *Mod, // Update the module's name visibility. Mod->NameVisibility = NameVisibility; - // FIXME: If we've already deserialized any names from this module, + // If we've already deserialized any names from this module, // mark them as visible. + HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); + if (Hidden != HiddenNamesMap.end()) { + makeNamesVisible(Hidden->second); + HiddenNamesMap.erase(Hidden); + } // Push any non-explicit submodules onto the stack to be marked as // visible. @@ -2776,6 +2786,15 @@ void ASTReader::InitializeContext() { } } +void ASTReader::finalizeForWriting() { + for (HiddenNamesMapType::iterator Hidden = HiddenNamesMap.begin(), + HiddenEnd = HiddenNamesMap.end(); + Hidden != HiddenEnd; ++Hidden) { + makeNamesVisible(Hidden->second); + } + HiddenNamesMap.clear(); +} + /// \brief Retrieve the name of the original source file name /// directly from the AST file, without actually loading the AST /// file. diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp index 397671f85e..85cd72840a 100644 --- a/lib/Serialization/ASTReaderDecl.cpp +++ b/lib/Serialization/ASTReaderDecl.cpp @@ -86,6 +86,14 @@ namespace clang { Reader.ReadDeclarationNameInfo(F, NameInfo, R, I); } + serialization::SubmoduleID readSubmoduleID(const RecordData &R, + unsigned &I) { + if (I >= R.size()) + return 0; + + return Reader.getGlobalSubmoduleID(F, R[I++]); + } + void ReadCXXDefinitionData(struct CXXRecordDecl::DefinitionData &Data, const RecordData &R, unsigned &I); @@ -253,10 +261,25 @@ void ASTDeclReader::VisitDecl(Decl *D) { D->setAccess((AccessSpecifier)Record[Idx++]); D->FromASTFile = true; D->ModulePrivate = Record[Idx++]; - - unsigned SubmoduleID = Record[Idx++]; - // FIXME: Actual use the submodule ID to determine visibility. - (void)SubmoduleID; + + // Determine whether this declaration is part of a (sub)module. If so, it + // may not yet be visible. + if (unsigned SubmoduleID = readSubmoduleID(Record, Idx)) { + // Module-private declarations are never visible, so there is no work to do. + if (!D->ModulePrivate) { + if (Module *Owner = Reader.getSubmodule(SubmoduleID)) { + if (Owner->NameVisibility != Module::AllVisible) { + // The owning module is not visible. Mark this declaration as + // module-private, + D->ModulePrivate = true; + + // Note that this declaration was hidden because its owning module is + // not yet visible. + Reader.HiddenNamesMap[Owner].push_back(D); + } + } + } + } } void ASTDeclReader::VisitTranslationUnitDecl(TranslationUnitDecl *TU) { diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index e37aa7320f..1b554ef3c4 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -2958,6 +2958,10 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls, Module *WritingModule) { using namespace llvm; + // Make sure that the AST reader knows to finalize itself. + if (Chain) + Chain->finalizeForWriting(); + ASTContext &Context = SemaRef.Context; Preprocessor &PP = SemaRef.PP; |