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 <peter.smith@linaro.org> Cary Coutant <ccoutant@gmail.com> 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.
This commit is contained in:
parent
036aae7930
commit
e0feb13342
|
@ -1,3 +1,11 @@
|
|||
2017-11-30 Peter Smith <peter.smith@linaro.org>
|
||||
Cary Coutant <ccoutant@gmail.com>
|
||||
|
||||
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 <peter.smith@linaro.org>
|
||||
|
||||
PR gold/22233
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue