[cfe-commits] [PATCH] Fixing include order for Windows

Eli Friedman eli.friedman at gmail.com
Sun Feb 19 14:45:55 PST 2012


On Sun, Feb 19, 2012 at 10:28 AM, Aaron Ballman <aaron at aaronballman.com> wrote:
> 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.

If on Windows, we specifically need the OS version of immintrin.h, we
should modify our version to forward to it; completely ignoring the
builtin headers is a bad idea (for example,
http://llvm.org/bugs/show_bug.cgi?id=11918 is a miscompile caused by
pulling in the wrong version of stdarg.h).

-Eli




More information about the cfe-commits mailing list