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
main
parent
0b06af9146
commit
b937be3779
@ -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 |
Loading…
Reference in new issue