diff options
author | Alan Modra <amodra@gmail.com> | 2017-02-28 08:32:36 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2017-02-28 11:59:47 +1030 |
commit | 7ba71655a425ac44721f97cc0ad7922ca15bce43 (patch) | |
tree | 21c74fc0cf464c5ef896b43c385daa8f6f47b0a7 /ld/testsuite | |
parent | afbf7e8e3aa24152ad58e430c8d37d82e5751f1c (diff) | |
download | gdb-7ba71655a425ac44721f97cc0ad7922ca15bce43.zip gdb-7ba71655a425ac44721f97cc0ad7922ca15bce43.tar.gz gdb-7ba71655a425ac44721f97cc0ad7922ca15bce43.tar.bz2 |
PowerPC addpcis fix
This came up because I was looking at ld/tmpdir/addpcis.o and noticed
the odd addends on REL16DX_HA. They ought to both be -4. The error
crept in due REL16DX_HA howto being pc-relative (as indeed it should
be), and code at gas/write.c:1001 after this comment
/* Make it pc-relative. If the back-end code has not
selected a pc-relative reloc, cancel the adjustment
we do later on all pc-relative relocs. */
*not* cancelling the pc-relative adjustment. So I've made a dummy
non-relative split reloc so that the generic code handles this, rather
than attempting to add hacks later in md_apply_fix which would not be
very robust. Having the new internal reloc also makes it easy to
support
addpcis rx,sym@ha
as an equivalent to
addpcis rx,(sym-0f)@ha
0:
The patch also fixes overflow checking, which must test whether the
addi will overflow too since @l relocs don't have any overflow check.
Lastly, since I was poking at md_apply_fix, I arranged to have the
generic gas/write.c code emit errors for subtraction expressions where
we lack reloc support.
include/
* elf/ppc64.h (R_PPC64_16DX_HA): New. Expand fake reloc comment.
* elf/ppc.h (R_PPC_16DX_HA): Likewise.
bfd/
* reloc.c (BFD_RELOC_PPC_16DX_HA): New.
* elf64-ppc.c (ppc64_elf_howto_raw <R_PPC64_16DX_HA>): New howto.
(ppc64_elf_reloc_type_lookup): Translate new bfd reloc.
(ppc64_elf_ha_reloc): Correct overflow test on REL16DX_HA.
(ppc64_elf_relocate_section): Likewise.
* elf32-ppc.c (ppc_elf_howto_raw <R_PPC_16DX_HA>): New howto.
(ppc_elf_reloc_type_lookup): Translate new bfd reloc.
(ppc_elf_check_relocs): Handle R_PPC_16DX_HA to pacify gcc.
* libbfd.h: Regenerate.
* bfd-in2.h: Regenerate.
gas/
* config/tc-ppc.c (md_assemble): Use BFD_RELOC_PPC_16DX_HA for addpcis.
(md_apply_fix): Remove fx_subsy check. Move code converting to
pcrel reloc earlier and handle BFD_RELOC_PPC_16DX_HA. Remove code
emiiting errors on seeing fx_pcrel set on unexpected relocs, as
that is done now by the generic code via..
* config/tc-ppc.h (TC_FORCE_RELOCATION_SUB_LOCAL): ..this. Define.
(TC_VALIDATE_FIX_SUB): Define.
ld/
* testsuite/ld-powerpc/addpcis.d: Define ext1 and ext2 at
limits of addpcis range.
Diffstat (limited to 'ld/testsuite')
-rw-r--r-- | ld/testsuite/ld-powerpc/addpcis.d | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/ld/testsuite/ld-powerpc/addpcis.d b/ld/testsuite/ld-powerpc/addpcis.d index c0e2679..b150ca4 100644 --- a/ld/testsuite/ld-powerpc/addpcis.d +++ b/ld/testsuite/ld-powerpc/addpcis.d @@ -1,6 +1,6 @@ #source: addpcis.s #as: -a64 -mpower9 -#ld: -melf64ppc -Ttext=0x10000000 --defsym ext1=0 --defsym ext2=0x8fff0000 +#ld: -melf64ppc -Ttext=0x10000000 --defsym ext1=-0x70007ffc --defsym ext2=0x8fff800b #objdump: -d -Mpower9 .*: file format .* @@ -8,10 +8,10 @@ Disassembly of section \.text: 0+10000000 <_start>: - 10000000: (4c 60 f0 04|04 f0 60 4c) addpcis r3,-4096 - 10000004: (38 63 ff fc|fc ff 63 38) addi r3,r3,-4 + 10000000: (4c 60 80 04|04 80 60 4c) addpcis r3,-32768 + 10000004: (38 63 80 00|00 80 63 38) addi r3,r3,-32768 10000008: (4c 9f 7f c5|c5 7f 9f 4c) addpcis r4,32767 - 1000000c: (38 84 ff f4|f4 ff 84 38) addi r4,r4,-12 + 1000000c: (38 84 7f ff|ff 7f 84 38) addi r4,r4,32767 10000010: (4c a0 00 05|05 00 a0 4c) addpcis r5,1 10000014: (38 a5 80 00|00 80 a5 38) addi r5,r5,-32768 \.\.\. |