mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-10 18:11:19 +00:00
[PCH+Modules] Load -fmodule-map-file content before including PCHs
Consider: 1) Generate PCH with -fmodules and -fmodule-map-file 2) Use PCH with -fmodules and the same -fmodule-map-file If we don't load -fmodule-map-file content before including PCHs, the modules that are dependencies in PCHs cannot get loaded, since there's no matching module map file when reading back the AST. rdar://problem/40852867 Differential Revision: https://reviews.llvm.org/D48685 llvm-svn: 337447
This commit is contained in:
parent
4b0028a3d1
commit
7315d2d721
@ -766,6 +766,22 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
|
||||
if (!BeginSourceFileAction(CI))
|
||||
goto failure;
|
||||
|
||||
// If we were asked to load any module map files, do so now.
|
||||
for (const auto &Filename : CI.getFrontendOpts().ModuleMapFiles) {
|
||||
if (auto *File = CI.getFileManager().getFile(Filename))
|
||||
CI.getPreprocessor().getHeaderSearchInfo().loadModuleMapFile(
|
||||
File, /*IsSystem*/false);
|
||||
else
|
||||
CI.getDiagnostics().Report(diag::err_module_map_not_found) << Filename;
|
||||
}
|
||||
|
||||
// Add a module declaration scope so that modules from -fmodule-map-file
|
||||
// arguments may shadow modules found implicitly in search paths.
|
||||
CI.getPreprocessor()
|
||||
.getHeaderSearchInfo()
|
||||
.getModuleMap()
|
||||
.finishModuleDeclarationScope();
|
||||
|
||||
// Create the AST context and consumer unless this is a preprocessor only
|
||||
// action.
|
||||
if (!usesPreprocessorOnly()) {
|
||||
@ -855,22 +871,6 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
|
||||
"doesn't support modules");
|
||||
}
|
||||
|
||||
// If we were asked to load any module map files, do so now.
|
||||
for (const auto &Filename : CI.getFrontendOpts().ModuleMapFiles) {
|
||||
if (auto *File = CI.getFileManager().getFile(Filename))
|
||||
CI.getPreprocessor().getHeaderSearchInfo().loadModuleMapFile(
|
||||
File, /*IsSystem*/false);
|
||||
else
|
||||
CI.getDiagnostics().Report(diag::err_module_map_not_found) << Filename;
|
||||
}
|
||||
|
||||
// Add a module declaration scope so that modules from -fmodule-map-file
|
||||
// arguments may shadow modules found implicitly in search paths.
|
||||
CI.getPreprocessor()
|
||||
.getHeaderSearchInfo()
|
||||
.getModuleMap()
|
||||
.finishModuleDeclarationScope();
|
||||
|
||||
// If we were asked to load any module files, do so now.
|
||||
for (const auto &ModuleFile : CI.getFrontendOpts().ModuleFiles)
|
||||
if (!CI.loadModuleFile(ModuleFile))
|
||||
|
16
clang/test/Modules/module-imported-by-pch-with-modulemap.m
Normal file
16
clang/test/Modules/module-imported-by-pch-with-modulemap.m
Normal file
@ -0,0 +1,16 @@
|
||||
// RUN: rm -rf %t.dst %t.cache
|
||||
// RUN: mkdir -p %t.dst/folder-with-modulemap %t.dst/pch-folder
|
||||
// RUN: echo '#import "folder-with-modulemap/included.h"' > %t.dst/header.h
|
||||
// RUN: echo 'extern int MyModuleVersion;' > %t.dst/folder-with-modulemap/MyModule.h
|
||||
// RUN: echo '@import MyModule;' > %t.dst/folder-with-modulemap/included.h
|
||||
// RUN: echo 'module MyModule { header "MyModule.h" }' > %t.dst/folder-with-modulemap/MyModule.modulemap
|
||||
|
||||
// RUN: %clang_cc1 -emit-pch -o %t.dst/pch-folder/header.pch -fmodule-map-file=%t.dst/folder-with-modulemap/MyModule.modulemap -x objective-c-header -fmodules-cache-path=%t.cache -fmodules -fimplicit-module-maps %t.dst/header.h
|
||||
// RUN: %clang_cc1 -fsyntax-only -fmodule-map-file=%t.dst/folder-with-modulemap/MyModule.modulemap -fmodules-cache-path=%t.cache -fmodules -fimplicit-module-maps %s -include-pch %t.dst/pch-folder/header.pch -verify
|
||||
|
||||
// expected-no-diagnostics
|
||||
|
||||
void test() {
|
||||
(void)MyModuleVersion; // should be found by implicit import
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user