Fix an opd->append index in elf64-ppc.c

bfd/
	* 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.

ld/testsuite/
	* 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.
This commit is contained in:
Richard Sandiford 2015-07-05 19:56:59 +01:00
parent 533edc14b8
commit 92a9c616e4
9 changed files with 145 additions and 1 deletions

View File

@ -1,3 +1,9 @@
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>

View File

@ -11640,7 +11640,7 @@ toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
{
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;

View File

@ -1,3 +1,10 @@
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>

View File

@ -215,6 +215,8 @@ set ppc64elftests {
{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"}
}

View File

@ -0,0 +1,86 @@
.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

View File

@ -0,0 +1,12 @@
#...
.* 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

View File

@ -0,0 +1,3 @@
.include "tocopt6-inc.s"
in123
gobblegot f1

View File

@ -0,0 +1,8 @@
.include "tocopt6-inc.s"
in123
in23
gobblegot f2
.section .text
.globl g2
forward g2, in23

View File

@ -0,0 +1,20 @@
.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