Fix compilation on Apple Silicon (#7714)

Summary:
Closes - https://github.com/facebook/rocksdb/issues/7710

I tested this on an Apple DTK (Developer Transition Kit) with an Apple A12Z Bionic CPU and macOS Big Sur (11.0.1).

Previously the arm64 specific CRC optimisations were limited to Linux only OS... Well now Apple Silicon is also arm64 but runs macOS ;-)

Pull Request resolved: https://github.com/facebook/rocksdb/pull/7714

Reviewed By: ltamasi

Differential Revision: D25287349

Pulled By: pdillinger

fbshipit-source-id: 639b168bf0ac2652907531e9604936ac4974b577
main
Adam Retter 4 years ago committed by Facebook GitHub Bot
parent eb5a8c06dd
commit ee4bd4780b
  1. 8
      util/crc32c.cc
  2. 8
      util/crc32c_arm64.cc
  3. 4
      util/crc32c_arm64.h

@ -41,7 +41,7 @@
#endif #endif
#if defined(__linux__) && defined(HAVE_ARM64_CRC) #if defined(HAVE_ARM64_CRC)
bool pmull_runtime_flag = false; bool pmull_runtime_flag = false;
#endif #endif
@ -478,7 +478,7 @@ static bool isAltiVec() {
} }
#endif #endif
#if defined(__linux__) && defined(HAVE_ARM64_CRC) #if defined(HAVE_ARM64_CRC)
uint32_t ExtendARMImpl(uint32_t crc, const char *buf, size_t size) { uint32_t ExtendARMImpl(uint32_t crc, const char *buf, size_t size) {
return crc32c_arm64(crc, (const unsigned char *)buf, size); return crc32c_arm64(crc, (const unsigned char *)buf, size);
} }
@ -498,7 +498,7 @@ std::string IsFastCrc32Supported() {
has_fast_crc = false; has_fast_crc = false;
arch = "PPC"; arch = "PPC";
#endif #endif
#elif defined(__linux__) && defined(HAVE_ARM64_CRC) #elif defined(HAVE_ARM64_CRC)
if (crc32c_runtime_check()) { if (crc32c_runtime_check()) {
has_fast_crc = true; has_fast_crc = true;
arch = "Arm64"; arch = "Arm64";
@ -1231,7 +1231,7 @@ uint32_t crc32c_3way(uint32_t crc, const char* buf, size_t len) {
static inline Function Choose_Extend() { static inline Function Choose_Extend() {
#ifdef HAVE_POWER8 #ifdef HAVE_POWER8
return isAltiVec() ? ExtendPPCImpl : ExtendImpl<Slow_CRC32>; return isAltiVec() ? ExtendPPCImpl : ExtendImpl<Slow_CRC32>;
#elif defined(__linux__) && defined(HAVE_ARM64_CRC) #elif defined(HAVE_ARM64_CRC)
if(crc32c_runtime_check()) { if(crc32c_runtime_check()) {
pmull_runtime_flag = crc32c_pmull_runtime_check(); pmull_runtime_flag = crc32c_pmull_runtime_check();
return ExtendARMImpl; return ExtendARMImpl;

@ -5,9 +5,11 @@
#include "util/crc32c_arm64.h" #include "util/crc32c_arm64.h"
#if defined(__linux__) && defined(HAVE_ARM64_CRC) #if defined(HAVE_ARM64_CRC)
#if defined(__linux__)
#include <asm/hwcap.h> #include <asm/hwcap.h>
#endif
#ifdef ROCKSDB_AUXV_GETAUXVAL_PRESENT #ifdef ROCKSDB_AUXV_GETAUXVAL_PRESENT
#include <sys/auxv.h> #include <sys/auxv.h>
#endif #endif
@ -65,8 +67,8 @@ __attribute__((__no_sanitize__("alignment")))
__attribute__((__no_sanitize_undefined__)) __attribute__((__no_sanitize_undefined__))
#endif #endif
#endif #endif
uint32_t crc32c_arm64(uint32_t crc, unsigned char const *data, uint32_t
unsigned len) { crc32c_arm64(uint32_t crc, unsigned char const *data, size_t len) {
const uint8_t *buf8; const uint8_t *buf8;
const uint64_t *buf64 = (uint64_t *)data; const uint64_t *buf64 = (uint64_t *)data;
int length = (int)len; int length = (int)len;

@ -7,6 +7,7 @@
#define UTIL_CRC32C_ARM64_H #define UTIL_CRC32C_ARM64_H
#include <cinttypes> #include <cinttypes>
#include <cstddef>
#if defined(__aarch64__) || defined(__AARCH64__) #if defined(__aarch64__) || defined(__AARCH64__)
@ -33,7 +34,8 @@
PREF4X64L1(buffer, (PREF_OFFSET), 8) \ PREF4X64L1(buffer, (PREF_OFFSET), 8) \
PREF4X64L1(buffer, (PREF_OFFSET), 12) PREF4X64L1(buffer, (PREF_OFFSET), 12)
extern uint32_t crc32c_arm64(uint32_t crc, unsigned char const *data, unsigned len); extern uint32_t crc32c_arm64(uint32_t crc, unsigned char const *data,
size_t len);
extern uint32_t crc32c_runtime_check(void); extern uint32_t crc32c_runtime_check(void);
extern bool crc32c_pmull_runtime_check(void); extern bool crc32c_pmull_runtime_check(void);

Loading…
Cancel
Save