diff options
author | Stafford Horne <shorne@gmail.com> | 2021-05-06 20:51:24 +0900 |
---|---|---|
committer | Stafford Horne <shorne@gmail.com> | 2021-05-06 20:51:24 +0900 |
commit | 0b3e14c90283c5d234884d0ebe8510bc3c9bc687 (patch) | |
tree | fb335ba73d837382eb109019f7e4b8ac8f379501 | |
parent | a76ef689b60405e494cb99e198acf3c82f467f7d (diff) | |
download | gdb-0b3e14c90283c5d234884d0ebe8510bc3c9bc687.zip gdb-0b3e14c90283c5d234884d0ebe8510bc3c9bc687.tar.gz gdb-0b3e14c90283c5d234884d0ebe8510bc3c9bc687.tar.bz2 |
or1k: Implement relocation R_OR1K_GOT_AHI16 for gotha()
The gotha() relocation mnemonic will be outputted by OpenRISC GCC when
using the -mcmodel=large option. This relocation is used along with
got() to generate 32-bit GOT offsets. This increases the previous GOT
offset limit from the previous 16-bit (64K) limit.
This is needed on large binaries where the GOT grows larger than 64k.
bfd/ChangeLog:
PR 21464
* bfd-in2.h: Add BFD_RELOC_OR1K_GOT_AHI16 relocation.
* elf32-or1k.c (or1k_elf_howto_table, or1k_reloc_map): Likewise.
(or1k_final_link_relocate, or1k_elf_relocate_section,
or1k_elf_check_relocs): Likewise.
* libbfd.h (bfd_reloc_code_real_names): Likewise.
* reloc.c: Likewise.
cpu/ChangeLog:
PR 21464
* or1k.opc (or1k_imm16_relocs, parse_reloc): Define parse logic
for gotha() relocation.
include/ChangeLog:
PR 21464
* elf/or1k.h (elf_or1k_reloc_type): Define R_OR1K_GOT_AHI16 number.
opcodes/ChangeLog:
PR 21464
* or1k-asm.c: Regenerate.
gas/ChangeLog:
PR 21464
* testsuite/gas/or1k/reloc-1.s: Add test for new relocation.
* testsuite/gas/or1k/reloc-1.d: Add test result for new
relocation.
Cc: Giulio Benetti <giulio.benetti@benettiengineering.com>
fixup reloc, add tests
-rw-r--r-- | bfd/ChangeLog | 10 | ||||
-rw-r--r-- | bfd/bfd-in2.h | 1 | ||||
-rw-r--r-- | bfd/elf32-or1k.c | 21 | ||||
-rw-r--r-- | bfd/libbfd.h | 1 | ||||
-rw-r--r-- | bfd/reloc.c | 2 | ||||
-rw-r--r-- | cpu/ChangeLog | 6 | ||||
-rw-r--r-- | cpu/or1k.opc | 7 | ||||
-rw-r--r-- | gas/ChangeLog | 7 | ||||
-rw-r--r-- | gas/testsuite/gas/or1k/reloc-1.d | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/or1k/reloc-1.s | 4 | ||||
-rw-r--r-- | include/ChangeLog | 5 | ||||
-rw-r--r-- | include/elf/or1k.h | 1 | ||||
-rw-r--r-- | opcodes/ChangeLog | 5 | ||||
-rw-r--r-- | opcodes/or1k-asm.c | 7 |
14 files changed, 77 insertions, 4 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 7a6b9a1..c4a83df 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,15 @@ 2021-05-06 Stafford Horne <shorne@gmail.com> + PR 21464 + * bfd-in2.h: Add BFD_RELOC_OR1K_GOT_AHI16 relocation. + * elf32-or1k.c (or1k_elf_howto_table, or1k_reloc_map): Likewise. + (or1k_final_link_relocate, or1k_elf_relocate_section, + or1k_elf_check_relocs): Likewise. + * libbfd.h (bfd_reloc_code_real_names): Likewise. + * reloc.c: Likewise. + +2021-05-06 Stafford Horne <shorne@gmail.com> + PR 27624 * elf32-or1k.c (or1k_elf_adjust_dynamic_symbol): Change condition used to cleanup plt entries to cleanup forced local diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index d5780e4..7650522 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -5032,6 +5032,7 @@ then it may be truncated to 8 bits. */ BFD_RELOC_OR1K_TLS_TPOFF, BFD_RELOC_OR1K_TLS_DTPOFF, BFD_RELOC_OR1K_TLS_DTPMOD, + BFD_RELOC_OR1K_GOT_AHI16, /* H8 elf Relocations. */ BFD_RELOC_H8_DIR16A8, diff --git a/bfd/elf32-or1k.c b/bfd/elf32-or1k.c index cc6c512..1b8938d 100644 --- a/bfd/elf32-or1k.c +++ b/bfd/elf32-or1k.c @@ -808,6 +808,20 @@ static reloc_howto_type or1k_elf_howto_table[] = 0, /* Source Mask. */ 0x03ffffff, /* Dest Mask. */ true), /* PC relative offset? */ + + HOWTO (R_OR1K_GOT_AHI16, /* type */ + 16, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 16, /* bitsize */ + false, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_OR1K_GOT_AHI16", /* name */ + false, /* partial_inplace */ + 0, /* src_mask */ + 0xffff, /* dst_mask */ + false), /* pcrel_offset */ }; /* Map BFD reloc types to Or1k ELF reloc types. */ @@ -871,6 +885,7 @@ static const struct or1k_reloc_map or1k_reloc_map[] = { BFD_RELOC_OR1K_TLS_IE_LO13, R_OR1K_TLS_IE_LO13 }, { BFD_RELOC_OR1K_SLO13, R_OR1K_SLO13 }, { BFD_RELOC_OR1K_PLTA26, R_OR1K_PLTA26 }, + { BFD_RELOC_OR1K_GOT_AHI16, R_OR1K_GOT_AHI16 }, }; /* tls_type is a mask used to track how each symbol is accessed, @@ -1111,6 +1126,7 @@ or1k_final_link_relocate (reloc_howto_type *howto, bfd *input_bfd, switch (howto->type) { case R_OR1K_AHI16: + case R_OR1K_GOT_AHI16: case R_OR1K_GOTOFF_AHI16: case R_OR1K_TLS_IE_AHI16: case R_OR1K_TLS_LE_AHI16: @@ -1373,6 +1389,7 @@ or1k_elf_relocate_section (bfd *output_bfd, } break; + case R_OR1K_GOT_AHI16: case R_OR1K_GOT16: case R_OR1K_GOT_PG21: case R_OR1K_GOT_LO13: @@ -1464,7 +1481,8 @@ or1k_elf_relocate_section (bfd *output_bfd, /* The GOT_PG21 and GOT_LO13 relocs are pc-relative, while the GOT16 reloc is GOT relative. */ relocation = got_base + off; - if (r_type == R_OR1K_GOT16) + if (r_type == R_OR1K_GOT16 + || r_type == R_OR1K_GOT_AHI16) relocation -= got_sym_value; /* Addend should be zero. */ @@ -1990,6 +2008,7 @@ or1k_elf_check_relocs (bfd *abfd, } break; + case R_OR1K_GOT_AHI16: case R_OR1K_GOT16: case R_OR1K_GOT_PG21: case R_OR1K_GOT_LO13: diff --git a/bfd/libbfd.h b/bfd/libbfd.h index f3a32fa..bbd3b0d 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -2774,6 +2774,7 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", "BFD_RELOC_OR1K_TLS_TPOFF", "BFD_RELOC_OR1K_TLS_DTPOFF", "BFD_RELOC_OR1K_TLS_DTPMOD", + "BFD_RELOC_OR1K_GOT_AHI16", "BFD_RELOC_H8_DIR16A8", "BFD_RELOC_H8_DIR16R8", "BFD_RELOC_H8_DIR24A8", diff --git a/bfd/reloc.c b/bfd/reloc.c index 674b075..6d920e1 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -6207,6 +6207,8 @@ ENUMX ENUMX BFD_RELOC_OR1K_GOTPC_LO16 ENUMX + BFD_RELOC_OR1K_GOT_AHI16 +ENUMX BFD_RELOC_OR1K_GOT16 ENUMX BFD_RELOC_OR1K_GOT_PG21 diff --git a/cpu/ChangeLog b/cpu/ChangeLog index f6e5087..2739df0 100644 --- a/cpu/ChangeLog +++ b/cpu/ChangeLog @@ -1,3 +1,9 @@ +2021-05-06 Stafford Horne <shorne@gmail.com> + + PR 21464 + * or1k.opc (or1k_imm16_relocs, parse_reloc): Define parse logic + for gotha() relocation. + 2021-03-31 Alan Modra <amodra@gmail.com> * frv.opc: Replace bfd_boolean with bool, FALSE with false, and diff --git a/cpu/or1k.opc b/cpu/or1k.opc index f0adcbb..5d20a1f 100644 --- a/cpu/or1k.opc +++ b/cpu/or1k.opc @@ -193,7 +193,7 @@ static const bfd_reloc_code_real_type or1k_imm16_relocs[][6] = { BFD_RELOC_OR1K_GOT_LO13, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, - BFD_RELOC_UNUSED }, + BFD_RELOC_OR1K_GOT_AHI16 }, { BFD_RELOC_OR1K_GOTPC_LO16, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, @@ -296,6 +296,11 @@ parse_reloc (const char **strp) str += 5; cls = RCLASS_TPOFF; } + else if (strncasecmp (str, "got", 3) == 0) + { + str += 3; + cls = RCLASS_GOT; + } if (strncasecmp (str, "hi(", 3) == 0) { diff --git a/gas/ChangeLog b/gas/ChangeLog index fa1c100..790951a 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2021-05-06 Stafford Horne <shorne@gmail.com> + + PR 21464 + * testsuite/gas/or1k/reloc-1.s: Add test for new relocation. + * testsuite/gas/or1k/reloc-1.d: Add test result for new + relocation. + 2021-05-03 Christoph Muellner <cmuellner@gcc.gnu.org> PR 27764 diff --git a/gas/testsuite/gas/or1k/reloc-1.d b/gas/testsuite/gas/or1k/reloc-1.d index d1bcf56..3a001c4 100644 --- a/gas/testsuite/gas/or1k/reloc-1.d +++ b/gas/testsuite/gas/or1k/reloc-1.d @@ -68,5 +68,7 @@ OFFSET TYPE VALUE 000000ec R_OR1K_LO13 x 000000f0 R_OR1K_GOT_LO13 x 000000f4 R_OR1K_SLO13 x - +000000f8 R_OR1K_GOT_AHI16 x +000000fc R_OR1K_GOT_AHI16 x +00000100 R_OR1K_GOT_AHI16 x diff --git a/gas/testsuite/gas/or1k/reloc-1.s b/gas/testsuite/gas/or1k/reloc-1.s index e76abef..562609a 100644 --- a/gas/testsuite/gas/or1k/reloc-1.s +++ b/gas/testsuite/gas/or1k/reloc-1.s @@ -74,3 +74,7 @@ l.lbz r5,po(x)(r3) l.lbz r5,gotpo(x)(r3) l.sb po(x)(r3),r6 + + l.movhi r4,gotha(x) + l.ori r3,r4,gotha(x) + l.addi r3,r4,gotha(x) diff --git a/include/ChangeLog b/include/ChangeLog index aed37fd..621045e 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,8 @@ +2021-05-06 Stafford Horne <shorne@gmail.com> + + PR 21464 + * elf/or1k.h (elf_or1k_reloc_type): Define R_OR1K_GOT_AHI16 number. + 2021-05-06 Nick Alcock <nick.alcock@oracle.com> * ctf.h (CTF_K_UNKNOWN): Document that it can be used for diff --git a/include/elf/or1k.h b/include/elf/or1k.h index 7f28148..69ab905 100644 --- a/include/elf/or1k.h +++ b/include/elf/or1k.h @@ -77,6 +77,7 @@ START_RELOC_NUMBERS (elf_or1k_reloc_type) RELOC_NUMBER (R_OR1K_TLS_IE_LO13, 51) RELOC_NUMBER (R_OR1K_SLO13, 52) RELOC_NUMBER (R_OR1K_PLTA26, 53) + RELOC_NUMBER (R_OR1K_GOT_AHI16, 54) END_RELOC_NUMBERS (R_OR1K_max) #define EF_OR1K_NODELAY (1UL << 0) diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 979b18c..bc5d44f 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,8 @@ +2021-05-06 Stafford Horne <shorne@gmail.com> + + PR 21464 + * or1k-asm.c: Regenerate. + 2021-05-01 Max Filippov <jcmvbkbc@gmail.com> * xtensa-dis.c (print_insn_xtensa): Fill in info->insn_type and diff --git a/opcodes/or1k-asm.c b/opcodes/or1k-asm.c index 045ab62..fdccf67 100644 --- a/opcodes/or1k-asm.c +++ b/opcodes/or1k-asm.c @@ -177,7 +177,7 @@ static const bfd_reloc_code_real_type or1k_imm16_relocs[][6] = { BFD_RELOC_OR1K_GOT_LO13, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, - BFD_RELOC_UNUSED }, + BFD_RELOC_OR1K_GOT_AHI16 }, { BFD_RELOC_OR1K_GOTPC_LO16, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, @@ -280,6 +280,11 @@ parse_reloc (const char **strp) str += 5; cls = RCLASS_TPOFF; } + else if (strncasecmp (str, "got", 3) == 0) + { + str += 3; + cls = RCLASS_GOT; + } if (strncasecmp (str, "hi(", 3) == 0) { |