summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladislav Vaintroub <wlad@mariadb.com>2021-06-06 22:22:03 +0200
committerVladislav Vaintroub <wlad@mariadb.com>2021-06-07 23:15:36 +0200
commit5ba4c4200ce1f9bce8c2fc1de5d97a131d3c2f37 (patch)
treee66b282a70dc2ae6ec3b376543dcd95dbfdf3fe4
parent233590a48d78fb1c7e320c7131c4543c10a4face (diff)
downloadmariadb-git-5ba4c4200ce1f9bce8c2fc1de5d97a131d3c2f37.tar.gz
MDEV-25870 Windows - fix ARM64 cross-compilation
-rw-r--r--cmake/os/Windows.cmake8
-rw-r--r--cmake/package_name.cmake5
-rw-r--r--extra/wolfssl/CMakeLists.txt4
-rw-r--r--include/my_byteorder.h4
-rw-r--r--include/my_rdtsc.h4
-rw-r--r--mysys/CMakeLists.txt2
-rw-r--r--mysys/my_delete.c5
-rw-r--r--mysys/stacktrace.c6
-rw-r--r--storage/innobase/handler/ha_innodb.cc2
-rw-r--r--storage/innobase/include/univ.i19
-rw-r--r--storage/rocksdb/CMakeLists.txt3
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