From e0feb133429709603eeeb382c1ebb6edd0a886aa Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Thu, 30 Nov 2017 13:44:28 -0800 Subject: [PATCH] Fix problem where erratum stubs are not always applied. I checked over the results of applying --fix-cortex-a53-843419 to a very large program (gitit) with two stub tables and thousands of erratum fixes. I noticed that all the erratum_stubs were being created but about 1/3 of them were being skipped over by fix_errata_and_relocate_erratum_stubs(). By skipped over I mean no branch relocation or adrp -> adr transformation was applied to the erratum address, leaving the erratum_stub unreachable, and with a branch with a 0 immediate. The root cause of the skipped over erratum_stubs is Erratum_stub::invalidate_erratum_stub() that is used to set relobj_ to NULL when an erratum_stub has been processed. Unfortunately relobj_ is used in operator<() so altering relobj makes the results from erratum_stubs_.lower_bound() as used in find_erratum_stubs_for_input_section() unreliable. 2017-11-30 Peter Smith Cary Coutant gold/ PR gold/20765 * aarch64.cc (Erratum_stub::invalidate_erratum_stub): Use erratum_insn_ instead of relobj_ to invalidate the stub. (Erratum_stub::is_invalidated_erratum_stub): Likewise. --- gold/ChangeLog | 8 ++++++++ gold/aarch64.cc | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 49853f5..1245da5 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,4 +1,12 @@ 2017-11-30 Peter Smith + Cary Coutant + + PR gold/20765 + * aarch64.cc (Erratum_stub::invalidate_erratum_stub): Use erratum_insn_ + instead of relobj_ to invalidate the stub. + (Erratum_stub::is_invalidated_erratum_stub): Likewise. + +2017-11-30 Peter Smith PR gold/22233 * aarch64.cc (AArch64_relobj::fix_errata_and_relocate_erratum_stubs): diff --git a/gold/aarch64.cc b/gold/aarch64.cc index 02fabb7..04da01d 100644 --- a/gold/aarch64.cc +++ b/gold/aarch64.cc @@ -1052,13 +1052,13 @@ public: void invalidate_erratum_stub() { - gold_assert(this->relobj_ != NULL); - this->relobj_ = NULL; + gold_assert(this->erratum_insn_ != invalid_insn); + this->erratum_insn_ = invalid_insn; } bool is_invalidated_erratum_stub() - { return this->relobj_ == NULL; } + { return this->erratum_insn_ == invalid_insn; } protected: virtual void -- 2.7.4