cmake: rework logic to apply -msse2, -msse3, -mssse3 to specific files
authorMike Gilbert <floppym@gentoo.org>
Sun, 24 Dec 2017 21:58:07 +0000 (16:58 -0500)
committerMike Gilbert <floppym@gentoo.org>
Fri, 29 Dec 2017 19:06:49 +0000 (14:06 -0500)
If we apply -mssse3 to files that don't need it, gcc may automagically
generate instructions that will not run on certain CPUs. This breaks the
runtime feature detection code (IsProcessorFeaturePresent).

Fixes: https://github.com/FreeRDP/FreeRDP/issues/4308

libfreerdp/CMakeLists.txt

index 605b5f2..fd65bb8 100644 (file)
@@ -210,16 +210,25 @@ set(PRIMITIVES_SRCS
        primitives/primitives.c
        primitives/prim_internal.h)
 
-set(PRIMITIVES_OPT_SRCS
+set(PRIMITIVES_SSE2_SRCS
+       primitives/prim_colors_opt.c
+       primitives/prim_set_opt.c)
+
+set(PRIMITIVES_SSE3_SRCS
        primitives/prim_add_opt.c
-       primitives/prim_andor_opt.c
        primitives/prim_alphaComp_opt.c
-       primitives/prim_colors_opt.c
-       primitives/prim_set_opt.c
-       primitives/prim_shift_opt.c
+       primitives/prim_andor_opt.c
+       primitives/prim_shift_opt.c)
+
+set(PRIMITIVES_SSSE3_SRCS
        primitives/prim_sign_opt.c
-       primitives/prim_YUV_opt.c
-       primitives/prim_YCoCg_opt.c)
+       primitives/prim_YCoCg_opt.c
+       primitives/prim_YUV_opt.c)
+
+set(PRIMITIVES_OPT_SRCS
+       ${PRIMITIVES_SSE2_SRCS}
+       ${PRIMITIVES_SSE3_SRCS}
+       ${PRIMITIVES_SSSE3_SRCS})
 
 freerdp_definition_add(-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE})
 
@@ -233,24 +242,27 @@ if(WITH_IPP)
 endif()
 
 if(WITH_SSE2)
-       if(CMAKE_COMPILER_IS_GNUCC)
-               set(OPTIMIZATION "${OPTIMIZATION} -msse2 -mssse3 -Wdeclaration-after-statement")
+       if(CMAKE_COMPILER_IS_GNUCC OR ${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
+               set_source_files_properties(${PRIMITIVES_SSE2_SRCS}
+                       PROPERTIES COMPILE_FLAGS "${OPTIMIZATION} -msse2")
+               set_source_files_properties(${PRIMITIVES_SSE3_SRCS}
+                       PROPERTIES COMPILE_FLAGS "${OPTIMIZATION} -msse3")
+               set_source_files_properties(${PRIMITIVES_SSSE3_SRCS}
+                       PROPERTIES COMPILE_FLAGS "${OPTIMIZATION} -mssse3")
        endif()
 
        if(MSVC)
-               set(OPTIMIZATION "${OPTIMIZATION} /arch:SSE2")
+               set_source_files_properties(${PRIMITIVES_OPT_SRCS}
+                       PROPERTIES COMPILE_FLAGS "${OPTIMIZATION} /arch:SSE2")
        endif()
 elseif(WITH_NEON)
        if(CMAKE_COMPILER_IS_GNUCC)
-               set(OPTIMIZATION "${OPTIMIZATION} -mfpu=neon")
+               set_source_files_properties(${PRIMITIVES_OPT_SRCS}
+                       PROPERTIES COMPILE_FLAGS "${OPTIMIZATION} -mfpu=neon")
        endif()
        # TODO: Add MSVC equivalent
 endif()
 
-if(DEFINED OPTIMIZATION)
-       set_source_files_properties(${PRIMITIVES_OPT_SRCS} PROPERTIES COMPILE_FLAGS ${OPTIMIZATION})
-endif()
-
 set(PRIMITIVES_SRCS ${PRIMITIVES_SRCS} ${PRIMITIVES_OPT_SRCS})
 
 freerdp_module_add(${PRIMITIVES_SRCS})