Summary: | declarations in xmmintrin.h conflict with mingw-w64 intrin.h in c++ mode | ||
---|---|---|---|
Product: | gcc | Reporter: | Erik van Pienbroek <erik-gcc-bugzilla> |
Component: | target | Assignee: | Not yet assigned to anyone <unassigned> |
Status: | UNCONFIRMED --- | ||
Severity: | normal | CC: | jacek, jason, jason, ktietz, mkretz, net147, nightstrike, vanboxem.ruben |
Priority: | P3 | Keywords: | rejects-valid |
Version: | 4.8.0 | ||
Target Milestone: | --- | ||
Host: | Target: | i686-w64-mingw32 | |
Build: | gcc 4.8 20130106 snapshot, r194954 | Known to work: | |
Known to fail: | Last reconfirmed: | ||
Attachments: | Add extern "C" modifier in intrinsics headers for C++ |
Description
Erik van Pienbroek
2013-01-18 22:04:54 UTC
I also just came across this issue with GCC 4.7.2 on Windows. It appears that all the intrin.h headers are missing the extern "C" part. Since the functions are always inline and thus the symbols never show up anywhere this has not been a problem before. But now that another header declares those functions a second time something must be done. Maybe what also needs to happen is that in the mingw environment the intrin.h header does not declare the SSE/AVX intrinsics, but instead includes the proper xxxintrin.h headers. In any case, I believe the intrinsics should always be declared with C linkage. I can reproduce this with MinGW-w64 GCC 4.8.0 x86 DW2/SJLJ. It does not occur with MinGW-w64 GCC 4.8.0 x86_64 SEH/SJLJ. Issue is an old one ... I had even posted already a patch for this subject. See as reference http://gcc.gnu.org/ml/gcc-patches/2010-03/msg00033.html link. The only way to solve this in a sane way is by moving it into C namespace for C++. Created attachment 29719 [details]
Add extern "C" modifier in intrinsics headers for C++
Can confirm that the patch fixes the issue when applied locally. The issue is still there with 4.8.1 . It understand that the discussion on Kai Tietz' original patch has stalled ... Any suggestion on how we can move this forward? Can this patch please be either applied or rejected for a valid reason? As far as I understand, something might be "broken" in the compiler wrt inlining: http://gcc.gnu.org/ml/gcc-patches/2010-03/msg00059.html which affects this issue indirectly. Nearly three years have passed since the original discussion. It would be great if this could be fixed in GCC so that we wouldn't need to work around linkage differences in headers, but this should not be a problem for mingw-w64 since rev 6303, which added a work around to intrin.h. Does mingw provide its own SSE/MMX intrinsic implementations? Can mingw just include <xmmintrin.h> where SSE/MMX instrincis is needed? (In reply to H.J. Lu from comment #9) > Does mingw provide its own SSE/MMX intrinsic implementations? > Can mingw just include <xmmintrin.h> where SSE/MMX instrincis > is needed? Right. Why does mingw need to declare these functions itself? Qt 5.2.1 cannot be build in 32 bit with mingw-w64 4.8.2 because of this bug. Why is it not fixed? (In reply to tim.lebedkov from comment #11) > Qt 5.2.1 cannot be build in 32 bit with mingw-w64 4.8.2 because of this bug. > Why is it not fixed? A fix for this issue was applied in the intrin.h of mingw-w64 v3.1.0 (which was released in January 2014). Here's the commit in question: http://sourceforge.net/p/mingw-w64/code/6303/ You might want to consider updating your toolchain. I can't judge whether the fix applied in mingw-w64 is correct or whether something needs to be changed in gcc itself as well. Therefore I'm leaving this bug open for now. If the gcc devs think otherwise feel free to close this bug. Qt5 itself can now be built properly against gcc 4.8.2 and mingw-w64 v3.1.0 without any issues. |