+2015-07-05 Richard Sandiford <richard.sandiford@arm.com>
+
+ * elf64-ppc.c (toc_adjusting_stub_needed): Use the symbol value
+ plus addend rather than the original st_value when looking up
+ entries in opd->adjust.
+
2015-07-03 Kai Tietz <ktietz@redhat.com>
Nick Clifton <nickc@redhat.com>
{
long adjust;
- adjust = opd->adjust[OPD_NDX (sym->st_value)];
+ adjust = opd->adjust[OPD_NDX (sym_value)];
if (adjust == -1)
/* Assume deleted functions won't ever be called. */
continue;
+2015-07-05 Richard Sandiford <richard.sandiford@arm.com>
+
+ * ld-powerpc/tocopt6-inc.s, ld-powerpc/tocopt6a.s,
+ ld-powerpc/tocopt6b.s, ld-powerpc/tocopt6c.s,
+ ld-powerpc/tocopt6.d: New test.
+ * ld-powerpc/powerpc.exp (ppc64elftests): Add it.
+
2015-07-03 Kai Tietz <ktietz@redhat.com>
Nick Clifton <nickc@redhat.com>
{tocopt4a.s tocopt4b.s} {{objdump -s tocopt4.d}} "tocopt4"}
{"TOC opt5" "-melf64ppc" "" "-a64" {tocopt5.s}
{{objdump -s tocopt5.d}} "tocopt5"}
+ {"TOC opt6" "-melf64ppc" "" "-a64" {tocopt6a.s tocopt6b.s tocopt6c.s}
+ {{objdump -d tocopt6.d}} "tocopt6"}
{"ambig shared v1" "-shared -melf64ppc" "" "-a64" {funv1.s} {} "funv1.so"}
{"ambig shared v2" "-shared -melf64ppc" "" "-a64" {funv2.s} {} "funv2.so"}
}
--- /dev/null
+ .macro start, sym
+ .type \sym, @function
+ .pushsection .opd, "aw"
+\sym: .quad .L.\sym, .TOC.@tocbase, 0
+ .popsection
+.L.\sym:
+ mflr 0
+ std 31, -8(1)
+ std 0, 16(1)
+ stdu 1, -128(1)
+ mr 31, 1
+ .endm
+
+
+ .macro end, sym
+ addi 1,31,128
+ ld 0, 16(1)
+ mtlr 0
+ ld 31, -8(1)
+ blr
+ .size \sym, . - .L.\sym
+ .endm
+
+
+ .macro forward, from, to
+ start \from
+ bl \to
+ nop
+ end \from
+ .endm
+
+
+ .macro usegot, sym
+ .pushsection .data
+\sym\@: .quad \@
+ .popsection
+ .pushsection .toc, "aw"
+.LT\@: .tc \sym\@[TC], \sym\@
+ .popsection
+ ld 3,.LT\@@toc(2)
+ .endm
+
+
+ .macro in123
+ .pushsection .toc, "aw"
+.LThello:
+ .tc hello[TC],hello
+ .popsection
+
+ .pushsection .rodata
+hello: .asciz "Hello, world!\n"
+ .popsection
+
+ .pushsection .text.in123, "axG", @progbits, in123, comdat
+ .weak in123
+ start in123
+ ld 3, .LThello@toc(2)
+ #bl printf
+ nop
+ end in123
+ .popsection
+ .endm
+
+
+ .macro in23
+ .pushsection .text
+ forward local, in123
+ .popsection
+
+ .pushsection .text.in23, "axG", @progbits, in23, comdat
+ .weak in23
+ forward in23, local
+ .popsection
+ .endm
+
+
+ .macro gobblegot, sym
+ .pushsection .text
+ .globl \sym
+ start \sym
+ .rept 5000
+ usegot a
+ .endr
+ end \sym
+ .popsection
+ .endm
--- /dev/null
+#...
+.* bl .*<.*long_branch_r2off\.f1>
+.* ld *r2,40\(r1\)
+.* bl .*<.*long_branch_r2off\.f2>
+.* ld *r2,40\(r1\)
+.* bl .*<\.f3>
+.* nop
+.* bl .*<.*long_branch_r2off\.g2>
+.* ld *r2,40\(r1\)
+.* bl .*<.*long_branch_r2off\.in23>
+.* ld *r2,40\(r1\)
+#pass
--- /dev/null
+ .include "tocopt6-inc.s"
+ in123
+ gobblegot f1
--- /dev/null
+ .include "tocopt6-inc.s"
+ in123
+ in23
+ gobblegot f2
+
+ .section .text
+ .globl g2
+ forward g2, in23
--- /dev/null
+ .include "tocopt6-inc.s"
+ in123
+ in23
+ gobblegot f3
+
+ .section .text
+ .globl main
+ start main
+ bl f1
+ nop
+ bl f2
+ nop
+ bl f3
+ nop
+ bl g2
+ nop
+ bl in23
+ nop
+ li 3, 0
+ end main