r232583 - Make module files passed to a module build via -fmodule-file= available to
Alexey Samsonov
vonosmas at gmail.com
Thu Mar 19 16:12:22 PDT 2015
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 <richard at metafoo.co.uk>
wrote:
> On Thu, Mar 19, 2015 at 1:37 PM, Alexey Samsonov <vonosmas at gmail.com>
> wrote:
>
>>
>> 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?
>>
>
> 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
vonosmas at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150319/c10c238a/attachment.html>
More information about the cfe-commits
mailing list