Author: Jan Svoboda Date: 2022-02-23T14:46:23+01:00 New Revision: 27d9a58407c44c8bb3fe7b94ff8d3b9bea25afc4
URL: https://github.com/llvm/llvm-project/commit/27d9a58407c44c8bb3fe7b94ff8d3b9bea25afc4 DIFF: https://github.com/llvm/llvm-project/commit/27d9a58407c44c8bb3fe7b94ff8d3b9bea25afc4.diff LOG: [clang][modules] Infer framework modules in explicit builds This patch enables inferring framework modules in explicit builds in all contexts. Until now, inferring framework modules only worked with `-fimplicit-module-maps` due to this block of code: ``` // HeaderSearch::loadFrameworkModule case LMM_InvalidModuleMap: // Try to infer a module map from the framework directory. if (HSOpts->ImplicitModuleMaps) ModMap.inferFrameworkModule(Dir, IsSystem, /*Parent=*/nullptr); break; ``` Reviewed By: Bigcheese Differential Revision: https://reviews.llvm.org/D113880 Added: Modified: clang/include/clang/Lex/ModuleMap.h clang/lib/Frontend/FrontendAction.cpp clang/test/Modules/explicit-build-inferred.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Lex/ModuleMap.h b/clang/include/clang/Lex/ModuleMap.h index 08c61a5dc5607..26169ae9cee95 100644 --- a/clang/include/clang/Lex/ModuleMap.h +++ b/clang/include/clang/Lex/ModuleMap.h @@ -584,6 +584,12 @@ class ModuleMap { return ModuleScopeIDs[ExistingModule] < CurrentModuleScopeID; } + /// Check whether a framework module can be inferred in the given directory. + bool canInferFrameworkModule(const DirectoryEntry *Dir) const { + auto It = InferredDirectories.find(Dir); + return It != InferredDirectories.end() && It->getSecond().InferModules; + } + /// Retrieve the module map file containing the definition of the given /// module. /// diff --git a/clang/lib/Frontend/FrontendAction.cpp b/clang/lib/Frontend/FrontendAction.cpp index 089f40b36089a..c5b9e80356db4 100644 --- a/clang/lib/Frontend/FrontendAction.cpp +++ b/clang/lib/Frontend/FrontendAction.cpp @@ -465,6 +465,15 @@ static bool loadModuleMapForModuleBuild(CompilerInstance &CI, bool IsSystem, if (SrcMgr.getBufferOrFake(ModuleMapID).getBufferSize() == Offset) Offset = 0; + // Infer framework module if possible. + if (HS.getModuleMap().canInferFrameworkModule(ModuleMap->getDir())) { + SmallString<128> InferredFrameworkPath = ModuleMap->getDir()->getName(); + llvm::sys::path::append(InferredFrameworkPath, + CI.getLangOpts().ModuleName + ".framework"); + if (auto Dir = CI.getFileManager().getDirectory(InferredFrameworkPath)) + (void)HS.getModuleMap().inferFrameworkModule(*Dir, IsSystem, nullptr); + } + return false; } diff --git a/clang/test/Modules/explicit-build-inferred.cpp b/clang/test/Modules/explicit-build-inferred.cpp index 2ee585692a687..42a22fd136b7b 100644 --- a/clang/test/Modules/explicit-build-inferred.cpp +++ b/clang/test/Modules/explicit-build-inferred.cpp @@ -1,11 +1,10 @@ // RUN: rm -rf %t && mkdir %t // -// RUN: %clang_cc1 -fmodules -fno-implicit-modules -fimplicit-module-maps \ +// RUN: %clang_cc1 -fmodules -fno-implicit-modules \ // RUN: -emit-module -x c++ %S/Inputs/explicit-build-inferred/frameworks/module.modulemap \ // RUN: -fmodule-name=Inferred -o %t/Inferred.pcm -F %S/Inputs/explicit-build-inferred/frameworks // // RUN: %clang_cc1 -fmodules -fno-implicit-modules -fsyntax-only %s \ -// RUN: -fmodule-map-file=%S/Inputs/explicit-build-inferred/frameworks/module.modulemap \ // RUN: -fmodule-file=%t/Inferred.pcm -F %S/Inputs/explicit-build-inferred/frameworks #include <Inferred/Inferred.h> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits