build: fix link error for _BitScanForward64 (#28173)

Problem: The usage of `_BitScanForward64` causes linking to fail on some systems.
Solution: Correctly check if it exists using `check_c_source_compiles`.
This commit is contained in:
Famiu Haque 2024-04-05 07:56:35 +06:00 committed by GitHub
parent dc69c475a5
commit 75b80516d5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 13 additions and 1 deletions

View File

@ -79,6 +79,17 @@ int main(void)
} }
" HAVE_PWD_FUNCS) " HAVE_PWD_FUNCS)
check_c_source_compiles("
#include <intrin.h>
int main(void)
{
unsigned long index;
unsigned char mask = 0x8000;
_BitScanForward64(&index, mask);
return 0;
}
" HAVE_BITSCANFORWARD64)
if(CMAKE_SYSTEM_NAME STREQUAL "SunOS") if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
check_c_source_compiles(" check_c_source_compiles("

View File

@ -52,3 +52,4 @@
#cmakedefine HAVE_EXECINFO_BACKTRACE #cmakedefine HAVE_EXECINFO_BACKTRACE
#cmakedefine HAVE_BUILTIN_ADD_OVERFLOW #cmakedefine HAVE_BUILTIN_ADD_OVERFLOW
#cmakedefine HAVE_WIMPLICIT_FALLTHROUGH_FLAG #cmakedefine HAVE_WIMPLICIT_FALLTHROUGH_FLAG
#cmakedefine HAVE_BITSCANFORWARD64

View File

@ -56,7 +56,7 @@ int xctz(uint64_t x)
// Use compiler builtin if possible. // Use compiler builtin if possible.
#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 4)) #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 4))
return __builtin_ctzll(x); return __builtin_ctzll(x);
#elif defined(_MSC_VER) #elif defined(HAVE_BITSCANFORWARD64)
unsigned long index; unsigned long index;
_BitScanForward64(&index, x); _BitScanForward64(&index, x);
return (int)index; return (int)index;