Skip to content

(draft) Build fails Windows 32-bit executable with MinGW #8

@verylowfreq

Description

@verylowfreq

System information

  • SolveSpace version: c65e31b
  • Operating system: Build on Ubuntu 22.04.1 LTS (on WSL2)

Expected behavior

Actual behavior

Build fails with followgin error.

It seems to use SSE2 instructions but compiler not allowed.

[ 90%] Building CXX object extlib/angle/CMakeFiles/ANGLE.dir/src/libANGLE/renderer/d3d/RendererD3D.cpp.ob     [264/9194]
[ 91%] Building CXX object extlib/angle/CMakeFiles/ANGLE.dir/src/libANGLE/renderer/d3d/RenderTargetD3D.cpp.obj          In file included from /usr/lib/gcc/i686-w64-mingw32/10-win32/include/xmmintrin.h:1316,                                                   from /usr/lib/gcc/i686-w64-mingw32/10-win32/include/immintrin.h:29,                                                     from /usr/lib/gcc/i686-w64-mingw32/10-win32/include/x86intrin.h:32,                                                     from /usr/share/mingw-w64/include/intrin.h:73,                                                                          from /home/user/src/solvespace-solvespace/extlib/angle/src/common/platform.h:48,                                    from /home/user/src/solvespace-solvespace/extlib/angle/src/common/angleutils.h:12,                                  from /home/user/src/solvespace-solvespace/extlib/angle/src/common/debug.h:16,                                       from /home/user/src/solvespace-solvespace/extlib/angle/src/libANGLE/RefCountObject.h:15,
                 from /home/user/src/solvespace-solvespace/extlib/angle/src/libANGLE/angletypes.h:13,
                 from /home/user/src/solvespace-solvespace/extlib/angle/src/libANGLE/renderer/d3d/loadimage.h:12,
                 from /home/user/src/solvespace-solvespace/extlib/angle/src/libANGLE/renderer/d3d/loadimageSSE2.cpp:11:
/usr/lib/gcc/i686-w64-mingw32/10-win32/include/emmintrin.h: In function ‘void rx::LoadA8ToBGRA8_SSE2(size_t, size_t, siz                                                                       ‘
e_t, const uint8_t*, size_t, size_t, uint8_t*, size_t, size_t)’:
/usr/lib/gcc/i686-w64-mingw32/10-win32/include/emmintrin.h:770’: error: inlining failed in call to ‘always_inline’ ‘__m                                                                                                 ‘             ’ ‘128i _mm_setzero_si128()’: target specific option mismatch
  770 | _mm_setzero_si128 (void)
      | ^~~~~~~~~~~~~~~~~
/home/user/src/solvespace-solvespace/extlib/angle/src/libANGLE/renderer/d3d/loadimageSSE2.cpp:27:41: note: called from here
   27 |     __m128i zeroWide = _mm_setzero_si128();
      |                        ~~~~~~~~~~~~~~~~~^~

...

Additional information

In default, Visual Studio for 32-bit executable uses SSE2 (/arch:SSE2 is default for x86.)
https://docs.microsoft.com/en-us/cpp/build/reference/arch-x86?view=msvc-170

In MinGW for 32-bit executable, SSE2 is opt-in.

CMAKE_SYSTEM_PROCESSOR variable in CMakeList.txt is not set under MinGW. So existing "-msse2" related scripts is not working for MinGW 32-bit.

Patching

Use -mfpmath=sse -msse2 alywas under MinGW. For 32-bit, required. For 64-bit, not required but no side-effect.

(Including the patch of #7 )

Current:

if(MINGW)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static-libgcc")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++")
# Link 32 bit SolveSpace with --large-address-aware which allows it to access
# up to 3GB on a properly configured 32 bit Windows and up to 4GB on 64 bit.
# See https://msdn.microsoft.com/en-us/library/aa366778
set(CMAKE_EXE_LINKER_FLAGS "-Wl,--large-address-aware")
endif()

Suggest:

if(MINGW)
    set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS} -static-libgcc -mfpmath=sse -msse2")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++ -mfpmath=sse -msse2")
    if(CMAKE_SIZEOF_VOID_P EQUAL 4)
        # Link 32 bit SolveSpace with --large-address-aware which allows it to access
        # up to 3GB on a properly configured 32 bit Windows and up to 4GB on 64 bit.
        # See https://msdn.microsoft.com/en-us/library/aa366778
        set(CMAKE_EXE_LINKER_FLAGS "-Wl,--large-address-aware")
    endif()
endif()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions