I reverted this in r223759, since it broke the Green Dragon build for a few hours:
http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA-incremental_build/2259/ http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA-incremental_build/2259/consoleFull#43901905849ba4694-19c4-4d7e-bec5-91127 Seems to have broken a few other bots too: http://lab.llvm.org:8011/console?name=rsmith > On 2014 Dec 8, at 19:20, Richard Smith <[email protected]> wrote: > > Author: rsmith > Date: Mon Dec 8 21:20:04 2014 > New Revision: 223753 > > URL: http://llvm.org/viewvc/llvm-project?rev=223753&view=rev > Log: > [modules] Add experimental -fmodule-map-file-home-is-cwd flag to -cc1. > > For files named by -fmodule-map-file=, and files found by 'extern module' > directives, this flag specifies that we should resolve filenames relative to > the current working directory rather than relative to the directory in which > the module map file resides. This is aimed at fixing path handling, in > particular for relative -I paths, when building modules that represent > components of the current project (rather than libraries installed on the > current system, which the current project has as dependencies, where we'd > typically expect the module map files to be looked up implicitly). > > Added: > cfe/trunk/test/Modules/Inputs/modular_maps-moduleb-cwd.map > cfe/trunk/test/Modules/Inputs/modular_maps/modulea-cwd.map > cfe/trunk/test/Modules/Inputs/modular_maps/modulec-cwd.map > cfe/trunk/test/Modules/Inputs/relative-dep-gen-cwd.modulemap > Modified: > cfe/trunk/include/clang/Driver/CC1Options.td > cfe/trunk/include/clang/Lex/HeaderSearch.h > cfe/trunk/include/clang/Lex/HeaderSearchOptions.h > cfe/trunk/include/clang/Lex/ModuleMap.h > cfe/trunk/lib/Frontend/CompilerInvocation.cpp > cfe/trunk/lib/Lex/HeaderSearch.cpp > cfe/trunk/lib/Lex/ModuleMap.cpp > cfe/trunk/test/Modules/modular_maps.cpp > cfe/trunk/test/Modules/relative-dep-gen.cpp > > Modified: cfe/trunk/include/clang/Driver/CC1Options.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=223753&r1=223752&r2=223753&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Driver/CC1Options.td (original) > +++ cfe/trunk/include/clang/Driver/CC1Options.td Mon Dec 8 21:20:04 2014 > @@ -337,6 +337,9 @@ def fno_modules_error_recovery : Flag<[" > def fmodule_implementation_of : Separate<["-"], "fmodule-implementation-of">, > MetaVarName<"<name>">, > HelpText<"Specify the name of the module whose implementation file this > is">; > +def fmodule_map_file_home_is_cwd : Flag<["-"], > "fmodule-map-file-home-is-cwd">, > + HelpText<"Use the current working directory as the home directory of " > + "module maps specified by -fmodule-map-file=<FILE>">; > > let Group = Action_Group in { > > > Modified: cfe/trunk/include/clang/Lex/HeaderSearch.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/HeaderSearch.h?rev=223753&r1=223752&r2=223753&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Lex/HeaderSearch.h (original) > +++ cfe/trunk/include/clang/Lex/HeaderSearch.h Mon Dec 8 21:20:04 2014 > @@ -640,7 +640,8 @@ private: > }; > > LoadModuleMapResult loadModuleMapFileImpl(const FileEntry *File, > - bool IsSystem); > + bool IsSystem, > + const DirectoryEntry *Dir); > > /// \brief Try to load the module map file in the given directory. > /// > > Modified: cfe/trunk/include/clang/Lex/HeaderSearchOptions.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/HeaderSearchOptions.h?rev=223753&r1=223752&r2=223753&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Lex/HeaderSearchOptions.h (original) > +++ cfe/trunk/include/clang/Lex/HeaderSearchOptions.h Mon Dec 8 21:20:04 2014 > @@ -101,6 +101,15 @@ public: > /// \brief Interpret module maps. This option is implied by full modules. > unsigned ModuleMaps : 1; > > + /// \brief Set the 'home directory' of a module map file to the current > + /// working directory (or the home directory of the module map file that > + /// contained the 'extern module' directive importing this module map file > + /// if any) rather than the directory containing the module map file. > + // > + /// The home directory is where we look for files named in the module map > + /// file. > + unsigned ModuleMapFileHomeIsCwd : 1; > + > /// \brief The interval (in seconds) between pruning operations. > /// > /// This operation is expensive, because it requires Clang to walk through > @@ -158,6 +167,7 @@ public: > public: > HeaderSearchOptions(StringRef _Sysroot = "/") > : Sysroot(_Sysroot), DisableModuleHash(0), ModuleMaps(0), > + ModuleMapFileHomeIsCwd(0), > ModuleCachePruneInterval(7*24*60*60), > ModuleCachePruneAfter(31*24*60*60), > BuildSessionTimestamp(0), > > Modified: cfe/trunk/include/clang/Lex/ModuleMap.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/ModuleMap.h?rev=223753&r1=223752&r2=223753&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Lex/ModuleMap.h (original) > +++ cfe/trunk/include/clang/Lex/ModuleMap.h Mon Dec 8 21:20:04 2014 > @@ -454,8 +454,12 @@ public: > /// \param IsSystem Whether this module map file is in a system header > /// directory, and therefore should be considered a system module. > /// > + /// \param HomeDir The directory in which relative paths within this module > + /// map file will be resolved. > + /// > /// \returns true if an error occurred, false otherwise. > - bool parseModuleMapFile(const FileEntry *File, bool IsSystem); > + bool parseModuleMapFile(const FileEntry *File, bool IsSystem, > + const DirectoryEntry *HomeDir); > > /// \brief Dump the contents of the module map, for debugging purposes. > void dump(); > > Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=223753&r1=223752&r2=223753&view=diff > ============================================================================== > --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original) > +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Mon Dec 8 21:20:04 2014 > @@ -1003,6 +1003,7 @@ static void ParseHeaderSearchArgs(Header > Opts.DisableModuleHash = Args.hasArg(OPT_fdisable_module_hash); > // -fmodules implies -fmodule-maps > Opts.ModuleMaps = Args.hasArg(OPT_fmodule_maps) || > Args.hasArg(OPT_fmodules); > + Opts.ModuleMapFileHomeIsCwd = > Args.hasArg(OPT_fmodule_map_file_home_is_cwd); > Opts.ModuleCachePruneInterval = > getLastArgIntValue(Args, OPT_fmodules_prune_interval, 7 * 24 * 60 * 60); > Opts.ModuleCachePruneAfter = > > Modified: cfe/trunk/lib/Lex/HeaderSearch.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/HeaderSearch.cpp?rev=223753&r1=223752&r2=223753&view=diff > ============================================================================== > --- cfe/trunk/lib/Lex/HeaderSearch.cpp (original) > +++ cfe/trunk/lib/Lex/HeaderSearch.cpp Mon Dec 8 21:20:04 2014 > @@ -1113,11 +1113,10 @@ HeaderSearch::findModuleForHeader(const > return ModMap.findModuleForHeader(File); > } > > -static const FileEntry *getPrivateModuleMap(StringRef ModuleMapPath, > - const DirectoryEntry *Directory, > +static const FileEntry *getPrivateModuleMap(const FileEntry *File, > FileManager &FileMgr) { > - StringRef Filename = llvm::sys::path::filename(ModuleMapPath); > - SmallString<128> PrivateFilename(Directory->getName()); > + StringRef Filename = llvm::sys::path::filename(File->getName()); > + SmallString<128> PrivateFilename(File->getDir()->getName()); > if (Filename == "module.map") > llvm::sys::path::append(PrivateFilename, "module_private.map"); > else if (Filename == "module.modulemap") > @@ -1128,7 +1127,25 @@ static const FileEntry *getPrivateModule > } > > bool HeaderSearch::loadModuleMapFile(const FileEntry *File, bool IsSystem) { > - switch (loadModuleMapFileImpl(File, IsSystem)) { > + // 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(); > + StringRef DirName(Dir->getName()); > + if (llvm::sys::path::filename(DirName) == "Modules") { > + DirName = llvm::sys::path::parent_path(DirName); > + if (DirName.endswith(".framework")) > + Dir = FileMgr.getDirectory(DirName); > + // FIXME: This assert can fail if there's a race between the above > check > + // and the removal of the directory. > + assert(Dir && "parent must exist"); > + } > + } > + > + switch (loadModuleMapFileImpl(File, IsSystem, Dir)) { > case LMM_AlreadyLoaded: > case LMM_NewlyLoaded: > return false; > @@ -1140,7 +1157,8 @@ bool HeaderSearch::loadModuleMapFile(con > } > > HeaderSearch::LoadModuleMapResult > -HeaderSearch::loadModuleMapFileImpl(const FileEntry *File, bool IsSystem) { > +HeaderSearch::loadModuleMapFileImpl(const FileEntry *File, bool IsSystem, > + const DirectoryEntry *Dir) { > assert(File && "expected FileEntry"); > > // Check whether we've already loaded this module map, and mark it as being > @@ -1149,15 +1167,14 @@ HeaderSearch::loadModuleMapFileImpl(cons > if (!AddResult.second) > return AddResult.first->second ? LMM_AlreadyLoaded : LMM_InvalidModuleMap; > > - if (ModMap.parseModuleMapFile(File, IsSystem)) { > + if (ModMap.parseModuleMapFile(File, IsSystem, Dir)) { > LoadedModuleMaps[File] = false; > return LMM_InvalidModuleMap; > } > > // Try to load a corresponding private module map. > - if (const FileEntry *PMMFile = > - getPrivateModuleMap(File->getName(), File->getDir(), FileMgr)) { > - if (ModMap.parseModuleMapFile(PMMFile, IsSystem)) { > + if (const FileEntry *PMMFile = getPrivateModuleMap(File, FileMgr)) { > + if (ModMap.parseModuleMapFile(PMMFile, IsSystem, Dir)) { > LoadedModuleMaps[File] = false; > return LMM_InvalidModuleMap; > } > @@ -1231,7 +1248,8 @@ HeaderSearch::loadModuleMapFile(const Di > return KnownDir->second ? LMM_AlreadyLoaded : LMM_InvalidModuleMap; > > if (const FileEntry *ModuleMapFile = lookupModuleMapFile(Dir, IsFramework)) > { > - LoadModuleMapResult Result = loadModuleMapFileImpl(ModuleMapFile, > IsSystem); > + LoadModuleMapResult Result = > + loadModuleMapFileImpl(ModuleMapFile, IsSystem, Dir); > // Add Dir explicitly in case ModuleMapFile is in a subdirectory. > // E.g. Foo.framework/Modules/module.modulemap > // ^Dir ^ModuleMapFile > > Modified: cfe/trunk/lib/Lex/ModuleMap.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/ModuleMap.cpp?rev=223753&r1=223752&r2=223753&view=diff > ============================================================================== > --- cfe/trunk/lib/Lex/ModuleMap.cpp (original) > +++ cfe/trunk/lib/Lex/ModuleMap.cpp Mon Dec 8 21:20:04 2014 > @@ -19,6 +19,7 @@ > #include "clang/Basic/TargetInfo.h" > #include "clang/Basic/TargetOptions.h" > #include "clang/Lex/HeaderSearch.h" > +#include "clang/Lex/HeaderSearchOptions.h" > #include "clang/Lex/LexDiagnostic.h" > #include "clang/Lex/Lexer.h" > #include "clang/Lex/LiteralSupport.h" > @@ -648,7 +649,7 @@ ModuleMap::inferFrameworkModule(StringRe > bool IsFrameworkDir = Parent.endswith(".framework"); > if (const FileEntry *ModMapFile = > HeaderInfo.lookupModuleMapFile(ParentDir, IsFrameworkDir)) { > - parseModuleMapFile(ModMapFile, IsSystem); > + parseModuleMapFile(ModMapFile, IsSystem, ParentDir); > inferred = InferredDirectories.find(ParentDir); > } > > @@ -1024,7 +1025,8 @@ namespace clang { > /// \brief The current module map file. > const FileEntry *ModuleMapFile; > > - /// \brief The directory that this module map resides in. > + /// \brief The directory that file names in this module map file should > + /// be resolved relative to. > const DirectoryEntry *Directory; > > /// \brief The directory containing Clang-supplied headers. > @@ -1591,7 +1593,11 @@ void ModuleMapParser::parseExternModuleD > FileNameRef = ModuleMapFileName.str(); > } > if (const FileEntry *File = SourceMgr.getFileManager().getFile(FileNameRef)) > - Map.parseModuleMapFile(File, /*IsSystem=*/false); > + Map.parseModuleMapFile( > + File, /*IsSystem=*/false, > + Map.HeaderInfo.getHeaderSearchOpts().ModuleMapFileHomeIsCwd > + ? Directory > + : File->getDir()); > } > > /// \brief Parse a requires declaration. > @@ -2333,7 +2339,8 @@ bool ModuleMapParser::parseModuleMapFile > } while (true); > } > > -bool ModuleMap::parseModuleMapFile(const FileEntry *File, bool IsSystem) { > +bool ModuleMap::parseModuleMapFile(const FileEntry *File, bool IsSystem, > + const DirectoryEntry *Dir) { > llvm::DenseMap<const FileEntry *, bool>::iterator Known > = ParsedModuleMap.find(File); > if (Known != ParsedModuleMap.end()) > @@ -2346,17 +2353,6 @@ bool ModuleMap::parseModuleMapFile(const > if (!Buffer) > return ParsedModuleMap[File] = true; > > - // Find the directory for the module. For frameworks, that may require > going > - // up from the 'Modules' directory. > - const DirectoryEntry *Dir = File->getDir(); > - StringRef DirName(Dir->getName()); > - if (llvm::sys::path::filename(DirName) == "Modules") { > - DirName = llvm::sys::path::parent_path(DirName); > - if (DirName.endswith(".framework")) > - Dir = SourceMgr.getFileManager().getDirectory(DirName); > - assert(Dir && "parent must exist"); > - } > - > // Parse this module map file. > Lexer L(ID, SourceMgr.getBuffer(ID), SourceMgr, MMapLangOpts); > ModuleMapParser Parser(L, SourceMgr, Target, Diags, *this, File, Dir, > > Added: cfe/trunk/test/Modules/Inputs/modular_maps-moduleb-cwd.map > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/modular_maps-moduleb-cwd.map?rev=223753&view=auto > ============================================================================== > --- cfe/trunk/test/Modules/Inputs/modular_maps-moduleb-cwd.map (added) > +++ cfe/trunk/test/Modules/Inputs/modular_maps-moduleb-cwd.map Mon Dec 8 > 21:20:04 2014 > @@ -0,0 +1,4 @@ > +module B { > + header "Inputs/modular_maps/common.h" > + private header "Inputs/modular_maps/b.h" > +} > > Added: cfe/trunk/test/Modules/Inputs/modular_maps/modulea-cwd.map > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/modular_maps/modulea-cwd.map?rev=223753&view=auto > ============================================================================== > --- cfe/trunk/test/Modules/Inputs/modular_maps/modulea-cwd.map (added) > +++ cfe/trunk/test/Modules/Inputs/modular_maps/modulea-cwd.map Mon Dec 8 > 21:20:04 2014 > @@ -0,0 +1,7 @@ > +module A { > + header "Inputs/modular_maps/common.h" > + header "Inputs/modular_maps/a.h" > +} > + > +extern module B "Inputs/modular_maps-moduleb-cwd.map" > + > > Added: cfe/trunk/test/Modules/Inputs/modular_maps/modulec-cwd.map > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/modular_maps/modulec-cwd.map?rev=223753&view=auto > ============================================================================== > --- cfe/trunk/test/Modules/Inputs/modular_maps/modulec-cwd.map (added) > +++ cfe/trunk/test/Modules/Inputs/modular_maps/modulec-cwd.map Mon Dec 8 > 21:20:04 2014 > @@ -0,0 +1,3 @@ > +module C { > + header "Inputs/modular_maps/c.h" > +} > > Added: cfe/trunk/test/Modules/Inputs/relative-dep-gen-cwd.modulemap > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/relative-dep-gen-cwd.modulemap?rev=223753&view=auto > ============================================================================== > --- cfe/trunk/test/Modules/Inputs/relative-dep-gen-cwd.modulemap (added) > +++ cfe/trunk/test/Modules/Inputs/relative-dep-gen-cwd.modulemap Mon Dec 8 > 21:20:04 2014 > @@ -0,0 +1,4 @@ > +module "relative-dep-gen" { > + header "Inputs/relative-dep-gen-1.h" > + header "Inputs/relative-dep-gen-2.h" > +} > > Modified: cfe/trunk/test/Modules/modular_maps.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/modular_maps.cpp?rev=223753&r1=223752&r2=223753&view=diff > ============================================================================== > --- cfe/trunk/test/Modules/modular_maps.cpp (original) > +++ cfe/trunk/test/Modules/modular_maps.cpp Mon Dec 8 21:20:04 2014 > @@ -1,6 +1,15 @@ > // RUN: rm -rf %t > +// > // RUN: %clang_cc1 -x objective-c++ -fmodules-cache-path=%t -fmodules > -fmodule-map-file=%S/Inputs/modular_maps/modulea.map > -fmodule-map-file=%S/Inputs/modular_maps/modulec.map -I > %S/Inputs/modular_maps %s -verify > // RUN: %clang_cc1 -x objective-c++ -fmodules-cache-path=%t -fmodules > -fmodule-map-file=%S/Inputs/modular_maps/modulec.map > -fmodule-map-file=%S/Inputs/modular_maps/modulea.map -I > %S/Inputs/modular_maps %s -verify > +// > +// RUN: cd %S > +// RUN: %clang_cc1 -x objective-c++ -fmodules-cache-path=%t -fmodules > -fmodule-map-file=Inputs/modular_maps/modulea.map > -fmodule-map-file=Inputs/modular_maps/modulec.map -I Inputs/modular_maps %s > -verify > +// RUN: %clang_cc1 -x objective-c++ -fmodules-cache-path=%t -fmodules > -fmodule-map-file=Inputs/modular_maps/modulec.map > -fmodule-map-file=Inputs/modular_maps/modulea.map -I Inputs/modular_maps %s > -verify > +// > +// RUN: cd %S > +// RUN: %clang_cc1 -x objective-c++ -fmodules-cache-path=%t -fmodules > -fmodule-map-file=Inputs/modular_maps/modulea-cwd.map > -fmodule-map-file=Inputs/modular_maps/modulec-cwd.map -I Inputs/modular_maps > %s -verify -fmodule-map-file-home-is-cwd > +// RUN: %clang_cc1 -x objective-c++ -fmodules-cache-path=%t -fmodules > -fmodule-map-file=Inputs/modular_maps/modulec-cwd.map > -fmodule-map-file=Inputs/modular_maps/modulea-cwd.map -I Inputs/modular_maps > %s -verify -fmodule-map-file-home-is-cwd > > #include "common.h" > #include "a.h" > > Modified: cfe/trunk/test/Modules/relative-dep-gen.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/relative-dep-gen.cpp?rev=223753&r1=223752&r2=223753&view=diff > ============================================================================== > --- cfe/trunk/test/Modules/relative-dep-gen.cpp (original) > +++ cfe/trunk/test/Modules/relative-dep-gen.cpp Mon Dec 8 21:20:04 2014 > @@ -3,6 +3,7 @@ > // RUN: cd %S > // RUN: rm -rf %t > // RUN: mkdir %t > +// > // RUN: %clang_cc1 -cc1 -fmodule-name=relative-dep-gen -emit-module -x c++ > Inputs/relative-dep-gen.modulemap -dependency-file %t/build.d -MT mod.pcm -o > %t/mod.pcm > // RUN: %clang_cc1 -cc1 -fmodule-map-file=Inputs/relative-dep-gen.modulemap > -fmodule-file=%t/mod.pcm -dependency-file %t/use-explicit.d -MT use.o > relative-dep-gen.cpp -fsyntax-only > // RUN: %clang_cc1 -cc1 -fmodule-map-file=Inputs/relative-dep-gen.modulemap > -dependency-file %t/use-implicit.d relative-dep-gen.cpp -MT use.o > -fsyntax-only > @@ -10,6 +11,14 @@ > // RUN: FileCheck --check-prefix=CHECK-BUILD %s < %t/build.d > // RUN: FileCheck --check-prefix=CHECK-USE %s < %t/use-explicit.d > // RUN: FileCheck --check-prefix=CHECK-USE %s < %t/use-implicit.d > +// > +// RUN: %clang_cc1 -cc1 -fmodule-name=relative-dep-gen -emit-module -x c++ > Inputs/relative-dep-gen-cwd.modulemap -dependency-file %t/build-cwd.d -MT > mod.pcm -o %t/mod-cwd.pcm -fmodule-map-file-home-is-cwd > +// RUN: %clang_cc1 -cc1 > -fmodule-map-file=Inputs/relative-dep-gen-cwd.modulemap > -fmodule-file=%t/mod-cwd.pcm -dependency-file %t/use-explicit-cwd.d -MT use.o > relative-dep-gen.cpp -fsyntax-only -fmodule-map-file-home-is-cwd > +// RUN: %clang_cc1 -cc1 > -fmodule-map-file=Inputs/relative-dep-gen-cwd.modulemap -dependency-file > %t/use-implicit-cwd.d relative-dep-gen.cpp -MT use.o -fsyntax-only > -fmodule-map-file-home-is-cwd > +// > +// RUN: FileCheck --check-prefix=CHECK-BUILD %s < %t/build-cwd.d > +// RUN: FileCheck --check-prefix=CHECK-USE %s < %t/use-explicit-cwd.d > +// RUN: FileCheck --check-prefix=CHECK-USE %s < %t/use-implicit-cwd.d > > #include "Inputs/relative-dep-gen-1.h" > > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
