From 574249cd721a3cdbb79b6e457384a55827856b6a Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Thu, 21 May 2020 22:17:42 +0200 Subject: Allow FMV SSE4.2 detection to succeed on clang MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As the builtins were used in the feature test also in the default branch clang fails to compile the test helpfully complaining that you need to compile with sse4.2 to use that while on gcc it is optimized out as unused code and produces only a warning for that… removing the code from the default branch fixes this problem, but we adapt the code some more to avoid compilers optimizing it out in the future just in case. --- CMake/CheckCxxTarget.cmake | 7 ++++--- CMakeLists.txt | 4 ++-- apt-pkg/pkgcache.cc | 3 --- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/CMake/CheckCxxTarget.cmake b/CMake/CheckCxxTarget.cmake index 373c0be4c..17c32bfac 100644 --- a/CMake/CheckCxxTarget.cmake +++ b/CMake/CheckCxxTarget.cmake @@ -25,11 +25,12 @@ # SOFTWARE. +include(CheckCXXSourceCompiles) function(check_cxx_target var target code) check_cxx_source_compiles( " - __attribute__((target(\"${target}\"))) static int foo() { ${code} return 1; } - __attribute__((target(\"default\"))) static int foo() { ${code} return 0; } - int main() { return foo(); } + __attribute__((target(\"${target}\"))) static int foo(int i) { return ${code}; } + __attribute__((target(\"default\"))) static int foo(int i) { return i; } + int main(int i, char **) { return foo(i); } " ${var}) endfunction() diff --git a/CMakeLists.txt b/CMakeLists.txt index 9df96ee85..115041f54 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -198,8 +198,8 @@ endif() # Check multiversioning include(CheckCxxTarget) -check_cxx_target(HAVE_FMV_SSE42_AND_CRC32 "sse4.2" "__builtin_ia32_crc32si(0, 1llu);") -check_cxx_target(HAVE_FMV_SSE42_AND_CRC32DI "sse4.2" "__builtin_ia32_crc32di(0, 1llu);") +check_cxx_target(HAVE_FMV_SSE42_AND_CRC32 "sse4.2" "__builtin_ia32_crc32si(0,i)|__builtin_ia32_crc32hi(0,i)|__builtin_ia32_crc32qi(0,i)") +check_cxx_target(HAVE_FMV_SSE42_AND_CRC32DI "sse4.2" "__builtin_ia32_crc32di(0,i)") # Configure some variables like package, version and architecture. set(PACKAGE ${PROJECT_NAME}) diff --git a/apt-pkg/pkgcache.cc b/apt-pkg/pkgcache.cc index 02448a073..7eb5ab10b 100644 --- a/apt-pkg/pkgcache.cc +++ b/apt-pkg/pkgcache.cc @@ -214,8 +214,6 @@ map_id_t pkgCache::sHash(StringView Str) const return Hash % HeaderP->GetHashTableSize(); } -#if defined(HAVE_FMV_SSE42_AND_CRC32) - #ifdef HAVE_FMV_SSE42_AND_CRC32 __attribute__((target("sse4.2"))) static uint32_t hash32(uint32_t crc32, const unsigned char *input, size_t size) { @@ -253,7 +251,6 @@ __attribute__((target("sse4.2"))) static uint32_t hash32(uint32_t crc32, const u crc32 ^= 0xffffffffU; return crc32; } -#endif __attribute__((target("default"))) #endif -- cgit v1.2.3