/* PPC64 ELF support for BFD.
- Copyright 2003 Free Software Foundation, Inc.
+ Copyright (C) 2003-2017 Free Software Foundation, Inc.
-This file is part of BFD, the Binary File Descriptor library.
+ This file is part of BFD, the Binary File Descriptor library.
-This program 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 2 of the License, or
-(at your option) any later version.
+ This program 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 of the License, or
+ (at your option) any later version.
-This program 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.
+ This program 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.
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+ MA 02110-1301, USA. */
#ifndef _ELF_PPC64_H
#define _ELF_PPC64_H
RELOC_NUMBER (R_PPC64_DTPREL16_HIGHERA, 104)
RELOC_NUMBER (R_PPC64_DTPREL16_HIGHEST, 105)
RELOC_NUMBER (R_PPC64_DTPREL16_HIGHESTA, 106)
+ RELOC_NUMBER (R_PPC64_TLSGD, 107)
+ RELOC_NUMBER (R_PPC64_TLSLD, 108)
+ RELOC_NUMBER (R_PPC64_TOCSAVE, 109)
+
+/* Added when HA and HI relocs were changed to report overflows. */
+ RELOC_NUMBER (R_PPC64_ADDR16_HIGH, 110)
+ RELOC_NUMBER (R_PPC64_ADDR16_HIGHA, 111)
+ RELOC_NUMBER (R_PPC64_TPREL16_HIGH, 112)
+ RELOC_NUMBER (R_PPC64_TPREL16_HIGHA, 113)
+ RELOC_NUMBER (R_PPC64_DTPREL16_HIGH, 114)
+ RELOC_NUMBER (R_PPC64_DTPREL16_HIGHA, 115)
+
+/* Added for ELFv2. */
+ RELOC_NUMBER (R_PPC64_REL24_NOTOC, 116)
+ RELOC_NUMBER (R_PPC64_ADDR64_LOCAL, 117)
+ RELOC_NUMBER (R_PPC64_ENTRY, 118)
+
+#ifndef RELOC_MACROS_GEN_FUNC
+/* Relocation only used internally by ld. If you need to use these
+ reloc numbers, you can change them to some other unused value
+ without affecting the ABI. They will never appear in object files. */
+ RELOC_NUMBER (R_PPC64_LO_DS_OPT, 128)
+/* Reloc only used internally by gas. As above, value is unimportant. */
+ RELOC_NUMBER (R_PPC64_16DX_HA, 129)
+#endif
+
+/* Power9 split rel16 for addpcis. */
+ RELOC_NUMBER (R_PPC64_REL16DX_HA, 246)
+
+/* Support STT_GNU_IFUNC plt calls. */
+ RELOC_NUMBER (R_PPC64_JMP_IREL, 247)
+ RELOC_NUMBER (R_PPC64_IRELATIVE, 248)
+
+/* These are GNU extensions used in PIC code sequences. */
+ RELOC_NUMBER (R_PPC64_REL16, 249)
+ RELOC_NUMBER (R_PPC64_REL16_LO, 250)
+ RELOC_NUMBER (R_PPC64_REL16_HI, 251)
+ RELOC_NUMBER (R_PPC64_REL16_HA, 252)
/* These are GNU extensions to enable C++ vtable garbage collection. */
RELOC_NUMBER (R_PPC64_GNU_VTINHERIT, 253)
END_RELOC_NUMBERS (R_PPC64_max)
-#define IS_PPC64_TLS_RELOC(R) \
- ((R) >= R_PPC64_TLS && (R) <= R_PPC64_DTPREL16_HIGHESTA)
+#define IS_PPC64_TLS_RELOC(R) \
+ (((R) >= R_PPC64_TLS && (R) <= R_PPC64_DTPREL16_HIGHESTA) \
+ || ((R) >= R_PPC64_TPREL16_HIGH && (R) <= R_PPC64_DTPREL16_HIGHA))
+
+
+/* e_flags bits specifying ABI.
+ 1 for original function descriptor using ABI,
+ 2 for revised ABI without function descriptors,
+ 0 for unspecified or not using any features affected by the differences. */
+#define EF_PPC64_ABI 3
+
+/* The ELFv2 ABI uses three bits in the symbol st_other field of a
+ function definition to specify the number of instructions between a
+ function's global entry point and local entry point.
+ The global entry point is used when it is necessary to set up the
+ toc pointer (r2) for the function. Callers must enter the global
+ entry point with r12 set to the global entry point address. On
+ return from the function, r2 may have a different value to that
+ which it had on entry.
+ The local entry point is used when r2 is known to already be valid
+ for the function. There is no requirement on r12 when using the
+ local entry point, and on return r2 will contain the same value as
+ at entry.
+ A value of zero in these bits means that the function has a single
+ entry point with no requirement on r12 or r2, and that on return r2
+ will contain the same value as at entry.
+ Values of one and seven are reserved. */
+#define STO_PPC64_LOCAL_BIT 5
+#define STO_PPC64_LOCAL_MASK (7 << STO_PPC64_LOCAL_BIT)
+
+// 3 bit other field to bytes.
+static inline unsigned int
+ppc64_decode_local_entry(unsigned int other)
+{
+ return ((1 << other) >> 2) << 2;
+}
+
+// bytes to field value.
+static inline unsigned int
+ppc64_encode_local_entry(unsigned int val)
+{
+ return (val >= 4 * 4
+ ? (val >= 8 * 4
+ ? (val >= 16 * 4 ? 6 : 5)
+ : 4)
+ : (val >= 2 * 4
+ ? 3
+ : (val >= 1 * 4 ? 2 : 0)));
+}
+
+/* st_other to number of bytes. */
+#define PPC64_LOCAL_ENTRY_OFFSET(other) \
+ ppc64_decode_local_entry (((other) & STO_PPC64_LOCAL_MASK) \
+ >> STO_PPC64_LOCAL_BIT)
+/* number of bytes to st_other. */
+#define PPC64_SET_LOCAL_ENTRY_OFFSET(val) \
+ ppc64_encode_local_entry (val) << STO_PPC64_LOCAL_BIT
/* Specify the start of the .glink section. */
#define DT_PPC64_GLINK DT_LOPROC
#define DT_PPC64_OPD (DT_LOPROC + 1)
#define DT_PPC64_OPDSZ (DT_LOPROC + 2)
+/* Specify whether various optimisations are possible. */
+#define DT_PPC64_OPT (DT_LOPROC + 3)
+#define PPC64_OPT_TLS 1
+#define PPC64_OPT_MULTI_TOC 2
+#define PPC64_OPT_LOCALENTRY 4
+
#endif /* _ELF_PPC64_H */