I've recently noticed that test/Modules/modules.timestamp started to appear in my source directory after running tests. Probably that was caused by some other change.
On Thu, Mar 19, 2015 at 4:09 PM, Richard Smith <[email protected]> wrote: > 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. > -- Alexey Samsonov [email protected]
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
