forked from OSchip/llvm-project
[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
This commit is contained in:
parent
2f300d34de
commit
27d9a58407
|
@ -584,6 +584,12 @@ public:
|
|||
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.
|
||||
///
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue