diff options
Diffstat (limited to 'gold')
-rw-r--r-- | gold/ChangeLog | 5 | ||||
-rw-r--r-- | gold/powerpc.cc | 23 |
2 files changed, 22 insertions, 6 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 0bde6a1..5e15f5e 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,5 +1,10 @@ 2014-06-03 Alan Modra <amodra@gmail.com> + * powerpc.cc (addis_12_2): Define. + (Stub_table::do_write): Support fusion on ELFv2 stubs. + +2014-06-03 Alan Modra <amodra@gmail.com> + * testsuite/plugin_test.c (parse_readelf_line): Skip non-visibility st_other output. diff --git a/gold/powerpc.cc b/gold/powerpc.cc index 1078017..bd3994a 100644 --- a/gold/powerpc.cc +++ b/gold/powerpc.cc @@ -3077,6 +3077,7 @@ static const uint32_t addis_3_13 = 0x3c6d0000; static const uint32_t addis_11_2 = 0x3d620000; static const uint32_t addis_11_11 = 0x3d6b0000; static const uint32_t addis_11_30 = 0x3d7e0000; +static const uint32_t addis_12_2 = 0x3d820000; static const uint32_t addis_12_12 = 0x3d8c0000; static const uint32_t b = 0x48000000; static const uint32_t bcl_20_31 = 0x429f0005; @@ -4210,10 +4211,20 @@ Stub_table<size, big_endian>::do_write(Output_file* of) { write_insn<big_endian>(p, std_2_1 + this->targ_->stk_toc()); p += 4; - write_insn<big_endian>(p, addis_11_2 + ha(off)); - p += 4; - write_insn<big_endian>(p, ld_12_11 + l(off)); - p += 4; + if (plt_load_toc) + { + write_insn<big_endian>(p, addis_11_2 + ha(off)); + p += 4; + write_insn<big_endian>(p, ld_12_11 + l(off)); + p += 4; + } + else + { + write_insn<big_endian>(p, addis_12_2 + ha(off)); + p += 4; + write_insn<big_endian>(p, ld_12_12 + l(off)); + p += 4; + } if (plt_load_toc && ha(off + 8 + 8 * static_chain) != ha(off)) { @@ -4312,8 +4323,8 @@ Stub_table<size, big_endian>::do_write(Output_file* of) } else { - write_insn<big_endian>(p, addis_11_2 + ha(brltoff)), p += 4; - write_insn<big_endian>(p, ld_12_11 + l(brltoff)), p += 4; + write_insn<big_endian>(p, addis_12_2 + ha(brltoff)), p += 4; + write_insn<big_endian>(p, ld_12_12 + l(brltoff)), p += 4; } write_insn<big_endian>(p, mtctr_12), p += 4; write_insn<big_endian>(p, bctr); |