binutils-gdb/ld/emultempl
Alan Modra f378ab099d PPC64_OPT_LOCALENTRY
ELFv2 functions with localentry:0 are those with a single entry point,
ie. global entry == local entry, and that have no requirement on r2 or
r12, and guarantee r2 is unchanged on return.  Such an external
function can be called via the PLT without saving r2 or restoring it
on return, avoiding a common load-hit-store for small functions.   The
optimization is attractive.  The TOC pointer load-hit-store is a major
reason why calls to small functions that need no register saves, or
with shrink-wrap, no register saves on a fast path, are slow on
powerpc64le.

To be safe, this optimization needs ld.so support to check that the
run-time matches link-time function implementation.  If a function
in a shared library with st_other localentry non-zero is called
without saving and restoring r2, r2 will be trashed on return, leading
to segfaults.  For that reason the optimization does not happen for
weak functions since a weak definition is a fairly solid hint that the
function will likely be overridden.  I'm also not enabling the
optimization by default unless glibc-2.26 is detected, which should
have the ld.so checks implemented.

bfd/
	* elf64-ppc.c (struct ppc_link_hash_table): Add has_plt_localentry0.
	(ppc64_elf_merge_symbol_attribute): Merge localentry bits from
	dynamic objects.
	(is_elfv2_localentry0): New function.
	(ppc64_elf_tls_setup): Default params->plt_localentry0.
	(plt_stub_size): Adjust size for tls_get_addr_opt stub.
	(build_tls_get_addr_stub): Use a simpler stub when r2 is not saved.
	(ppc64_elf_size_stubs): Leave stub_type as ppc_stub_plt_call for
	optimized localentry:0 stubs.
	(ppc64_elf_build_stubs): Save r2 in ELFv2 __glink_PLTresolve.
	(ppc64_elf_relocate_section): Leave nop unchanged for optimized
	localentry:0 stubs.
	(ppc64_elf_finish_dynamic_sections): Set PPC64_OPT_LOCALENTRY in
	DT_PPC64_OPT.
	* elf64-ppc.h (struct ppc64_elf_params): Add plt_localentry0.
include/
	* elf/ppc64.h (PPC64_OPT_LOCALENTRY): Define.
ld/
	* emultempl/ppc64elf.em (params): Init plt_localentry0 field.
	(enum ppc64_opt): New, replacing OPTION_* defines.  Add
	OPTION_PLT_LOCALENTRY, and OPTION_NO_PLT_LOCALENTRY.
	(PARSE_AND_LIST_*): Support --plt-localentry and --no-plt-localentry.
	* testsuite/ld-powerpc/elfv2so.d: Update.
	* testsuite/ld-powerpc/powerpc.exp (TLS opt 5): Use --no-plt-localentry.
	* testsuite/ld-powerpc/tlsopt5.d: Update.
2017-06-01 22:47:32 +09:30
..
aarch64elf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
aix.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
alphaelf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
arclinux.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
armcoff.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
armelf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
astring.sed * emultempl/ostring.sed: Rename from stringify.sed. 1999-08-06 22:46:03 +00:00
avrelf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
beos.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
bfin.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
cr16elf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
crxelf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
elf32.em Don't compare boolean values against TRUE or FALSE 2017-05-18 14:59:33 +09:30
elf-generic.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
epiphanyelf_4x4.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
genelf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
generic.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
gld960.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
gld960c.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
hppaelf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
ia64elf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
irix.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
linux.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
lnk960.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
m68hc1xelf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
m68kcoff.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
m68kelf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
metagelf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
mipself.em MIPS: Add options to control branch ISA checks 2017-01-30 17:16:01 +00:00
mmix-elfnmmo.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
mmixelf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
mmo.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
msp430.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
nds32elf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
needrelax.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
netbsd.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
nios2elf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
ostring.sed * emultempl/ostring.sed: Rename from stringify.sed. 1999-08-06 22:46:03 +00:00
pe.em Don't compare boolean values against TRUE or FALSE 2017-05-18 14:59:33 +09:30
pep.em Don't compare boolean values against TRUE or FALSE 2017-05-18 14:59:33 +09:30
ppc32elf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
ppc64elf.em PPC64_OPT_LOCALENTRY 2017-06-01 22:47:32 +09:30
pruelf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
README Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
riscvelf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
rxelf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
scoreelf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
sh64elf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
solaris2.em Solaris2/LD: Fix anonymous version script acceptance bug 2017-01-24 12:53:52 +00:00
spu_icache.o_c Regenerate spu overlay and icache manager files 2014-11-04 22:36:13 +10:30
spu_icache.S bfd/ 2009-03-17 12:46:19 +00:00
spu_ovl.o_c Regenerate spu_ovl.o_c 2016-10-15 12:53:57 +10:30
spu_ovl.S Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
spuelf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
sunos.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
tic6xdsbt.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
ticoff.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
v850elf.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
vanilla.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
vms.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
vxworks.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
xtensaelf.em Don't compare boolean values against TRUE or FALSE 2017-05-18 14:59:33 +09:30
z80.em Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

The files in this directory are sourced by genscripts.sh, after
setting some variables to substitute in, to produce
C source files that contain jump tables for each emulation.

Copyright (C) 2012-2017 Free Software Foundation, Inc.

Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved.