r232583 - Make module files passed to a module build via -fmodule-file= available to
Alexey Samsonov
vonosmas at gmail.com
Thu Mar 19 13:37:40 PDT 2015
On Tue, Mar 17, 2015 at 6:42 PM, Richard Smith <richard-llvm at metafoo.co.uk>
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?
> +
> #if HAVE_A
> #include "a.h"
> static_assert(a == 1, "");
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
--
Alexey Samsonov
vonosmas at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150319/e5bba748/attachment.html>
More information about the cfe-commits
mailing list