From 15a3a14fdd725c049d6b2aadbaf66c9be5ed36a8 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sun, 23 Jul 2017 20:03:40 +0930 Subject: [PATCH] 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. --- bfd/ChangeLog | 5 +++++ bfd/elf64-ppc.c | 2 +- gold/ChangeLog | 7 +++++++ gold/powerpc.cc | 4 ++-- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9f478f2eaa..66d812468e 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2017-07-23 Alan Modra + + * elf64-ppc.c (ppc64_elf_size_stubs): Correct advance to + restore of LR. + 2017-07-19 Szabolcs Nagy PR ld/18841 diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 99033738e9..f399e351e0 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -12871,7 +12871,7 @@ ppc64_elf_size_stubs (struct bfd_link_info *info) *p++ = DW_CFA_register; *p++ = 65; *p++ = htab->opd_abi ? 12 : 0; - *p++ = DW_CFA_advance_loc + 4; + *p++ = DW_CFA_advance_loc + (htab->opd_abi ? 5 : 7); *p++ = DW_CFA_restore_extended; *p++ = 65; p += ((24 + align - 1) & -align) - 24; diff --git a/gold/ChangeLog b/gold/ChangeLog index 0dc39722ad..01f0d34d1c 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,10 @@ +2017-07-23 Alan Modra + + * 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 PR 21775 diff --git a/gold/powerpc.cc b/gold/powerpc.cc index fcbf177956..a4966b8b3c 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 }; -- 2.34.1