On Windows, the default search paths for includes would put the CMake-found headers (<build dir>\lib\clang\3.1\include) before the OS headers. For the most part, this is fine. However, there are some header files that share names with the system headers, which are incorrect. For instance, immintrin.h is completely different from the SDK include. This causes miscompilations in surprising places because a system header will attempt to include one of these duplicates, and find the clang header instead of the other system header.
A simple test case of: #include <map> when building from MSVC demonstrates the issue. A user can work around this behavior by specifying -nobuiltininc on the command line, but that seems rather obtuse for such normal use cases. I've fixed this by changing the order that the headers are included from the toolchain. The SDK headers get added *before* the clang headers, and this resolves the issue. This patch does cause one regression test to fail (Modules\compiler_builtins.m). This is because the platform SDK intrinsics are differently structured from the ones that come with clang. The OS APIs expect the SDK intrinsics, but our tests seem to require our own intrinsics. I'm open to suggestions. Thanks! ~Aaron
WindowsToolChain.patch
Description: Binary data
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
