diff options
author | Vladislav Vaintroub <wlad@mariadb.com> | 2021-06-06 22:22:03 +0200 |
---|---|---|
committer | Vladislav Vaintroub <wlad@mariadb.com> | 2021-06-07 23:15:36 +0200 |
commit | 5ba4c4200ce1f9bce8c2fc1de5d97a131d3c2f37 (patch) | |
tree | e66b282a70dc2ae6ec3b376543dcd95dbfdf3fe4 | |
parent | 233590a48d78fb1c7e320c7131c4543c10a4face (diff) | |
download | mariadb-git-5ba4c4200ce1f9bce8c2fc1de5d97a131d3c2f37.tar.gz |
MDEV-25870 Windows - fix ARM64 cross-compilation
-rw-r--r-- | cmake/os/Windows.cmake | 8 | ||||
-rw-r--r-- | cmake/package_name.cmake | 5 | ||||
-rw-r--r-- | extra/wolfssl/CMakeLists.txt | 4 | ||||
-rw-r--r-- | include/my_byteorder.h | 4 | ||||
-rw-r--r-- | include/my_rdtsc.h | 4 | ||||
-rw-r--r-- | mysys/CMakeLists.txt | 2 | ||||
-rw-r--r-- | mysys/my_delete.c | 5 | ||||
-rw-r--r-- | mysys/stacktrace.c | 6 | ||||
-rw-r--r-- | storage/innobase/handler/ha_innodb.cc | 2 | ||||
-rw-r--r-- | storage/innobase/include/univ.i | 19 | ||||
-rw-r--r-- | storage/rocksdb/CMakeLists.txt | 3 |
11 files changed, 45 insertions, 17 deletions
diff --git a/cmake/os/Windows.cmake b/cmake/os/Windows.cmake index 73463ef2833..232560ff7b1 100644 --- a/cmake/os/Windows.cmake +++ b/cmake/os/Windows.cmake @@ -24,6 +24,14 @@ INCLUDE (CheckCSourceRuns) INCLUDE (CheckSymbolExists) INCLUDE (CheckTypeSize) +IF(MSVC) + IF(CMAKE_CXX_COMPILER_ARCHITECTURE_ID STREQUAL ARM64) + SET(MSVC_ARM64 1) + SET(MSVC_INTEL 0) + ELSE() + SET(MSVC_INTEL 1) + ENDIF() +ENDIF() # avoid running system checks by using pre-cached check results # system checks are expensive on VS since every tiny program is to be compiled in diff --git a/cmake/package_name.cmake b/cmake/package_name.cmake index d14bf1f526e..21a08401a44 100644 --- a/cmake/package_name.cmake +++ b/cmake/package_name.cmake @@ -38,7 +38,10 @@ IF(NOT VERSION) SET(NEED_DASH_BETWEEN_PLATFORM_AND_MACHINE 0) SET(DEFAULT_PLATFORM "win") IF(64BIT) - SET(DEFAULT_MACHINE "x64") + STRING(TOLOWER "${CMAKE_C_COMPILER_ARCHITECTURE_ID}" DEFAULT_MACHINE) + IF(NOT DEFAULT_MACHINE) + SET(DEFAULT_MACHINE "x64") + ENDIF() ELSE() SET(DEFAULT_MACHINE "32") ENDIF() diff --git a/extra/wolfssl/CMakeLists.txt b/extra/wolfssl/CMakeLists.txt index c99fb155dd6..c3cd0d52fbf 100644 --- a/extra/wolfssl/CMakeLists.txt +++ b/extra/wolfssl/CMakeLists.txt @@ -1,4 +1,4 @@ -IF(MSVC) +IF(MSVC_INTEL) PROJECT(wolfssl C ASM_MASM) ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64") PROJECT(wolfssl C ASM) @@ -7,7 +7,7 @@ ELSE() ENDIF() IF(CMAKE_SIZEOF_VOID_P MATCHES 8) -IF(MSVC) +IF(MSVC_INTEL) SET(WOLFSSL_INTELASM ON) SET(WOLFSSL_X86_64_BUILD 1) SET(HAVE_INTEL_RDSEED 1) diff --git a/include/my_byteorder.h b/include/my_byteorder.h index abdf19a3632..a70330ca47c 100644 --- a/include/my_byteorder.h +++ b/include/my_byteorder.h @@ -31,10 +31,10 @@ format (low byte first). There are 'korr' (assume 'corrector') variants for integer types, but 'get' (assume 'getter') for floating point types. */ -#if (defined(__i386__) || defined(_WIN32)) && !defined(WITH_UBSAN) +#if (defined(__i386__) || defined(_M_IX86)) && !defined(WITH_UBSAN) #define MY_BYTE_ORDER_ARCH_OPTIMIZED #include "byte_order_generic_x86.h" -#elif defined(__x86_64__) && !defined(WITH_UBSAN) +#elif (defined(__x86_64__) || defined (_M_X64)) && !defined(WITH_UBSAN) #include "byte_order_generic_x86_64.h" #else #include "byte_order_generic.h" diff --git a/include/my_rdtsc.h b/include/my_rdtsc.h index 33d722764d4..5a6f4a87012 100644 --- a/include/my_rdtsc.h +++ b/include/my_rdtsc.h @@ -130,8 +130,10 @@ static inline ulonglong my_timer_cycles(void) { # if __has_builtin(__builtin_readcyclecounter) && !defined (__aarch64__) return __builtin_readcyclecounter(); -# elif defined _WIN32 || defined __i386__ || defined __x86_64__ +# elif defined _M_IX86 || defined _M_X64 || defined __i386__ || defined __x86_64__ return __rdtsc(); +#elif defined _M_ARM64 + return _ReadStatusReg(ARM64_CNTVCT); # elif defined(__INTEL_COMPILER) && defined(__ia64__) && defined(HAVE_IA64INTRIN_H) return (ulonglong) __getReg(_IA64_REG_AR_ITC); /* (3116) */ #elif defined(__GNUC__) && defined(__ia64__) diff --git a/mysys/CMakeLists.txt b/mysys/CMakeLists.txt index 5a4eeeba603..269369360f1 100644 --- a/mysys/CMakeLists.txt +++ b/mysys/CMakeLists.txt @@ -58,7 +58,7 @@ IF (WIN32) my_win_popen.cc) ENDIF() -IF(MSVC) +IF(MSVC_INTEL) SET(MYSYS_SOURCES ${MYSYS_SOURCES} crc32/crc32_x86.c) IF(CMAKE_SIZEOF_VOID_P EQUAL 8) SET (MYSYS_SOURCES ${MYSYS_SOURCES} crc32/crc32c_amd64.cc) diff --git a/mysys/my_delete.c b/mysys/my_delete.c index b9b0e112077..d322f302ea7 100644 --- a/mysys/my_delete.c +++ b/mysys/my_delete.c @@ -80,7 +80,8 @@ int my_delete(const char *name, myf MyFlags) a file to unique name. Symbolic link are deleted without renaming. Directories are not deleted. - */ +*/ +#include <my_rdtsc.h> static int my_win_unlink(const char *name) { HANDLE handle= INVALID_HANDLE_VALUE; @@ -166,7 +167,7 @@ static int my_win_unlink(const char *name) goto error; } - tsc= __rdtsc(); + tsc= my_timer_cycles(); my_snprintf(unique_filename,sizeof(unique_filename),"%s.%llx.deleted", name, tsc); if (!MoveFile(name, unique_filename)) diff --git a/mysys/stacktrace.c b/mysys/stacktrace.c index 250d0bdbea2..844d8a0b28f 100644 --- a/mysys/stacktrace.c +++ b/mysys/stacktrace.c @@ -587,8 +587,12 @@ void my_print_stacktrace(uchar* unused1, ulong unused2, my_bool silent) frame.AddrFrame.Offset= context.Rbp; frame.AddrPC.Offset= context.Rip; frame.AddrStack.Offset= context.Rsp; +#elif defined(_M_ARM64) + machine= IMAGE_FILE_MACHINE_ARM64; + frame.AddrFrame.Offset= context.Fp; + frame.AddrPC.Offset= context.Pc; + frame.AddrStack.Offset= context.Sp; #else - /*There is currently no need to support IA64*/ #pragma error ("unsupported architecture") #endif diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 53c7eae7c09..ce469e49bce 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -2475,7 +2475,7 @@ __forceinline unsigned int nlz (ulonglong x) return (unsigned int) n ^ m; #endif #elif defined(_M_ARM64) - return _CountLeadingZeros(x); + return _CountLeadingZeros64(x); #endif } #else diff --git a/storage/innobase/include/univ.i b/storage/innobase/include/univ.i index 5bfed89b6d7..eb32e91298d 100644 --- a/storage/innobase/include/univ.i +++ b/storage/innobase/include/univ.i @@ -487,14 +487,21 @@ it is read or written. */ # define UNIV_PREFETCH_RW(addr) ((void) 0) # endif /* COMPILER_HINTS */ -# elif defined _WIN32 && defined COMPILER_HINTS -# include <xmmintrin.h> +# elif defined _MSC_VER && defined COMPILER_HINTS # define UNIV_EXPECT(expr,value) (expr) # define UNIV_LIKELY_NULL(expr) (expr) -// __MM_HINT_T0 - (temporal data) -// prefetch data into all levels of the cache hierarchy. -# define UNIV_PREFETCH_R(addr) _mm_prefetch((char *) addr, _MM_HINT_T0) -# define UNIV_PREFETCH_RW(addr) _mm_prefetch((char *) addr, _MM_HINT_T0) +# if defined _M_IX86 || defined _M_X64 + // __MM_HINT_T0 - (temporal data) + // prefetch data into all levels of the cache hierarchy. +# define UNIV_PREFETCH_R(addr) _mm_prefetch((char *) addr, _MM_HINT_T0) +# define UNIV_PREFETCH_RW(addr) _mm_prefetch((char *) addr, _MM_HINT_T0) +# elif defined _M_ARM64 +# define UNIV_PREFETCH_R(addr) __prefetch(addr) +# define UNIV_PREFETCH_RW(addr) __prefetch(addr) +# else +# define UNIV_PREFETCH_R ((void) 0) +# define UNIV_PREFETCH_RW(addr) ((void) 0) +# endif #else /* Dummy versions of the macros */ # define UNIV_EXPECT(expr,value) (expr) diff --git a/storage/rocksdb/CMakeLists.txt b/storage/rocksdb/CMakeLists.txt index c2fc8de8149..be687478b9b 100644 --- a/storage/rocksdb/CMakeLists.txt +++ b/storage/rocksdb/CMakeLists.txt @@ -42,6 +42,9 @@ endif() IF (WIN32 AND CMAKE_SIZEOF_VOID_P EQUAL 4) SKIP_ROCKSDB_PLUGIN("32-Bit Windows are temporarily disabled") ENDIF() +IF(MSVC_ARM64) + SKIP_ROCKSDB_PLUGIN("Windows ARM64 not supported") +ENDIF() # This plugin needs recent C++ compilers (it is using C++11 features) # Skip build for the old compilers |