Fix Compilation on ppc64le using Clang 11 (#7713)
Summary:
Closes https://github.com/facebook/rocksdb/issues/7691
The optimised CRC code for PPC64le which was originally imported in https://github.com/facebook/rocksdb/pull/2353 is not compatible with Clang 11. It looks like the code most likely originated from https://github.com/antonblanchard/crc32-vpmsum.
The code relied on a GCC header file `ppc-asm.h` which is not available in Clang.
To solve this, I have taken the same approach as the the upstream project from which the CRC code came ffc8018efc (diff-ec3e62c56fbcddeb07230f2a4673c1abd7f0f1cc8e48a2aa560056cfc1b25d60)
and simply imported a copy of the GCC header file into our code-base which will be used when Clang is the compiler on pcc64le.
**NOTE**: The new file `util/ppc-asm.h` may have licensing implications which I guess need to be approved by RocksDB/Facebook before this is merged
Pull Request resolved: https://github.com/facebook/rocksdb/pull/7713
Reviewed By: jay-zhuang
Differential Revision: D25222645
Pulled By: pdillinger
fbshipit-source-id: e3fec9136f26ce1eb7a027048bcf77a6cb3c769c
This commit is contained in:
parent
0b06af9146
commit
b937be3779
390
third-party/gcc/ppc-asm.h
vendored
Normal file
390
third-party/gcc/ppc-asm.h
vendored
Normal file
@ -0,0 +1,390 @@
|
|||||||
|
/* PowerPC asm definitions for GNU C.
|
||||||
|
|
||||||
|
Copyright (C) 2002-2020 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of GCC.
|
||||||
|
|
||||||
|
GCC is free software; you can redistribute it and/or modify it under
|
||||||
|
the terms of the GNU General Public License as published by the Free
|
||||||
|
Software Foundation; either version 3, or (at your option) any later
|
||||||
|
version.
|
||||||
|
|
||||||
|
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
Under Section 7 of GPL version 3, you are granted additional
|
||||||
|
permissions described in the GCC Runtime Library Exception, version
|
||||||
|
3.1, as published by the Free Software Foundation.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License and
|
||||||
|
a copy of the GCC Runtime Library Exception along with this program;
|
||||||
|
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||||
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Under winnt, 1) gas supports the following as names and 2) in particular
|
||||||
|
defining "toc" breaks the FUNC_START macro as ".toc" becomes ".2" */
|
||||||
|
|
||||||
|
#define r0 0
|
||||||
|
#define sp 1
|
||||||
|
#define toc 2
|
||||||
|
#define r3 3
|
||||||
|
#define r4 4
|
||||||
|
#define r5 5
|
||||||
|
#define r6 6
|
||||||
|
#define r7 7
|
||||||
|
#define r8 8
|
||||||
|
#define r9 9
|
||||||
|
#define r10 10
|
||||||
|
#define r11 11
|
||||||
|
#define r12 12
|
||||||
|
#define r13 13
|
||||||
|
#define r14 14
|
||||||
|
#define r15 15
|
||||||
|
#define r16 16
|
||||||
|
#define r17 17
|
||||||
|
#define r18 18
|
||||||
|
#define r19 19
|
||||||
|
#define r20 20
|
||||||
|
#define r21 21
|
||||||
|
#define r22 22
|
||||||
|
#define r23 23
|
||||||
|
#define r24 24
|
||||||
|
#define r25 25
|
||||||
|
#define r26 26
|
||||||
|
#define r27 27
|
||||||
|
#define r28 28
|
||||||
|
#define r29 29
|
||||||
|
#define r30 30
|
||||||
|
#define r31 31
|
||||||
|
|
||||||
|
#define cr0 0
|
||||||
|
#define cr1 1
|
||||||
|
#define cr2 2
|
||||||
|
#define cr3 3
|
||||||
|
#define cr4 4
|
||||||
|
#define cr5 5
|
||||||
|
#define cr6 6
|
||||||
|
#define cr7 7
|
||||||
|
|
||||||
|
#define f0 0
|
||||||
|
#define f1 1
|
||||||
|
#define f2 2
|
||||||
|
#define f3 3
|
||||||
|
#define f4 4
|
||||||
|
#define f5 5
|
||||||
|
#define f6 6
|
||||||
|
#define f7 7
|
||||||
|
#define f8 8
|
||||||
|
#define f9 9
|
||||||
|
#define f10 10
|
||||||
|
#define f11 11
|
||||||
|
#define f12 12
|
||||||
|
#define f13 13
|
||||||
|
#define f14 14
|
||||||
|
#define f15 15
|
||||||
|
#define f16 16
|
||||||
|
#define f17 17
|
||||||
|
#define f18 18
|
||||||
|
#define f19 19
|
||||||
|
#define f20 20
|
||||||
|
#define f21 21
|
||||||
|
#define f22 22
|
||||||
|
#define f23 23
|
||||||
|
#define f24 24
|
||||||
|
#define f25 25
|
||||||
|
#define f26 26
|
||||||
|
#define f27 27
|
||||||
|
#define f28 28
|
||||||
|
#define f29 29
|
||||||
|
#define f30 30
|
||||||
|
#define f31 31
|
||||||
|
|
||||||
|
#ifdef __VSX__
|
||||||
|
#define f32 32
|
||||||
|
#define f33 33
|
||||||
|
#define f34 34
|
||||||
|
#define f35 35
|
||||||
|
#define f36 36
|
||||||
|
#define f37 37
|
||||||
|
#define f38 38
|
||||||
|
#define f39 39
|
||||||
|
#define f40 40
|
||||||
|
#define f41 41
|
||||||
|
#define f42 42
|
||||||
|
#define f43 43
|
||||||
|
#define f44 44
|
||||||
|
#define f45 45
|
||||||
|
#define f46 46
|
||||||
|
#define f47 47
|
||||||
|
#define f48 48
|
||||||
|
#define f49 49
|
||||||
|
#define f50 50
|
||||||
|
#define f51 51
|
||||||
|
#define f52 52
|
||||||
|
#define f53 53
|
||||||
|
#define f54 54
|
||||||
|
#define f55 55
|
||||||
|
#define f56 56
|
||||||
|
#define f57 57
|
||||||
|
#define f58 58
|
||||||
|
#define f59 59
|
||||||
|
#define f60 60
|
||||||
|
#define f61 61
|
||||||
|
#define f62 62
|
||||||
|
#define f63 63
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __ALTIVEC__
|
||||||
|
#define v0 0
|
||||||
|
#define v1 1
|
||||||
|
#define v2 2
|
||||||
|
#define v3 3
|
||||||
|
#define v4 4
|
||||||
|
#define v5 5
|
||||||
|
#define v6 6
|
||||||
|
#define v7 7
|
||||||
|
#define v8 8
|
||||||
|
#define v9 9
|
||||||
|
#define v10 10
|
||||||
|
#define v11 11
|
||||||
|
#define v12 12
|
||||||
|
#define v13 13
|
||||||
|
#define v14 14
|
||||||
|
#define v15 15
|
||||||
|
#define v16 16
|
||||||
|
#define v17 17
|
||||||
|
#define v18 18
|
||||||
|
#define v19 19
|
||||||
|
#define v20 20
|
||||||
|
#define v21 21
|
||||||
|
#define v22 22
|
||||||
|
#define v23 23
|
||||||
|
#define v24 24
|
||||||
|
#define v25 25
|
||||||
|
#define v26 26
|
||||||
|
#define v27 27
|
||||||
|
#define v28 28
|
||||||
|
#define v29 29
|
||||||
|
#define v30 30
|
||||||
|
#define v31 31
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __VSX__
|
||||||
|
#define vs0 0
|
||||||
|
#define vs1 1
|
||||||
|
#define vs2 2
|
||||||
|
#define vs3 3
|
||||||
|
#define vs4 4
|
||||||
|
#define vs5 5
|
||||||
|
#define vs6 6
|
||||||
|
#define vs7 7
|
||||||
|
#define vs8 8
|
||||||
|
#define vs9 9
|
||||||
|
#define vs10 10
|
||||||
|
#define vs11 11
|
||||||
|
#define vs12 12
|
||||||
|
#define vs13 13
|
||||||
|
#define vs14 14
|
||||||
|
#define vs15 15
|
||||||
|
#define vs16 16
|
||||||
|
#define vs17 17
|
||||||
|
#define vs18 18
|
||||||
|
#define vs19 19
|
||||||
|
#define vs20 20
|
||||||
|
#define vs21 21
|
||||||
|
#define vs22 22
|
||||||
|
#define vs23 23
|
||||||
|
#define vs24 24
|
||||||
|
#define vs25 25
|
||||||
|
#define vs26 26
|
||||||
|
#define vs27 27
|
||||||
|
#define vs28 28
|
||||||
|
#define vs29 29
|
||||||
|
#define vs30 30
|
||||||
|
#define vs31 31
|
||||||
|
#define vs32 32
|
||||||
|
#define vs33 33
|
||||||
|
#define vs34 34
|
||||||
|
#define vs35 35
|
||||||
|
#define vs36 36
|
||||||
|
#define vs37 37
|
||||||
|
#define vs38 38
|
||||||
|
#define vs39 39
|
||||||
|
#define vs40 40
|
||||||
|
#define vs41 41
|
||||||
|
#define vs42 42
|
||||||
|
#define vs43 43
|
||||||
|
#define vs44 44
|
||||||
|
#define vs45 45
|
||||||
|
#define vs46 46
|
||||||
|
#define vs47 47
|
||||||
|
#define vs48 48
|
||||||
|
#define vs49 49
|
||||||
|
#define vs50 50
|
||||||
|
#define vs51 51
|
||||||
|
#define vs52 52
|
||||||
|
#define vs53 53
|
||||||
|
#define vs54 54
|
||||||
|
#define vs55 55
|
||||||
|
#define vs56 56
|
||||||
|
#define vs57 57
|
||||||
|
#define vs58 58
|
||||||
|
#define vs59 59
|
||||||
|
#define vs60 60
|
||||||
|
#define vs61 61
|
||||||
|
#define vs62 62
|
||||||
|
#define vs63 63
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Macros to glue together two tokens.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __STDC__
|
||||||
|
#define XGLUE(a,b) a##b
|
||||||
|
#else
|
||||||
|
#define XGLUE(a,b) a/**/b
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define GLUE(a,b) XGLUE(a,b)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Macros to begin and end a function written in assembler. If -mcall-aixdesc
|
||||||
|
* or -mcall-nt, create a function descriptor with the given name, and create
|
||||||
|
* the real function with one or two leading periods respectively.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(__powerpc64__) && _CALL_ELF == 2
|
||||||
|
|
||||||
|
/* Defining "toc" above breaks @toc in assembler code. */
|
||||||
|
#undef toc
|
||||||
|
|
||||||
|
#define FUNC_NAME(name) GLUE(__USER_LABEL_PREFIX__,name)
|
||||||
|
#ifdef __PCREL__
|
||||||
|
#define JUMP_TARGET(name) GLUE(FUNC_NAME(name),@notoc)
|
||||||
|
#define FUNC_START(name) \
|
||||||
|
.type FUNC_NAME(name),@function; \
|
||||||
|
.globl FUNC_NAME(name); \
|
||||||
|
FUNC_NAME(name): \
|
||||||
|
.localentry FUNC_NAME(name),1
|
||||||
|
#else
|
||||||
|
#define JUMP_TARGET(name) FUNC_NAME(name)
|
||||||
|
#define FUNC_START(name) \
|
||||||
|
.type FUNC_NAME(name),@function; \
|
||||||
|
.globl FUNC_NAME(name); \
|
||||||
|
FUNC_NAME(name): \
|
||||||
|
0: addis 2,12,(.TOC.-0b)@ha; \
|
||||||
|
addi 2,2,(.TOC.-0b)@l; \
|
||||||
|
.localentry FUNC_NAME(name),.-FUNC_NAME(name)
|
||||||
|
#endif /* !__PCREL__ */
|
||||||
|
|
||||||
|
#define HIDDEN_FUNC(name) \
|
||||||
|
FUNC_START(name) \
|
||||||
|
.hidden FUNC_NAME(name);
|
||||||
|
|
||||||
|
#define FUNC_END(name) \
|
||||||
|
.size FUNC_NAME(name),.-FUNC_NAME(name)
|
||||||
|
|
||||||
|
#elif defined (__powerpc64__)
|
||||||
|
|
||||||
|
#define FUNC_NAME(name) GLUE(.,name)
|
||||||
|
#define JUMP_TARGET(name) FUNC_NAME(name)
|
||||||
|
#define FUNC_START(name) \
|
||||||
|
.section ".opd","aw"; \
|
||||||
|
name: \
|
||||||
|
.quad GLUE(.,name); \
|
||||||
|
.quad .TOC.@tocbase; \
|
||||||
|
.quad 0; \
|
||||||
|
.previous; \
|
||||||
|
.type GLUE(.,name),@function; \
|
||||||
|
.globl name; \
|
||||||
|
.globl GLUE(.,name); \
|
||||||
|
GLUE(.,name):
|
||||||
|
|
||||||
|
#define HIDDEN_FUNC(name) \
|
||||||
|
FUNC_START(name) \
|
||||||
|
.hidden name; \
|
||||||
|
.hidden GLUE(.,name);
|
||||||
|
|
||||||
|
#define FUNC_END(name) \
|
||||||
|
GLUE(.L,name): \
|
||||||
|
.size GLUE(.,name),GLUE(.L,name)-GLUE(.,name)
|
||||||
|
|
||||||
|
#elif defined(_CALL_AIXDESC)
|
||||||
|
|
||||||
|
#ifdef _RELOCATABLE
|
||||||
|
#define DESC_SECTION ".got2"
|
||||||
|
#else
|
||||||
|
#define DESC_SECTION ".got1"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FUNC_NAME(name) GLUE(.,name)
|
||||||
|
#define JUMP_TARGET(name) FUNC_NAME(name)
|
||||||
|
#define FUNC_START(name) \
|
||||||
|
.section DESC_SECTION,"aw"; \
|
||||||
|
name: \
|
||||||
|
.long GLUE(.,name); \
|
||||||
|
.long _GLOBAL_OFFSET_TABLE_; \
|
||||||
|
.long 0; \
|
||||||
|
.previous; \
|
||||||
|
.type GLUE(.,name),@function; \
|
||||||
|
.globl name; \
|
||||||
|
.globl GLUE(.,name); \
|
||||||
|
GLUE(.,name):
|
||||||
|
|
||||||
|
#define HIDDEN_FUNC(name) \
|
||||||
|
FUNC_START(name) \
|
||||||
|
.hidden name; \
|
||||||
|
.hidden GLUE(.,name);
|
||||||
|
|
||||||
|
#define FUNC_END(name) \
|
||||||
|
GLUE(.L,name): \
|
||||||
|
.size GLUE(.,name),GLUE(.L,name)-GLUE(.,name)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define FUNC_NAME(name) GLUE(__USER_LABEL_PREFIX__,name)
|
||||||
|
#if defined __PIC__ || defined __pic__
|
||||||
|
#define JUMP_TARGET(name) FUNC_NAME(name@plt)
|
||||||
|
#else
|
||||||
|
#define JUMP_TARGET(name) FUNC_NAME(name)
|
||||||
|
#endif
|
||||||
|
#define FUNC_START(name) \
|
||||||
|
.type FUNC_NAME(name),@function; \
|
||||||
|
.globl FUNC_NAME(name); \
|
||||||
|
FUNC_NAME(name):
|
||||||
|
|
||||||
|
#define HIDDEN_FUNC(name) \
|
||||||
|
FUNC_START(name) \
|
||||||
|
.hidden FUNC_NAME(name);
|
||||||
|
|
||||||
|
#define FUNC_END(name) \
|
||||||
|
GLUE(.L,name): \
|
||||||
|
.size FUNC_NAME(name),GLUE(.L,name)-FUNC_NAME(name)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef IN_GCC
|
||||||
|
/* For HAVE_GAS_CFI_DIRECTIVE. */
|
||||||
|
#include "auto-host.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_GAS_CFI_DIRECTIVE
|
||||||
|
# define CFI_STARTPROC .cfi_startproc
|
||||||
|
# define CFI_ENDPROC .cfi_endproc
|
||||||
|
# define CFI_OFFSET(reg, off) .cfi_offset reg, off
|
||||||
|
# define CFI_DEF_CFA_REGISTER(reg) .cfi_def_cfa_register reg
|
||||||
|
# define CFI_RESTORE(reg) .cfi_restore reg
|
||||||
|
#else
|
||||||
|
# define CFI_STARTPROC
|
||||||
|
# define CFI_ENDPROC
|
||||||
|
# define CFI_OFFSET(reg, off)
|
||||||
|
# define CFI_DEF_CFA_REGISTER(reg)
|
||||||
|
# define CFI_RESTORE(reg)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined __linux__ && !defined __powerpc64__
|
||||||
|
.section .note.GNU-stack
|
||||||
|
.previous
|
||||||
|
#endif
|
@ -346,6 +346,9 @@ static inline void Slow_CRC32(uint64_t* l, uint8_t const **p) {
|
|||||||
table0_[c >> 24];
|
table0_[c >> 24];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (!(defined(HAVE_POWER8) && defined(HAS_ALTIVEC))) && \
|
||||||
|
(!defined(HAVE_ARM64_CRC)) || \
|
||||||
|
defined(NO_THREEWAY_CRC32C)
|
||||||
static inline void Fast_CRC32(uint64_t* l, uint8_t const **p) {
|
static inline void Fast_CRC32(uint64_t* l, uint8_t const **p) {
|
||||||
#ifndef HAVE_SSE42
|
#ifndef HAVE_SSE42
|
||||||
Slow_CRC32(l, p);
|
Slow_CRC32(l, p);
|
||||||
@ -359,6 +362,7 @@ static inline void Fast_CRC32(uint64_t* l, uint8_t const **p) {
|
|||||||
*p += 4;
|
*p += 4;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
template<void (*CRC32)(uint64_t*, uint8_t const**)>
|
template<void (*CRC32)(uint64_t*, uint8_t const**)>
|
||||||
uint32_t ExtendImpl(uint32_t crc, const char* buf, size_t size) {
|
uint32_t ExtendImpl(uint32_t crc, const char* buf, size_t size) {
|
||||||
|
@ -27,7 +27,7 @@ unsigned int __crc32_vpmsum(unsigned int crc, unsigned char const *p,
|
|||||||
unsigned long len);
|
unsigned long len);
|
||||||
|
|
||||||
static uint32_t crc32_vpmsum(uint32_t crc, unsigned char const *data,
|
static uint32_t crc32_vpmsum(uint32_t crc, unsigned char const *data,
|
||||||
unsigned len) {
|
size_t len) {
|
||||||
unsigned int prealign;
|
unsigned int prealign;
|
||||||
unsigned int tail;
|
unsigned int tail;
|
||||||
|
|
||||||
@ -67,7 +67,7 @@ out:
|
|||||||
* does not gracefully handle the case where the data pointer is NULL. There
|
* does not gracefully handle the case where the data pointer is NULL. There
|
||||||
* may be room for performance improvement here.
|
* may be room for performance improvement here.
|
||||||
*/
|
*/
|
||||||
uint32_t crc32c_ppc(uint32_t crc, unsigned char const *data, unsigned len) {
|
uint32_t crc32c_ppc(uint32_t crc, unsigned char const *data, size_t len) {
|
||||||
unsigned char *buf2;
|
unsigned char *buf2;
|
||||||
|
|
||||||
if (!data) {
|
if (!data) {
|
||||||
@ -87,7 +87,7 @@ uint32_t crc32c_ppc(uint32_t crc, unsigned char const *data, unsigned len) {
|
|||||||
* ppc systems using power7 or below) in order to compile properly
|
* ppc systems using power7 or below) in order to compile properly
|
||||||
* there, even though it won't be called.
|
* there, even though it won't be called.
|
||||||
*/
|
*/
|
||||||
uint32_t crc32c_ppc(uint32_t crc, unsigned char const *data, unsigned len) {
|
uint32_t crc32c_ppc(uint32_t crc, unsigned char const *data, size_t len) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern uint32_t crc32c_ppc(uint32_t crc, unsigned char const *buffer,
|
extern uint32_t crc32c_ppc(uint32_t crc, unsigned char const *buffer,
|
||||||
unsigned len);
|
size_t len);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,11 @@
|
|||||||
// COPYING file in the root directory) and Apache 2.0 License
|
// COPYING file in the root directory) and Apache 2.0 License
|
||||||
// (found in the LICENSE.Apache file in the root directory).
|
// (found in the LICENSE.Apache file in the root directory).
|
||||||
|
|
||||||
|
#if defined (__clang__)
|
||||||
|
#include "third-party/gcc/ppc-asm.h"
|
||||||
|
#else
|
||||||
#include <ppc-asm.h>
|
#include <ppc-asm.h>
|
||||||
|
#endif
|
||||||
#include "ppc-opcode.h"
|
#include "ppc-opcode.h"
|
||||||
|
|
||||||
#undef toc
|
#undef toc
|
||||||
|
Loading…
Reference in New Issue
Block a user