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 12:53:47 PDT 2017


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.


> 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/e2824327/attachment-0001.html>


More information about the cfe-commits mailing list