Open Quuxplusone opened 3 years ago
https://reviews.llvm.org/D107296 addresses the inttypes.h case.
I'm less sure what to do about the other compiler-provided headers that are also absent from the module map and not treated as built-in headers.
Attached inttypes.diff
(2534 bytes, text/plain): Possible fix with a test case
The test case looks fine to me, though, as you note, the supporting files do cause failures in other test cases.
Attached possible-fix-approach.diff
(1120 bytes, text/plain): Possible fix for resource directory injection
I'm sorry, but due to other obligations I'm not able to spend time on the related issue your test uncovered.
inttypes.diff
(2534 bytes, text/plain)possible-fix-approach.diff
(1120 bytes, text/plain)Attempting to compile a module containing a header that imports
inttypes.h
with-fmodules-strict-decluse
enabled results in an error despite providing Clang with the Darwin module that providesinttypes.h
:Clang finds
inttypes.h
within the compiler-provided headers, but does not consider the header to be built-in. The header is not present in the module map alongside the compiler-provided headers so there is no other module to depend on to access the header when using-fmodules-strict-decluse
.Most other compiler-provided headers are present in either the module map1 or as built-in headers that are treated as belonging to the module that provides the header they're wrapping2.
inttypes.h
and a few other headers are absent from both.inttypes.h
appears like it should be treated as a built-in header. It's not clear how the other headers should be handled.Platform-agnostic headers that appear to be missing from both the module map and built-in header list:
inttypes.h builtins.h stdnoreturn.h varargs.h vadefs.h
There are a number of platform-specific headers that are also absent from the module map.
Steps to reproduce:
Requires macOS with Xcode 12.x installed. Tested with both Clang from Xcode 12.5.1 (Apple clang version 12.0.5 (clang-1205.0.22.11)) and from main (bdf4c7b738ee3dfbcd468ec347beec58b6e43a5a).
Precompile _Builtin_stddef_max_align_t
clang -cc1 -fsyntax-only -std=gnu11 \ -resource-dir $(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/ \ -isysroot $(xcrun --show-sdk-path) \ -internal-isystem $(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang//include \ -internal-externc-isystem $(xcrun --show-sdk-path)/usr/include \ -fgnuc-version=4.2.1 -fmodules \ -emit-module \ -fmodule-name=_Builtin_stddef_max_align_t \ $(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/*/include/module.modulemap \ -o _Builtin_stddef_max_align_t.pcm
Precompile Darwin
clang -cc1 -fsyntax-only -std=gnu11 \ -resource-dir $(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/ \ -isysroot $(xcrun --show-sdk-path) \ -internal-isystem $(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang//include \ -internal-externc-isystem $(xcrun --show-sdk-path)/usr/include \ -fgnuc-version=4.2.1 -fmodules \ -emit-module \ -fmodule-map-file=$(echo $(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/*/include/module.modulemap) \ -fmodule-file=_Builtin_stddef_max_align_t=_Builtin_stddef_max_align_t.pcm \ -fmodule-name=Darwin \ $(xcrun --show-sdk-path)/usr/include/module.modulemap \ -o Darwin.pcm
Attempt to precompile the module whose header imports inttypes.h
echo "#include" > test.h
echo -e "module test {\n use Darwin\n header \"test.h\"\n export *\n}" > test.modulemap
clang -cc1 -fsyntax-only -std=gnu11 \ -resource-dir $(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/ \ -isysroot $(xcrun --show-sdk-path) \ -internal-isystem $(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang//include \ -internal-externc-isystem $(xcrun --show-sdk-path)/usr/include \ -fgnuc-version=4.2.1 -fmodules \ -emit-module \ -fmodules-strict-decluse \ -fmodule-map-file=$(echo $(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/*/include/module.modulemap) \ -fmodule-file=_Builtin_stddef_max_align_t=_Builtin_stddef_max_align_t.pcm \ -fmodule-map-file=$(xcrun --show-sdk-path)/usr/include/module.modulemap \ -fmodule-file=Darwin=Darwin.pcm \ -fmodule-name=test \ test.modulemap -o test.pcm