https://github.com/rmaz updated https://github.com/llvm/llvm-project/pull/68023
>From cf4ae971c3fd30f705fa79b8b918288649766d14 Mon Sep 17 00:00:00 2001 From: Richard Howell <r...@fb.com> Date: Mon, 2 Oct 2023 11:10:52 -0700 Subject: [PATCH] [clang] add module builtin headers relative to resource dir When including builtin headers as part of a system module, serialize them relative to the builtin include dir. To handle later lookup add a method to provide the correct base directory. This makes it possible to compile modules including builtin headers with relative resource dirs. --- clang/include/clang/Lex/ModuleMap.h | 5 ++++- clang/lib/Lex/ModuleMap.cpp | 9 ++++++++- clang/lib/Lex/PPDirectives.cpp | 9 ++++++++- .../Modules/Inputs/builtin-headers/module.modulemap | 3 +++ clang/test/Modules/relative-resource-dir.m | 11 +++++++++++ 5 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 clang/test/Modules/Inputs/builtin-headers/module.modulemap create mode 100644 clang/test/Modules/relative-resource-dir.m diff --git a/clang/include/clang/Lex/ModuleMap.h b/clang/include/clang/Lex/ModuleMap.h index 054d4211b9c6d41..69ec8f34a324255 100644 --- a/clang/include/clang/Lex/ModuleMap.h +++ b/clang/include/clang/Lex/ModuleMap.h @@ -410,13 +410,16 @@ class ModuleMap { } /// Get the directory that contains Clang-supplied include files. - const DirectoryEntry *getBuiltinDir() const { + OptionalDirectoryEntryRefDegradesToDirectoryEntryPtr getBuiltinDir() const { return BuiltinIncludeDir; } /// Is this a compiler builtin header? bool isBuiltinHeader(FileEntryRef File); + bool shouldImportRelativeToBuiltinIncludeDir(StringRef FileName, + Module *Module) const; + /// Add a module map callback. void addModuleMapCallbacks(std::unique_ptr<ModuleMapCallbacks> Callback) { Callbacks.push_back(std::move(Callback)); diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp index eb7cab54386c480..e4f3cdd3b163f50 100644 --- a/clang/lib/Lex/ModuleMap.cpp +++ b/clang/lib/Lex/ModuleMap.cpp @@ -348,8 +348,8 @@ bool ModuleMap::resolveAsBuiltinHeader( if (!File) return false; + Module::Header H = {Header.FileName, Header.FileName, *File}; auto Role = headerKindToRole(Header.Kind); - Module::Header H = {Header.FileName, std::string(Path.str()), *File}; addHeader(Mod, H, Role); return true; } @@ -417,6 +417,13 @@ bool ModuleMap::isBuiltinHeader(FileEntryRef File) { isBuiltinHeaderName(llvm::sys::path::filename(File.getName())); } +bool ModuleMap::shouldImportRelativeToBuiltinIncludeDir(StringRef FileName, + Module *Module) const { + return LangOpts.BuiltinHeadersInSystemModules && BuiltinIncludeDir && + Module->IsSystem && !Module->isPartOfFramework() && + isBuiltinHeaderName(FileName); +} + ModuleMap::HeadersMap::iterator ModuleMap::findKnownHeader(FileEntryRef File) { resolveHeaderDirectives(File); HeadersMap::iterator Known = Headers.find(File); diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp index 2892d4b777846ff..6fd515a5f0c756b 100644 --- a/clang/lib/Lex/PPDirectives.cpp +++ b/clang/lib/Lex/PPDirectives.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "clang/Basic/CharInfo.h" +#include "clang/Basic/DirectoryEntry.h" #include "clang/Basic/FileManager.h" #include "clang/Basic/IdentifierTable.h" #include "clang/Basic/LangOptions.h" @@ -21,6 +22,7 @@ #include "clang/Basic/TokenKinds.h" #include "clang/Lex/CodeCompletionHandler.h" #include "clang/Lex/HeaderSearch.h" +#include "clang/Lex/HeaderSearchOptions.h" #include "clang/Lex/LexDiagnostic.h" #include "clang/Lex/LiteralSupport.h" #include "clang/Lex/MacroInfo.h" @@ -982,7 +984,12 @@ OptionalFileEntryRef Preprocessor::LookupFile( // map file. if (!FileEnt) { if (FID == SourceMgr.getMainFileID() && MainFileDir) { - Includers.push_back(std::make_pair(std::nullopt, *MainFileDir)); + auto IncludeDir = + HeaderInfo.getModuleMap().shouldImportRelativeToBuiltinIncludeDir( + Filename, getCurrentModule()) + ? HeaderInfo.getModuleMap().getBuiltinDir() + : MainFileDir; + Includers.push_back(std::make_pair(std::nullopt, *IncludeDir)); BuildSystemModule = getCurrentModule()->IsSystem; } else if ((FileEnt = SourceMgr.getFileEntryRefForID( SourceMgr.getMainFileID()))) { diff --git a/clang/test/Modules/Inputs/builtin-headers/module.modulemap b/clang/test/Modules/Inputs/builtin-headers/module.modulemap new file mode 100644 index 000000000000000..78a5b730dc6a925 --- /dev/null +++ b/clang/test/Modules/Inputs/builtin-headers/module.modulemap @@ -0,0 +1,3 @@ +module ModuleWithBuiltinHeader [system] { + header "float.h" +} \ No newline at end of file diff --git a/clang/test/Modules/relative-resource-dir.m b/clang/test/Modules/relative-resource-dir.m new file mode 100644 index 000000000000000..2efc61259fd7891 --- /dev/null +++ b/clang/test/Modules/relative-resource-dir.m @@ -0,0 +1,11 @@ +// REQUIRES: shell + +// RUN: EXPECTED_RESOURCE_DIR=`%clang -print-resource-dir` && \ +// RUN: mkdir -p %t && rm -rf %t/resource-dir && \ +// RUN: cp -R $EXPECTED_RESOURCE_DIR %t/resource-dir +// RUN: cd %t && %clang -cc1 -x objective-c -fmodules -fmodule-format=obj \ +// RUN: -fimplicit-module-maps -fmodules-cache-path=%t.mcp \ +// RUN: -fbuiltin-headers-in-system-modules \ +// RUN: -resource-dir resource-dir \ +// RUN: -emit-module %S/Inputs/builtin-headers/module.modulemap \ +// RUN: -fmodule-name=ModuleWithBuiltinHeader -o %t.pcm _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits