aboutsummaryrefslogtreecommitdiff
path: root/elfcpp
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2017-06-23 20:39:43 +0930
committerAlan Modra <amodra@gmail.com>2017-06-23 20:39:43 +0930
commit7ee7ff7015840f2d0156bf386a050bd728d22fc4 (patch)
tree3e12dac4d7ecf1c5df4748be3365e140a8058e5a /elfcpp
parent7e57d19e48f94ff9a19a9413cf25d1887e3a7f52 (diff)
downloadbinutils-7ee7ff7015840f2d0156bf386a050bd728d22fc4.zip
binutils-7ee7ff7015840f2d0156bf386a050bd728d22fc4.tar.gz
binutils-7ee7ff7015840f2d0156bf386a050bd728d22fc4.tar.bz2
[GOLD] PowerPC64 localentry:0 plt call optimization
elfcpp/ * elfcpp.h (DT_PPC64_OPT): Define. * powerpc.h (PPC64_OPT_TLS, PPC64_OPT_MULTI_TOC, PPC64_OPT_LOCALENTRY): Define. gold/ * options.h (General_options): Add plt_localentry. * powerpc.cc (Target_powerpc::st_other): New function. (Target_powerpc::plt_localentry0_, plt_localentry0_init_, has_localentry0_): New vars. (Target_powerpc::plt_localentry0, set_has_localentry0, is_elfv2_localentry0): New functions. (Target_powerpc::Branch_info::mark_pltcall): Don't set tocsave or return true for localentry:0 calls. (Stub_table::Plt_stub_ent::localentry0_): New var. (Stub_table::add_plt_call_entry): Set localentry0_ and has_localentry0_. Don't set r2save_ for localentry:0 calls. (Output_data_glink::do_write): Save r2 in __glink_PLTresolve for elfv2. (Target_powerpc::scan_relocs): Default plt_localentry0_. (Target_powerpc::do_finalize_sections): Set DT_PPC64_OPT. (Target_powerpc::Relocate::relocate): Don't require nop following calls for localentry:0 plt calls, and don't change nop.
Diffstat (limited to 'elfcpp')
-rw-r--r--elfcpp/ChangeLog6
-rw-r--r--elfcpp/elfcpp.h3
-rw-r--r--elfcpp/powerpc.h8
3 files changed, 17 insertions, 0 deletions
diff --git a/elfcpp/ChangeLog b/elfcpp/ChangeLog
index 6a61d61..0be1bcb 100644
--- a/elfcpp/ChangeLog
+++ b/elfcpp/ChangeLog
@@ -1,3 +1,9 @@
+2017-06-21 Alan Modra <amodra@gmail.com>
+
+ * elfcpp.h (DT_PPC64_OPT): Define.
+ * powerpc.h (PPC64_OPT_TLS, PPC64_OPT_MULTI_TOC,
+ PPC64_OPT_LOCALENTRY): Define.
+
2017-01-02 Alan Modra <amodra@gmail.com>
Update year range in copyright notice of all files.
diff --git a/elfcpp/elfcpp.h b/elfcpp/elfcpp.h
index 82eb37f..a57f547 100644
--- a/elfcpp/elfcpp.h
+++ b/elfcpp/elfcpp.h
@@ -775,6 +775,9 @@ enum DT
DT_PPC64_OPD = 0x70000001,
DT_PPC64_OPDSZ = 0x70000002,
+ // Specify whether various optimisations are possible.
+ DT_PPC64_OPT = 0x70000003,
+
// The index of an STT_SPARC_REGISTER symbol within the DT_SYMTAB
// symbol table. One dynamic entry exists for every STT_SPARC_REGISTER
// symbol in the symbol table.
diff --git a/elfcpp/powerpc.h b/elfcpp/powerpc.h
index 99647bd..3dc0828 100644
--- a/elfcpp/powerpc.h
+++ b/elfcpp/powerpc.h
@@ -228,6 +228,14 @@ enum
EF_PPC64_ABI = 3
};
+// DT_PPC64_OPT bits
+enum
+{
+ PPC64_OPT_TLS = 1,
+ PPC64_OPT_MULTI_TOC = 2,
+ PPC64_OPT_LOCALENTRY = 4
+};
+
enum
{
// The ELFv2 ABI uses three bits in the symbol st_other field of a