aboutsummaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2017-07-23 20:03:40 +0930
committerAlan Modra <amodra@gmail.com>2017-07-23 20:40:39 +0930
commit15a3a14fdd725c049d6b2aadbaf66c9be5ed36a8 (patch)
tree633d54bee7dac24c42e25a098af636280867fee1 /gold
parent5c2c0020fbe7110e6780ec1ee85ff11833779f8c (diff)
downloadbinutils-15a3a14fdd725c049d6b2aadbaf66c9be5ed36a8.zip
binutils-15a3a14fdd725c049d6b2aadbaf66c9be5ed36a8.tar.gz
binutils-15a3a14fdd725c049d6b2aadbaf66c9be5ed36a8.tar.bz2
Correct eh_frame info for __glink_PLTresolve
My PPC64_OPT_LOCALENTRY patch of June 1, git commit f378ab099d, and the later gold change, git commit 7ee7ff7015, added an insn in __glink_PLTresolve which needs a corresponding adjustment in the eh_frame info for asynchronous exceptions to unwind correctly. It would have been OK for both ABIs to use +5 for the advance before restore of LR, since we can put the DW_CFA_restore_extended on any insn after the actual restore and before the r12/r0 copy is clobbered, but it's slightly better to delay as much as possible. There are then more addresses where fewer CFA program insns are executed. bfd/ * elf64-ppc.c (ppc64_elf_size_stubs): Correct advance to restore of LR. gold/ * powerpc.cc (glink_eh_frame_fde_64v2): Correct advance to restore of LR. (glink_eh_frame_fde_64v1): Advance to restore of LR at latest possible insn.
Diffstat (limited to 'gold')
-rw-r--r--gold/ChangeLog7
-rw-r--r--gold/powerpc.cc4
2 files changed, 9 insertions, 2 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 0dc3972..01f0d34 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,10 @@
+2017-07-23 Alan Modra <amodra@gmail.com>
+
+ * powerpc.cc (glink_eh_frame_fde_64v2): Correct advance to
+ restore of LR.
+ (glink_eh_frame_fde_64v1): Advance to restore of LR at latest
+ possible insn.
+
2017-07-18 Nick Clifton <nickc@redhat.com>
PR 21775
diff --git a/gold/powerpc.cc b/gold/powerpc.cc
index fcbf177..a4966b8 100644
--- a/gold/powerpc.cc
+++ b/gold/powerpc.cc
@@ -3987,7 +3987,7 @@ static const unsigned char glink_eh_frame_fde_64v1[] =
0, // Augmentation size.
elfcpp::DW_CFA_advance_loc + 1,
elfcpp::DW_CFA_register, 65, 12,
- elfcpp::DW_CFA_advance_loc + 4,
+ elfcpp::DW_CFA_advance_loc + 5,
elfcpp::DW_CFA_restore_extended, 65
};
@@ -3999,7 +3999,7 @@ static const unsigned char glink_eh_frame_fde_64v2[] =
0, // Augmentation size.
elfcpp::DW_CFA_advance_loc + 1,
elfcpp::DW_CFA_register, 65, 0,
- elfcpp::DW_CFA_advance_loc + 4,
+ elfcpp::DW_CFA_advance_loc + 7,
elfcpp::DW_CFA_restore_extended, 65
};