r304346 - [modules] When compiling a preprocessed module map, look for headers relative
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 1 13:11:26 PDT 2017
On 1 June 2017 at 12:53, Richard Smith <richard at metafoo.co.uk> wrote:
> On 1 June 2017 at 11:10, Galina Kistanova <gkistanova at gmail.com> wrote:
>
>> Hello Richard,
>>
>> This commit broke tests on few of our builders:
>>
>> Failing Tests (2):
>> Clang :: Modules/preprocess-module.cpp
>> Clang :: Modules/preprocess-nested.cpp
>>
>> http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei
>> -ps4-windows10pro-fast/builds/10199
>> and
>> http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensiv
>> e-checks-win/builds/2819
>>
>> Please have a look at this?
>>
>
> Sure, looking.
>
Should be fixed in r304464.
> Also I see that email notifications on these failures were sent.
>>
>
> They certainly did not arrive here. As I've mentioned before, I have not
> received any mail from any lab.llvm.org bots since early March.
>
>
>> Thanks
>>
>> Galina
>>
>>
>> On Wed, May 31, 2017 at 1:56 PM, Richard Smith via cfe-commits <
>> cfe-commits at lists.llvm.org> wrote:
>>
>>> Author: rsmith
>>> Date: Wed May 31 15:56:55 2017
>>> New Revision: 304346
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=304346&view=rev
>>> Log:
>>> [modules] When compiling a preprocessed module map, look for headers
>>> relative
>>> to the original module map.
>>>
>>> Also use the path and name of the original module map when emitting that
>>> information into the .pcm file. The upshot of this is that the produced
>>> .pcm
>>> file will track information for headers in their original locations
>>> (where the
>>> module was preprocessed), not relative to whatever directory the
>>> preprocessed
>>> module map was in when it was built.
>>>
>>> Modified:
>>> cfe/trunk/include/clang/Basic/Module.h
>>> cfe/trunk/include/clang/Lex/HeaderSearch.h
>>> cfe/trunk/lib/Frontend/FrontendAction.cpp
>>> cfe/trunk/lib/Lex/HeaderSearch.cpp
>>> cfe/trunk/lib/Serialization/ASTWriter.cpp
>>> cfe/trunk/test/Modules/preprocess-module.cpp
>>> cfe/trunk/test/Modules/preprocess-nested.cpp
>>>
>>> Modified: cfe/trunk/include/clang/Basic/Module.h
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/
>>> Basic/Module.h?rev=304346&r1=304345&r2=304346&view=diff
>>> ============================================================
>>> ==================
>>> --- cfe/trunk/include/clang/Basic/Module.h (original)
>>> +++ cfe/trunk/include/clang/Basic/Module.h Wed May 31 15:56:55 2017
>>> @@ -83,6 +83,10 @@ public:
>>> /// are found.
>>> const DirectoryEntry *Directory;
>>>
>>> + /// \brief The presumed file name for the module map defining this
>>> module.
>>> + /// Only non-empty when building from preprocessed source.
>>> + std::string PresumedModuleMapFile;
>>> +
>>> /// \brief The umbrella header or directory.
>>> llvm::PointerUnion<const DirectoryEntry *, const FileEntry *>
>>> Umbrella;
>>>
>>>
>>> Modified: cfe/trunk/include/clang/Lex/HeaderSearch.h
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/
>>> Lex/HeaderSearch.h?rev=304346&r1=304345&r2=304346&view=diff
>>> ============================================================
>>> ==================
>>> --- cfe/trunk/include/clang/Lex/HeaderSearch.h (original)
>>> +++ cfe/trunk/include/clang/Lex/HeaderSearch.h Wed May 31 15:56:55 2017
>>> @@ -543,10 +543,13 @@ public:
>>> /// \param Offset [inout] An offset within ID to start parsing. On
>>> exit,
>>> /// filled by the end of the parsed contents (either EOF or the
>>> /// location of an end-of-module-map pragma).
>>> - ///
>>> + /// \param OriginalModuleMapFile The original path to the module map
>>> file,
>>> + /// used to resolve paths within the module (this is required
>>> when
>>> + /// building the module from preprocessed source).
>>> /// \returns true if an error occurred, false otherwise.
>>> bool loadModuleMapFile(const FileEntry *File, bool IsSystem,
>>> - FileID ID = FileID(), unsigned *Offset =
>>> nullptr);
>>> + FileID ID = FileID(), unsigned *Offset =
>>> nullptr,
>>> + StringRef OriginalModuleMapFile = StringRef());
>>>
>>> /// \brief Collect the set of all known, top-level modules.
>>> ///
>>>
>>> Modified: cfe/trunk/lib/Frontend/FrontendAction.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/F
>>> rontendAction.cpp?rev=304346&r1=304345&r2=304346&view=diff
>>> ============================================================
>>> ==================
>>> --- cfe/trunk/lib/Frontend/FrontendAction.cpp (original)
>>> +++ cfe/trunk/lib/Frontend/FrontendAction.cpp Wed May 31 15:56:55 2017
>>> @@ -373,10 +373,11 @@ collectModuleHeaderIncludes(const LangOp
>>> return std::error_code();
>>> }
>>>
>>> -static bool
>>> -loadModuleMapForModuleBuild(CompilerInstance &CI, StringRef Filename,
>>> - bool IsSystem, bool IsPreprocessed,
>>> - unsigned &Offset) {
>>> +static bool loadModuleMapForModuleBuild(CompilerInstance &CI,
>>> + StringRef Filename, bool
>>> IsSystem,
>>> + bool IsPreprocessed,
>>> + std::string
>>> &PresumedModuleMapFile,
>>> + unsigned &Offset) {
>>> auto &SrcMgr = CI.getSourceManager();
>>> HeaderSearch &HS = CI.getPreprocessor().getHeaderSearchInfo();
>>>
>>> @@ -388,16 +389,15 @@ loadModuleMapForModuleBuild(CompilerInst
>>> // line directives are not part of the module map syntax in general.
>>> Offset = 0;
>>> if (IsPreprocessed) {
>>> - std::string PresumedModuleMapFile;
>>> SourceLocation EndOfLineMarker =
>>> ReadOriginalFileName(CI, PresumedModuleMapFile,
>>> /*AddLineNote*/true);
>>> if (EndOfLineMarker.isValid())
>>> Offset = CI.getSourceManager().getDecom
>>> posedLoc(EndOfLineMarker).second;
>>> - // FIXME: Use PresumedModuleMapFile as the MODULE_MAP_FILE in the
>>> PCM.
>>> }
>>>
>>> // Load the module map file.
>>> - if (HS.loadModuleMapFile(ModuleMap, IsSystem, ModuleMapID, &Offset))
>>> + if (HS.loadModuleMapFile(ModuleMap, IsSystem, ModuleMapID, &Offset,
>>> + PresumedModuleMapFile))
>>> return true;
>>>
>>> if (SrcMgr.getBuffer(ModuleMapID)->getBufferSize() == Offset)
>>> @@ -664,15 +664,19 @@ bool FrontendAction::BeginSourceFile(Com
>>> if (Input.getKind().getFormat() == InputKind::ModuleMap) {
>>> CI.getLangOpts().setCompilingModule(LangOptions::CMK_ModuleMap);
>>>
>>> + std::string PresumedModuleMapFile;
>>> unsigned OffsetToContents;
>>> if (loadModuleMapForModuleBuild(CI, Input.getFile(),
>>> Input.isSystem(),
>>> - Input.isPreprocessed(),
>>> OffsetToContents))
>>> + Input.isPreprocessed(),
>>> + PresumedModuleMapFile,
>>> OffsetToContents))
>>> goto failure;
>>>
>>> auto *CurrentModule = prepareToBuildModule(CI, Input.getFile());
>>> if (!CurrentModule)
>>> goto failure;
>>>
>>> + CurrentModule->PresumedModuleMapFile = PresumedModuleMapFile;
>>> +
>>> if (OffsetToContents)
>>> // If the module contents are in the same file, skip to them.
>>> CI.getPreprocessor().setSkipMainFilePreamble(OffsetToContents,
>>> true);
>>>
>>> Modified: cfe/trunk/lib/Lex/HeaderSearch.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Header
>>> Search.cpp?rev=304346&r1=304345&r2=304346&view=diff
>>> ============================================================
>>> ==================
>>> --- cfe/trunk/lib/Lex/HeaderSearch.cpp (original)
>>> +++ cfe/trunk/lib/Lex/HeaderSearch.cpp Wed May 31 15:56:55 2017
>>> @@ -1326,14 +1326,27 @@ static const FileEntry *getPrivateModule
>>> }
>>>
>>> bool HeaderSearch::loadModuleMapFile(const FileEntry *File, bool
>>> IsSystem,
>>> - FileID ID, unsigned *Offset) {
>>> + FileID ID, unsigned *Offset,
>>> + StringRef OriginalModuleMapFile) {
>>> // Find the directory for the module. For frameworks, that may
>>> require going
>>> // up from the 'Modules' directory.
>>> const DirectoryEntry *Dir = nullptr;
>>> if (getHeaderSearchOpts().ModuleMapFileHomeIsCwd)
>>> Dir = FileMgr.getDirectory(".");
>>> else {
>>> - Dir = File->getDir();
>>> + if (!OriginalModuleMapFile.empty()) {
>>> + // We're building a preprocessed module map. Find or invent the
>>> directory
>>> + // that it originally occupied.
>>> + Dir = FileMgr.getDirectory(
>>> + llvm::sys::path::parent_path(OriginalModuleMapFile));
>>> + if (!Dir) {
>>> + auto *FakeFile = FileMgr.getVirtualFile(OriginalModuleMapFile,
>>> 0, 0);
>>> + Dir = FakeFile->getDir();
>>> + }
>>> + } else {
>>> + Dir = File->getDir();
>>> + }
>>> +
>>> StringRef DirName(Dir->getName());
>>> if (llvm::sys::path::filename(DirName) == "Modules") {
>>> DirName = llvm::sys::path::parent_path(DirName);
>>>
>>> Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serializat
>>> ion/ASTWriter.cpp?rev=304346&r1=304345&r2=304346&view=diff
>>> ============================================================
>>> ==================
>>> --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
>>> +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Wed May 31 15:56:55 2017
>>> @@ -1422,8 +1422,8 @@ void ASTWriter::WriteControlBlock(Prepro
>>> Stream.EmitRecordWithBlob(MetadataAbbrevCode, Record,
>>> getClangFullRepositoryVersion());
>>> }
>>> - if (WritingModule) {
>>>
>>> + if (WritingModule) {
>>> // Module name
>>> auto Abbrev = std::make_shared<BitCodeAbbrev>();
>>> Abbrev->Add(BitCodeAbbrevOp(MODULE_NAME));
>>> @@ -1466,9 +1466,10 @@ void ASTWriter::WriteControlBlock(Prepro
>>> Record.clear();
>>>
>>> auto &Map = PP.getHeaderSearchInfo().getModuleMap();
>>> -
>>> - // Primary module map file.
>>> - AddPath(Map.getModuleMapFileForUniquing(WritingModule)->getName(),
>>> Record);
>>> + AddPath(WritingModule->PresumedModuleMapFile.empty()
>>> + ? Map.getModuleMapFileForUniquin
>>> g(WritingModule)->getName()
>>> + : StringRef(WritingModule->PresumedModuleMapFile),
>>> + Record);
>>>
>>> // Additional module map files.
>>> if (auto *AdditionalModMaps =
>>>
>>> Modified: cfe/trunk/test/Modules/preprocess-module.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/p
>>> reprocess-module.cpp?rev=304346&r1=304345&r2=304346&view=diff
>>> ============================================================
>>> ==================
>>> --- cfe/trunk/test/Modules/preprocess-module.cpp (original)
>>> +++ cfe/trunk/test/Modules/preprocess-module.cpp Wed May 31 15:56:55
>>> 2017
>>> @@ -14,8 +14,6 @@
>>> // RUN: FileCheck %s --input-file %t/rewrite.ii --check-prefix=CHECK
>>> --check-prefix=REWRITE
>>>
>>> // Check that we can build a module from the preprocessed output.
>>> -// FIXME: For now, we need the headers to exist.
>>> -// RUN: touch %t/file.h %t/file2.h
>>> // RUN: %clang_cc1 -fmodules -fmodule-name=file
>>> -fmodule-file=%t/fwd.pcm -x c++-module-map-cpp-output %t/no-rewrite.ii
>>> -emit-module -o %t/no-rewrite.pcm
>>> // RUN: %clang_cc1 -fmodules -fmodule-name=file
>>> -fmodule-file=%t/fwd.pcm -x c++-module-map-cpp-output %t/rewrite.ii
>>> -emit-module -o %t/rewrite.pcm
>>>
>>> @@ -27,6 +25,8 @@
>>> // Check the module we built works.
>>> // RUN: %clang_cc1 -fmodules -fmodule-file=%t/no-rewrite.pcm %s -I%t
>>> -verify -fno-modules-error-recovery
>>> // RUN: %clang_cc1 -fmodules -fmodule-file=%t/rewrite.pcm %s -I%t
>>> -verify -fno-modules-error-recovery -DREWRITE
>>> +// RUN: %clang_cc1 -fmodules -fmodule-file=%t/no-rewrite.pcm %s -I%t
>>> -verify -fno-modules-error-recovery -DINCLUDE -I%S/Inputs/preprocess
>>> +// RUN: %clang_cc1 -fmodules -fmodule-file=%t/rewrite.pcm %s -I%t
>>> -verify -fno-modules-error-recovery -DREWRITE -DINCLUDE
>>> -I%S/Inputs/preprocess
>>>
>>>
>>> // == module map
>>> @@ -102,7 +102,11 @@ __FILE *a; // expected-error {{declarati
>>> // expected-note at no-rewrite.ii:1 {{here}}
>>> #endif
>>>
>>> +#ifdef INCLUDE
>>> +#include "file.h"
>>> +#else
>>> #pragma clang module import file
>>> +#endif
>>>
>>> FILE *b;
>>> -int x = file2;
>>> +int x = file2; // ok, found in file2.h, even under -DINCLUDE
>>>
>>> Modified: cfe/trunk/test/Modules/preprocess-nested.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/p
>>> reprocess-nested.cpp?rev=304346&r1=304345&r2=304346&view=diff
>>> ============================================================
>>> ==================
>>> --- cfe/trunk/test/Modules/preprocess-nested.cpp (original)
>>> +++ cfe/trunk/test/Modules/preprocess-nested.cpp Wed May 31 15:56:55
>>> 2017
>>> @@ -8,8 +8,6 @@
>>> // RUN: FileCheck %s --input-file %t/rewrite.ii --check-prefix=CHECK
>>> --check-prefix=REWRITE
>>>
>>> // Check that we can build a module from the preprocessed output.
>>> -// FIXME: For now, the files need to exist.
>>> -// RUN: touch %t/a.h %t/b.h %t/c.h
>>> // RUN: %clang_cc1 -fmodules -fmodules-local-submodule-visibility
>>> -fmodule-name=nested -x c++-module-map-cpp-output %t/no-rewrite.ii
>>> -emit-module -o %t/no-rewrite.pcm
>>> // RUN: %clang_cc1 -fmodules -fmodules-local-submodule-visibility
>>> -fmodule-name=nested -x c++-module-map-cpp-output %t/rewrite.ii
>>> -emit-module -o %t/rewrite.pcm
>>>
>>>
>>>
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170601/c25c8193/attachment-0001.html>
More information about the cfe-commits
mailing list