r304346 - [modules] When compiling a preprocessed module map, look for headers relative

Yaron Keren via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 1 05:05:02 PDT 2017


Hi Richard,

This broke the tests on the Windows bot:

http://lab.llvm.org:8011/builders/clang-x86-windows-msvc2015/builds/5266

   1. FAIL: Clang::preprocess-nested.cpp
   <http://lab.llvm.org:8011/builders/clang-x86-windows-msvc2015/builds/5266/steps/ninja%20check%201/logs/FAIL%3A%20Clang%3A%3Apreprocess-nested.cpp>
   2. FAIL: Clang::preprocess-module.cpp
   <http://lab.llvm.org:8011/builders/clang-x86-windows-msvc2015/builds/5266/steps/ninja%20check%201/logs/FAIL%3A%20Clang%3A%3Apreprocess-module.cpp>

r304345 was OK
http://lab.llvm.org:8011/builders/clang-x86-windows-msvc2015/builds/5265

Yaron


‫בתאריך יום ד׳, 31 במאי 2017 ב-23:57 מאת ‪Richard Smith via cfe-commits‬‏ <‪
cfe-commits at lists.llvm.org‬‏>:‬

> 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/FrontendAction.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().getDecomposedLoc(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/HeaderSearch.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/Serialization/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.getModuleMapFileForUniquing(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/preprocess-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/preprocess-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/5278d1d4/attachment-0001.html>


More information about the cfe-commits mailing list