Quuxplusone / LLVMBugzillaTest

0 stars 0 forks source link

Compiler-provided inttypes.h is not recognized as belonging to any module #50274

Open Quuxplusone opened 3 years ago

Quuxplusone commented 3 years ago
Bugzilla Link PR51307
Status NEW
Importance P normal
Reported by Mark Rowe (mark+llvm.org@bdash.net.nz)
Reported on 2021-08-02 10:36:42 -0700
Last modified on 2021-08-23 11:37:04 -0700
Version trunk
Hardware Macintosh MacOS X
CC dgregor@apple.com, llvm-bugs@lists.llvm.org, richard-llvm@metafoo.co.uk, vsapsai@apple.com
Fixed by commit(s)
Attachments inttypes.diff (2534 bytes, text/plain)
possible-fix-approach.diff (1120 bytes, text/plain)
Blocks
Blocked by
See also

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 provides inttypes.h:

While building module 'test':
In file included from <module-includes>:1:
./test.h:1:10: error: module test does not depend on a module exporting 'inttypes.h'
#include <inttypes.h>
         ^
1 error generated.

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

Quuxplusone commented 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.

Quuxplusone commented 3 years ago

Attached inttypes.diff (2534 bytes, text/plain): Possible fix with a test case

Quuxplusone commented 3 years ago

The test case looks fine to me, though, as you note, the supporting files do cause failures in other test cases.

Quuxplusone commented 3 years ago

Attached possible-fix-approach.diff (1120 bytes, text/plain): Possible fix for resource directory injection

Quuxplusone commented 3 years ago

I'm sorry, but due to other obligations I'm not able to spend time on the related issue your test uncovered.