-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix Compilation on ppc64le using Clang 11 (#7713)
Summary: Closes facebook/rocksdb#7691 The optimised CRC code for PPC64le which was originally imported in facebook/rocksdb#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 antonblanchard/crc32-vpmsum@ffc8018#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: facebook/rocksdb#7713 Reviewed By: jay-zhuang Differential Revision: D25222645 Pulled By: pdillinger fbshipit-source-id: e3fec9136f26ce1eb7a027048bcf77a6cb3c769c
- Loading branch information
1 parent
0b06af9
commit b937be3
Showing
5 changed files
with
402 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
Oops, something went wrong.