2003-01-16 05:08:47 +01:00
|
|
|
/* PPC64 ELF support for BFD.
|
2011-10-10 15:21:07 +02:00
|
|
|
Copyright 2003, 2005, 2009, 2010, 2011 Free Software Foundation, Inc.
|
2003-01-16 05:08:47 +01:00
|
|
|
|
2010-04-15 12:26:09 +02:00
|
|
|
This file is part of BFD, the Binary File Descriptor library.
|
2003-01-16 05:08:47 +01:00
|
|
|
|
2010-04-15 12:26:09 +02:00
|
|
|
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.
|
2003-01-16 05:08:47 +01:00
|
|
|
|
2010-04-15 12:26:09 +02:00
|
|
|
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.
|
2003-01-16 05:08:47 +01:00
|
|
|
|
2010-04-15 12:26:09 +02:00
|
|
|
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. */
|
2003-01-16 05:08:47 +01:00
|
|
|
|
|
|
|
#ifndef _ELF_PPC64_H
|
|
|
|
#define _ELF_PPC64_H
|
|
|
|
|
|
|
|
#include "elf/reloc-macros.h"
|
|
|
|
|
|
|
|
/* Relocations. */
|
|
|
|
START_RELOC_NUMBERS (elf_ppc64_reloc_type)
|
2003-02-04 15:48:36 +01:00
|
|
|
RELOC_NUMBER (R_PPC64_NONE, 0)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR32, 1)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR24, 2)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16, 3)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16_LO, 4)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16_HI, 5)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16_HA, 6)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR14, 7)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR14_BRTAKEN, 8)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR14_BRNTAKEN, 9)
|
|
|
|
RELOC_NUMBER (R_PPC64_REL24, 10)
|
|
|
|
RELOC_NUMBER (R_PPC64_REL14, 11)
|
|
|
|
RELOC_NUMBER (R_PPC64_REL14_BRTAKEN, 12)
|
|
|
|
RELOC_NUMBER (R_PPC64_REL14_BRNTAKEN, 13)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT16, 14)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT16_LO, 15)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT16_HI, 16)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT16_HA, 17)
|
2003-01-16 05:08:47 +01:00
|
|
|
/* 18 unused. 32-bit reloc is R_PPC_PLTREL24. */
|
2003-02-04 15:48:36 +01:00
|
|
|
RELOC_NUMBER (R_PPC64_COPY, 19)
|
|
|
|
RELOC_NUMBER (R_PPC64_GLOB_DAT, 20)
|
|
|
|
RELOC_NUMBER (R_PPC64_JMP_SLOT, 21)
|
|
|
|
RELOC_NUMBER (R_PPC64_RELATIVE, 22)
|
2003-01-16 05:08:47 +01:00
|
|
|
/* 23 unused. 32-bit reloc is R_PPC_LOCAL24PC. */
|
2003-02-04 15:48:36 +01:00
|
|
|
RELOC_NUMBER (R_PPC64_UADDR32, 24)
|
|
|
|
RELOC_NUMBER (R_PPC64_UADDR16, 25)
|
|
|
|
RELOC_NUMBER (R_PPC64_REL32, 26)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLT32, 27)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLTREL32, 28)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLT16_LO, 29)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLT16_HI, 30)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLT16_HA, 31)
|
2003-01-16 05:08:47 +01:00
|
|
|
/* 32 unused. 32-bit reloc is R_PPC_SDAREL16. */
|
2003-02-04 15:48:36 +01:00
|
|
|
RELOC_NUMBER (R_PPC64_SECTOFF, 33)
|
|
|
|
RELOC_NUMBER (R_PPC64_SECTOFF_LO, 34)
|
|
|
|
RELOC_NUMBER (R_PPC64_SECTOFF_HI, 35)
|
|
|
|
RELOC_NUMBER (R_PPC64_SECTOFF_HA, 36)
|
|
|
|
RELOC_NUMBER (R_PPC64_REL30, 37)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR64, 38)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16_HIGHER, 39)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16_HIGHERA, 40)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16_HIGHEST, 41)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16_HIGHESTA, 42)
|
|
|
|
RELOC_NUMBER (R_PPC64_UADDR64, 43)
|
|
|
|
RELOC_NUMBER (R_PPC64_REL64, 44)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLT64, 45)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLTREL64, 46)
|
|
|
|
RELOC_NUMBER (R_PPC64_TOC16, 47)
|
|
|
|
RELOC_NUMBER (R_PPC64_TOC16_LO, 48)
|
|
|
|
RELOC_NUMBER (R_PPC64_TOC16_HI, 49)
|
|
|
|
RELOC_NUMBER (R_PPC64_TOC16_HA, 50)
|
|
|
|
RELOC_NUMBER (R_PPC64_TOC, 51)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLTGOT16, 52)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLTGOT16_LO, 53)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLTGOT16_HI, 54)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLTGOT16_HA, 55)
|
2003-01-16 05:08:47 +01:00
|
|
|
|
2003-02-04 15:48:36 +01:00
|
|
|
/* The following relocs were added in the 64-bit PowerPC ELF ABI
|
|
|
|
revision 1.2. */
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16_DS, 56)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16_LO_DS, 57)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT16_DS, 58)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT16_LO_DS, 59)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLT16_LO_DS, 60)
|
|
|
|
RELOC_NUMBER (R_PPC64_SECTOFF_DS, 61)
|
|
|
|
RELOC_NUMBER (R_PPC64_SECTOFF_LO_DS, 62)
|
|
|
|
RELOC_NUMBER (R_PPC64_TOC16_DS, 63)
|
|
|
|
RELOC_NUMBER (R_PPC64_TOC16_LO_DS, 64)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLTGOT16_DS, 65)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLTGOT16_LO_DS, 66)
|
|
|
|
|
|
|
|
/* Relocs added to support TLS. PowerPC64 ELF ABI revision 1.5. */
|
|
|
|
RELOC_NUMBER (R_PPC64_TLS, 67)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPMOD64, 68)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16, 69)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16_LO, 70)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16_HI, 71)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16_HA, 72)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL64, 73)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16, 74)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16_LO, 75)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16_HI, 76)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16_HA, 77)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL64, 78)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TLSGD16, 79)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TLSGD16_LO, 80)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TLSGD16_HI, 81)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TLSGD16_HA, 82)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TLSLD16, 83)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TLSLD16_LO, 84)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TLSLD16_HI, 85)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TLSLD16_HA, 86)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TPREL16_DS, 87)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TPREL16_LO_DS, 88)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TPREL16_HI, 89)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TPREL16_HA, 90)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_DTPREL16_DS, 91)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_DTPREL16_LO_DS, 92)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_DTPREL16_HI, 93)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_DTPREL16_HA, 94)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16_DS, 95)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16_LO_DS, 96)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16_HIGHER, 97)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16_HIGHERA, 98)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16_HIGHEST, 99)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16_HIGHESTA, 100)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16_DS, 101)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16_LO_DS, 102)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16_HIGHER, 103)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16_HIGHERA, 104)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16_HIGHEST, 105)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16_HIGHESTA, 106)
|
2009-03-04 06:50:50 +01:00
|
|
|
RELOC_NUMBER (R_PPC64_TLSGD, 107)
|
|
|
|
RELOC_NUMBER (R_PPC64_TLSLD, 108)
|
2011-10-10 15:21:07 +02:00
|
|
|
RELOC_NUMBER (R_PPC64_TOCSAVE, 109)
|
2003-01-16 05:08:47 +01:00
|
|
|
|
Report overflow on PowerPC64 @h and @ha relocations.
This changes the behaviour of @h and @ha on PowerPC64 to report errors
on 32-bit overflow. The motivation for this change is that on
PowerPC64, most uses of @h and @ha modifiers and their corresponding
relocations are to build up 32-bit offsets. We'd like to know when
such offsets overflow. Only rarely do people use @h or @ha with the
high 32-bit modifiers to build a 64-bit constant. Those uses will now
need to use two new modifiers, @high and @higha, if the constant isn't
known at assembly time. For now, we won't report overflow at assembly
time..
This also fixes an error when applying some of the HIGHER and HIGHEST
relocations.
include/elf/
* ppc64.h (R_PPC64_ADDR16_HIGH, R_PPC64_ADDR16_HIGHA,
R_PPC64_TPREL16_HIGH, R_PPC64_TPREL16_HIGHA,
R_PPC64_DTPREL16_HIGH, R_PPC64_DTPREL16_HIGHA): New.
(IS_PPC64_TLS_RELOC): Match new tls relocs.
bfd/
* reloc.c (BFD_RELOC_PPC64_ADDR16_HIGH, BFD_RELOC_PPC64_ADDR16_HIGHA,
BFD_RELOC_PPC64_TPREL16_HIGH, BFD_RELOC_PPC64_TPREL16_HIGHA,
BFD_RELOC_PPC64_DTPREL16_HIGH, BFD_RELOC_PPC64_DTPREL16_HIGHA): New.
* elf64-ppc.c (ppc64_elf_howto_raw): Add entries for new relocs.
Make all _HA and _HI relocs report signed overflow.
(ppc64_elf_reloc_type_lookup): Handle new relocs.
(must_be_dyn_reloc, ppc64_elf_check_relocs): Likewise.
(dec_dynrel_count, ppc64_elf_relocate_section): Likewise.
(ppc64_elf_relocate_section): Don't apply 0x8000 adjust to
R_PPC64_TPREL16_HIGHER, R_PPC64_TPREL16_HIGHEST,
R_PPC64_DTPREL16_HIGHER, and R_PPC64_DTPREL16_HIGHEST.
* libbfd.h: Regenerate.
* bfd-in2.h: Regenerate.
gas/
* config/tc-ppc.c (SEX16): Don't mask.
(REPORT_OVERFLOW_HI): Define as zero.
(ppc_elf_suffix): Support @high, @higha, @dtprel@high, @dtprel@higha,
@tprel@high, and @tprel@higha modifiers.
(md_assemble): Ignore X_unsigned when applying 16-bit insn fields.
Add (disabled) code to check @h and @ha reloc overflow for powerpc64.
Handle new relocs.
(md_apply_fix): Similarly.
elfcpp/
* powerpc.h (R_PPC64_ADDR16_HIGH, R_PPC64_ADDR16_HIGHA,
R_PPC64_TPREL16_HIGH, R_PPC64_TPREL16_HIGHA,
R_PPC64_DTPREL16_HIGH, R_PPC64_DTPREL16_HIGHA): Define.
gold/
* powerpc.cc (Target_powerpc::Scan::check_non_pic): Handle new relocs.
(Target_powerpc::Scan::global, local): Likewise.
(Target_powerpc::Relocate::relocate): Likewise. Check for overflow
on all ppc64 @h and @ha relocs.
2013-10-29 07:23:25 +01:00
|
|
|
/* 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)
|
|
|
|
|
2010-06-25 07:20:57 +02:00
|
|
|
#ifndef RELOC_MACROS_GEN_FUNC
|
|
|
|
/* Fake relocation only used internally by ld. */
|
|
|
|
RELOC_NUMBER (R_PPC64_LO_DS_OPT, 128)
|
|
|
|
#endif
|
2009-07-10 14:19:58 +02:00
|
|
|
/* Support STT_GNU_IFUNC plt calls. */
|
2009-07-29 16:55:20 +02:00
|
|
|
RELOC_NUMBER (R_PPC64_JMP_IREL, 247)
|
2009-07-10 14:19:58 +02:00
|
|
|
RELOC_NUMBER (R_PPC64_IRELATIVE, 248)
|
|
|
|
|
2009-07-29 16:55:20 +02:00
|
|
|
/* 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)
|
|
|
|
|
2003-01-16 05:08:47 +01:00
|
|
|
/* These are GNU extensions to enable C++ vtable garbage collection. */
|
2003-02-04 15:48:36 +01:00
|
|
|
RELOC_NUMBER (R_PPC64_GNU_VTINHERIT, 253)
|
|
|
|
RELOC_NUMBER (R_PPC64_GNU_VTENTRY, 254)
|
2003-01-16 05:08:47 +01:00
|
|
|
|
|
|
|
END_RELOC_NUMBERS (R_PPC64_max)
|
|
|
|
|
Report overflow on PowerPC64 @h and @ha relocations.
This changes the behaviour of @h and @ha on PowerPC64 to report errors
on 32-bit overflow. The motivation for this change is that on
PowerPC64, most uses of @h and @ha modifiers and their corresponding
relocations are to build up 32-bit offsets. We'd like to know when
such offsets overflow. Only rarely do people use @h or @ha with the
high 32-bit modifiers to build a 64-bit constant. Those uses will now
need to use two new modifiers, @high and @higha, if the constant isn't
known at assembly time. For now, we won't report overflow at assembly
time..
This also fixes an error when applying some of the HIGHER and HIGHEST
relocations.
include/elf/
* ppc64.h (R_PPC64_ADDR16_HIGH, R_PPC64_ADDR16_HIGHA,
R_PPC64_TPREL16_HIGH, R_PPC64_TPREL16_HIGHA,
R_PPC64_DTPREL16_HIGH, R_PPC64_DTPREL16_HIGHA): New.
(IS_PPC64_TLS_RELOC): Match new tls relocs.
bfd/
* reloc.c (BFD_RELOC_PPC64_ADDR16_HIGH, BFD_RELOC_PPC64_ADDR16_HIGHA,
BFD_RELOC_PPC64_TPREL16_HIGH, BFD_RELOC_PPC64_TPREL16_HIGHA,
BFD_RELOC_PPC64_DTPREL16_HIGH, BFD_RELOC_PPC64_DTPREL16_HIGHA): New.
* elf64-ppc.c (ppc64_elf_howto_raw): Add entries for new relocs.
Make all _HA and _HI relocs report signed overflow.
(ppc64_elf_reloc_type_lookup): Handle new relocs.
(must_be_dyn_reloc, ppc64_elf_check_relocs): Likewise.
(dec_dynrel_count, ppc64_elf_relocate_section): Likewise.
(ppc64_elf_relocate_section): Don't apply 0x8000 adjust to
R_PPC64_TPREL16_HIGHER, R_PPC64_TPREL16_HIGHEST,
R_PPC64_DTPREL16_HIGHER, and R_PPC64_DTPREL16_HIGHEST.
* libbfd.h: Regenerate.
* bfd-in2.h: Regenerate.
gas/
* config/tc-ppc.c (SEX16): Don't mask.
(REPORT_OVERFLOW_HI): Define as zero.
(ppc_elf_suffix): Support @high, @higha, @dtprel@high, @dtprel@higha,
@tprel@high, and @tprel@higha modifiers.
(md_assemble): Ignore X_unsigned when applying 16-bit insn fields.
Add (disabled) code to check @h and @ha reloc overflow for powerpc64.
Handle new relocs.
(md_apply_fix): Similarly.
elfcpp/
* powerpc.h (R_PPC64_ADDR16_HIGH, R_PPC64_ADDR16_HIGHA,
R_PPC64_TPREL16_HIGH, R_PPC64_TPREL16_HIGHA,
R_PPC64_DTPREL16_HIGH, R_PPC64_DTPREL16_HIGHA): Define.
gold/
* powerpc.cc (Target_powerpc::Scan::check_non_pic): Handle new relocs.
(Target_powerpc::Scan::global, local): Likewise.
(Target_powerpc::Relocate::relocate): Likewise. Check for overflow
on all ppc64 @h and @ha relocs.
2013-10-29 07:23:25 +01:00
|
|
|
#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))
|
2003-02-04 15:48:36 +01:00
|
|
|
|
2013-10-29 05:36:09 +01:00
|
|
|
|
|
|
|
/* 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
|
|
|
|
|
2013-10-29 06:07:43 +01:00
|
|
|
/* 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
|
|
|
|
|
2003-01-16 05:08:47 +01:00
|
|
|
/* Specify the start of the .glink section. */
|
|
|
|
#define DT_PPC64_GLINK DT_LOPROC
|
|
|
|
|
|
|
|
/* Specify the start and size of the .opd section. */
|
|
|
|
#define DT_PPC64_OPD (DT_LOPROC + 1)
|
|
|
|
#define DT_PPC64_OPDSZ (DT_LOPROC + 2)
|
|
|
|
|
2013-10-29 07:04:35 +01:00
|
|
|
/* Specify whether various optimisations are possible. */
|
|
|
|
#define DT_PPC64_OPT (DT_LOPROC + 3)
|
|
|
|
#define PPC64_OPT_TLS 1
|
|
|
|
#define PPC64_OPT_MULTI_TOC 2
|
include/elf/
* ppc.h (DT_PPC_TLSOPT): Define.
* ppc64.h (DT_PPC64_TLSOPT): Define.
bfd/
* elf32-ppc.c (TLS_GET_ADDR_GLINK_SIZE): Define.
(ADD_3_12_2, BEQLR, CMPWI_11_0, LWZ_11_3, LWZ_12_3): Define.
(MR_0_3, MR_3_0): Define.
(struct ppc_elf_link_hash_table): Add no_tls_get_addr_opt.
(ppc_elf_select_plt_layout): Save emit_stub_syms param earlier.
(ppc_elf_tls_setup): Add no_tls_get_addr_opt param and save to hash
table. Check for presense of __tls_get_addr_opt
(allocate_dynrelocs): Increase glink entry size for __tls_get_addr.
(ppc_elf_size_dynamic_sections): Add DT_PPC_TLS_OPT tag.
(write_glink_stub): Add param p.
(ppc_elf_relocate_section): Adjust write_glink_stub call.
(ppc_elf_finish_dynamic_symbol): Emit special glink call stub for
__tls_get_addr.
* elf32-ppc.h (ppc_elf_tls_setup): Update prototype.
* elf64-ppc.c (struct ppc_link_hash_table): Add no_tls_get_addr_opt.
(ppc64_elf_tls_setup): Add no_tls_get_addr_opt param and save to hash
table. Check for presense of __tls_get_addr_opt.
(ppc64_elf_size_dynamic_sections): Add DT_PPC64_TLS_OPT tag.
(LD_R11_0R3, LD_R12_0R3, MR_R0_R3, CMPDI_R11_0, ADD_R3_R12_R13,
BEQLR, MR_R3_R0, MFLR_R11, STD_R11_0R1, BCTRL, LD_R11_0R1,
LD_R2_0R1, MTLR_R11): Define.
(build_tls_get_addr_stub): New function.
(ppc_build_one_stub): Call it.
(ppc_size_one_stub): Add extra size for __tls_get_addr stub.
(ppc64_elf_relocate_section): Don't change nop to ld 2,40(1) for
__tls_get_addr plt call.
* elf64-ppc.h (ppc64_elf_tls_setup): Update prototype.
binutils/
* readelf.c (get_ppc_dynamic_type): Add TLSOPT.
(get_ppc64_dynamic_type): Likewise.
ld/
* emultempl/ppc32elf.em (no_tls_get_addr_opt): New var.
(ppc_before_allocation): Pass to ppc_elf_tls_setup.
(OPTION_NO_TLS_GET_ADDR_OPT): Define. Redefine other options in
terms of previous option.
(PARSE_AND_LIST_LONGOPTS, PARSE_AND_LIST_OPTIONS): Add
--no-tls-get-addr-optimize.
(PARSE_AND_LIST_ARGS_CASES): Handle it.
* emultempl/ppc64elf.em (no_tls_get_addr_opt): New var.
(ppc_before_allocation): Pass to ppc64_elf_tls_setup.
(OPTION_NO_TLS_GET_ADDR_OPT): Define.
(PARSE_AND_LIST_LONGOPTS, PARSE_AND_LIST_OPTIONS): Add
--no-tls-get-addr-optimize.
(PARSE_AND_LIST_ARGS_CASES): Handle it.
ld/testsuite/
* ld-powerpc/tlslib.s: Delete dot-symbol entry syms. Add
__tls_get_addr_opt.
* ld-powerpc/tlslib32.s: Add __tls_get_addr_opt.
* ld-powerpc/oldtlslib.s: New file, old-abi version of tlslib.s.
* ld-powerpc/powerpc.exp: Build old-abi library and use it in
two new link tests.
* ld-powerpc/tlsexe.d: Update for new __tls_get_addr stub.
* ld-powerpc/tlsexe.g, * ld-powerpc/tlsexe.r, *ld-powerpc/tlsexe32.d,
* ld-powerpc/tlsexe32.g, * ld-powerpc/tlsexe32.r,
* ld-powerpc/tlsexetoc.d, * ld-powerpc/tlsexetoc.g,
* ld-powerpc/tlsexetoc.r: Likewise.
2009-09-21 13:51:02 +02:00
|
|
|
|
2003-01-16 05:08:47 +01:00
|
|
|
#endif /* _ELF_PPC64_H */
|