On Thu, Mar 19, 2015 at 1:37 PM, Alexey Samsonov <[email protected]> wrote:
> > On Tue, Mar 17, 2015 at 6:42 PM, Richard Smith <[email protected] > > wrote: > >> Author: rsmith >> Date: Tue Mar 17 20:42:29 2015 >> New Revision: 232583 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=232583&view=rev >> Log: >> Make module files passed to a module build via -fmodule-file= available to >> consumers of that module. >> >> Previously, such a file would only be available if the module happened to >> actually import something from that module. >> >> Added: >> cfe/trunk/test/Modules/Inputs/explicit-build/d.h >> Modified: >> cfe/trunk/include/clang/Serialization/ASTBitCodes.h >> cfe/trunk/include/clang/Serialization/ModuleManager.h >> cfe/trunk/lib/Frontend/CompilerInstance.cpp >> cfe/trunk/lib/Serialization/ASTReader.cpp >> cfe/trunk/lib/Serialization/ASTWriter.cpp >> cfe/trunk/lib/Serialization/ModuleManager.cpp >> cfe/trunk/test/Modules/Inputs/explicit-build/module.modulemap >> cfe/trunk/test/Modules/explicit-build.cpp >> >> Modified: cfe/trunk/include/clang/Serialization/ASTBitCodes.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=232583&r1=232582&r2=232583&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Serialization/ASTBitCodes.h (original) >> +++ cfe/trunk/include/clang/Serialization/ASTBitCodes.h Tue Mar 17 >> 20:42:29 2015 >> @@ -295,6 +295,10 @@ namespace clang { >> >> /// \brief Record code for the module build directory. >> MODULE_DIRECTORY = 16, >> + >> + /// \brief Record code for the list of other AST files made >> available by >> + /// this AST file but not actually used by it. >> + KNOWN_MODULE_FILES = 17, >> }; >> >> /// \brief Record types that occur within the input-files block >> >> Modified: cfe/trunk/include/clang/Serialization/ModuleManager.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ModuleManager.h?rev=232583&r1=232582&r2=232583&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Serialization/ModuleManager.h (original) >> +++ cfe/trunk/include/clang/Serialization/ModuleManager.h Tue Mar 17 >> 20:42:29 2015 >> @@ -35,7 +35,13 @@ class ModuleManager { >> >> /// \brief All loaded modules, indexed by name. >> llvm::DenseMap<const FileEntry *, ModuleFile *> Modules; >> - >> + >> + typedef llvm::SetVector<const FileEntry *> >> AdditionalKnownModuleFileSet; >> + >> + /// \brief Additional module files that are known but not loaded. >> Tracked >> + /// here so that we can re-export them if necessary. >> + AdditionalKnownModuleFileSet AdditionalKnownModuleFiles; >> + >> /// \brief FileManager that handles translating between filenames and >> /// FileEntry *. >> FileManager &FileMgr; >> @@ -219,6 +225,19 @@ public: >> /// has been "accepted", and will not (can not) be unloaded. >> void moduleFileAccepted(ModuleFile *MF); >> >> + /// \brief Notification from the frontend that the given module file is >> + /// part of this compilation (even if not imported) and, if this >> compilation >> + /// is exported, should be made available to importers of it. >> + bool addKnownModuleFile(StringRef FileName); >> + >> + /// \brief Get a list of additional module files that are not currently >> + /// loaded but are considered to be part of the current compilation. >> + llvm::iterator_range<AdditionalKnownModuleFileSet::const_iterator> >> + getAdditionalKnownModuleFiles() { >> + return llvm::make_range(AdditionalKnownModuleFiles.begin(), >> + AdditionalKnownModuleFiles.end()); >> + } >> + >> /// \brief Visit each of the modules. >> /// >> /// This routine visits each of the modules, starting with the >> >> Modified: cfe/trunk/lib/Frontend/CompilerInstance.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInstance.cpp?rev=232583&r1=232582&r2=232583&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Frontend/CompilerInstance.cpp (original) >> +++ cfe/trunk/lib/Frontend/CompilerInstance.cpp Tue Mar 17 20:42:29 2015 >> @@ -1331,6 +1331,19 @@ bool CompilerInstance::loadModuleFile(St >> } >> } RMN(*this); >> >> + // If we don't already have an ASTReader, create one now. >> + if (!ModuleManager) >> + createModuleManager(); >> + >> + // Tell the module manager about this module file. >> + if >> (getModuleManager()->getModuleManager().addKnownModuleFile(FileName)) { >> + getDiagnostics().Report(SourceLocation(), >> diag::err_module_file_not_found) >> + << FileName; >> + return false; >> + } >> + >> + // Build our mapping of module names to module files from this file >> + // and its imports. >> RMN.visitImport(FileName); >> >> if (RMN.Failed) >> >> Modified: cfe/trunk/lib/Serialization/ASTReader.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=232583&r1=232582&r2=232583&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Serialization/ASTReader.cpp (original) >> +++ cfe/trunk/lib/Serialization/ASTReader.cpp Tue Mar 17 20:42:29 2015 >> @@ -2462,6 +2462,9 @@ ASTReader::ReadControlBlock(ModuleFile & >> break; >> } >> >> + case KNOWN_MODULE_FILES: >> + break; >> + >> case LANGUAGE_OPTIONS: { >> bool Complain = (ClientLoadCapabilities & >> ARR_ConfigurationMismatch) == 0; >> // FIXME: The &F == *ModuleMgr.begin() check is wrong for modules. >> @@ -4248,6 +4251,8 @@ bool ASTReader::readASTFileControlBlock( >> FileManager &FileMgr, >> ASTReaderListener &Listener) { >> // Open the AST file. >> + // FIXME: This allows use of the VFS; we do not allow use of the >> + // VFS when actually loading a module. >> auto Buffer = FileMgr.getBufferForFile(Filename); >> if (!Buffer) { >> return true; >> @@ -4418,6 +4423,20 @@ bool ASTReader::readASTFileControlBlock( >> break; >> } >> >> + case KNOWN_MODULE_FILES: { >> + // Known-but-not-technically-used module files are treated as >> imports. >> + if (!NeedsImports) >> + break; >> + >> + unsigned Idx = 0, N = Record.size(); >> + while (Idx < N) { >> + std::string Filename = ReadString(Record, Idx); >> + ResolveImportedPath(Filename, ModuleDir); >> + Listener.visitImport(Filename); >> + } >> + break; >> + } >> + >> default: >> // No other validation to perform. >> break; >> @@ -6842,6 +6861,9 @@ void ASTReader::StartTranslationUnit(AST >> EagerlyDeserializedDecls.clear(); >> >> PassInterestingDeclsToConsumer(); >> + >> + if (DeserializationListener) >> + DeserializationListener->ReaderInitialized(this); >> } >> >> void ASTReader::PrintStats() { >> >> Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=232583&r1=232582&r2=232583&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original) >> +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Tue Mar 17 20:42:29 2015 >> @@ -867,6 +867,7 @@ void ASTWriter::WriteBlockInfoBlock() { >> RECORD(MODULE_NAME); >> RECORD(MODULE_MAP_FILE); >> RECORD(IMPORTS); >> + RECORD(KNOWN_MODULE_FILES); >> RECORD(LANGUAGE_OPTIONS); >> RECORD(TARGET_OPTIONS); >> RECORD(ORIGINAL_FILE); >> @@ -1222,20 +1223,28 @@ void ASTWriter::WriteControlBlock(Prepro >> serialization::ModuleManager &Mgr = Chain->getModuleManager(); >> Record.clear(); >> >> - for (ModuleManager::ModuleIterator M = Mgr.begin(), MEnd = Mgr.end(); >> - M != MEnd; ++M) { >> + for (auto *M : Mgr) { >> // Skip modules that weren't directly imported. >> - if (!(*M)->isDirectlyImported()) >> + if (!M->isDirectlyImported()) >> continue; >> >> - Record.push_back((unsigned)(*M)->Kind); // FIXME: Stable encoding >> - AddSourceLocation((*M)->ImportLoc, Record); >> - Record.push_back((*M)->File->getSize()); >> - Record.push_back((*M)->File->getModificationTime()); >> - Record.push_back((*M)->Signature); >> - AddPath((*M)->FileName, Record); >> + Record.push_back((unsigned)M->Kind); // FIXME: Stable encoding >> + AddSourceLocation(M->ImportLoc, Record); >> + Record.push_back(M->File->getSize()); >> + Record.push_back(M->File->getModificationTime()); >> + Record.push_back(M->Signature); >> + AddPath(M->FileName, Record); >> } >> Stream.EmitRecord(IMPORTS, Record); >> + >> + // Also emit a list of known module files that were not imported, >> + // but are made available by this module. >> + // FIXME: Should we also include a signature here? >> + Record.clear(); >> + for (auto *E : Mgr.getAdditionalKnownModuleFiles()) >> + AddPath(E->getName(), Record); >> + if (!Record.empty()) >> + Stream.EmitRecord(KNOWN_MODULE_FILES, Record); >> } >> >> // Language options. >> @@ -5655,6 +5664,8 @@ void ASTWriter::ReaderInitialized(ASTRea >> >> Chain = Reader; >> >> + // Note, this will get called multiple times, once one the reader >> starts up >> + // and again each time it's done reading a PCH or module. >> FirstDeclID = NUM_PREDEF_DECL_IDS + Chain->getTotalNumDecls(); >> FirstTypeID = NUM_PREDEF_TYPE_IDS + Chain->getTotalNumTypes(); >> FirstIdentID = NUM_PREDEF_IDENT_IDS + Chain->getTotalNumIdentifiers(); >> >> Modified: cfe/trunk/lib/Serialization/ModuleManager.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ModuleManager.cpp?rev=232583&r1=232582&r2=232583&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Serialization/ModuleManager.cpp (original) >> +++ cfe/trunk/lib/Serialization/ModuleManager.cpp Tue Mar 17 20:42:29 2015 >> @@ -227,6 +227,15 @@ ModuleManager::addInMemoryBuffer(StringR >> InMemoryBuffers[Entry] = std::move(Buffer); >> } >> >> +bool ModuleManager::addKnownModuleFile(StringRef FileName) { >> + const FileEntry *File; >> + if (lookupModuleFile(FileName, 0, 0, File)) >> + return true; >> + if (!Modules.count(File)) >> + AdditionalKnownModuleFiles.insert(File); >> + return false; >> +} >> + >> ModuleManager::VisitState *ModuleManager::allocateVisitState() { >> // Fast path: if we have a cached state, use it. >> if (FirstVisitState) { >> @@ -263,6 +272,8 @@ void ModuleManager::setGlobalIndex(Globa >> } >> >> void ModuleManager::moduleFileAccepted(ModuleFile *MF) { >> + AdditionalKnownModuleFiles.remove(MF->File); >> + >> if (!GlobalIndex || GlobalIndex->loadedModuleFile(MF)) >> return; >> >> >> Added: cfe/trunk/test/Modules/Inputs/explicit-build/d.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/explicit-build/d.h?rev=232583&view=auto >> >> ============================================================================== >> (empty) >> >> Modified: cfe/trunk/test/Modules/Inputs/explicit-build/module.modulemap >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/explicit-build/module.modulemap?rev=232583&r1=232582&r2=232583&view=diff >> >> ============================================================================== >> --- cfe/trunk/test/Modules/Inputs/explicit-build/module.modulemap >> (original) >> +++ cfe/trunk/test/Modules/Inputs/explicit-build/module.modulemap Tue Mar >> 17 20:42:29 2015 >> @@ -1,3 +1,4 @@ >> module a { header "a.h" } >> module b { header "b.h" export * } >> module c { header "c.h" export * } >> +module d { header "d.h" } >> >> Modified: cfe/trunk/test/Modules/explicit-build.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/explicit-build.cpp?rev=232583&r1=232582&r2=232583&view=diff >> >> ============================================================================== >> --- cfe/trunk/test/Modules/explicit-build.cpp (original) >> +++ cfe/trunk/test/Modules/explicit-build.cpp Tue Mar 17 20:42:29 2015 >> @@ -64,6 +64,19 @@ >> // RUN: -fmodule-file=%t/c.pcm \ >> // RUN: -verify %s -DHAVE_A -DHAVE_B -DHAVE_C >> >> +// ------------------------------- >> +// Check that -fmodule-file= in a module build makes the file >> transitively >> +// available even if it's not used. >> +// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fno-implicit-modules >> -Rmodule-build -fno-modules-error-recovery \ >> +// RUN: -fmodule-file=%t/b.pcm \ >> +// RUN: -fmodule-name=d -emit-module >> %S/Inputs/explicit-build/module.modulemap -o %t/d.pcm \ >> +// RUN: 2>&1 | FileCheck >> --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty >> +// >> +// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fno-implicit-modules >> -Rmodule-build -fno-modules-error-recovery \ >> +// RUN: -I%S/Inputs/explicit-build \ >> +// RUN: -fmodule-file=%t/d.pcm \ >> +// RUN: -verify %s -DHAVE_A -DHAVE_B >> > > ^^ > Do you need to add -fmodules-cache-path=%t to this invocation? > That should not be necessary, because -fno-implicit-modules should disable all use of the module cache. If it doesn't do so, that'd be interesting to know and it would be a bug.
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
