From d5dcaf1b59e77047e10a1f246095d6b21f7d9772 Mon Sep 17 00:00:00 2001 From: John Darrington Date: Wed, 16 Jan 2019 14:34:50 +0100 Subject: [PATCH] S12Z: Emit RELOC_S12Z_OPR instead of RELOC_EXT24 where appropriate. When assembling instructions which involve OPR references, emit RELOC_S12Z_OPR instead of RELOC_EXT24. bfd/ * bfd-in2.h [BFD_RELOC_S12Z_OPR]: New reloc. * libbfd.h: regen. * elf32-s12z.c (eld_s12z_howto_table): R_S12Z_OPR takes non zero source field. (md_apply_fix): Apply final fix to BFD_RELOC_S12Z_OPR. * reloc.c[BFD_RELOC_S12Z_OPR]: New reloc. gas/ * config/tc-s12z.c (emit_opr): Emit BFD_RELOC_S12Z_OPR instead of BFD_RELOC_24. * testsuite/gas/s12z/opr-indirect-expr.d: Expect R_S12Z_OPR instead of R_S12Z_EXT24. --- bfd/ChangeLog | 9 +++++++++ bfd/bfd-in2.h | 3 +++ bfd/elf32-s12z.c | 13 +++++++------ bfd/libbfd.h | 1 + bfd/reloc.c | 5 +++++ gas/ChangeLog | 7 +++++++ gas/config/tc-s12z.c | 18 ++++++++++++------ gas/testsuite/gas/s12z/opr-indirect-expr.d | 2 +- 8 files changed, 45 insertions(+), 13 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 7a75517..5e943a1 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2019-01-14 John Darrington + + * bfd-in2.h [BFD_RELOC_S12Z_OPR]: New reloc. + * libbfd.h: regen. + * elf32-s12z.c (eld_s12z_howto_table): R_S12Z_OPR takes non zero + source field. (md_apply_fix): Apply final fix + to BFD_RELOC_S12Z_OPR. + * reloc.c[BFD_RELOC_S12Z_OPR]: New reloc. + 2019-01-14 Maamoun Tarsha PR 20113 diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index b78d212..e25da50 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -6696,6 +6696,9 @@ assembler and not (currently) written to any object files. */ BFD_RELOC_CKCORE_IRELATIVE, BFD_RELOC_CKCORE_PCREL_BLOOP_IMM4BY4, BFD_RELOC_CKCORE_PCREL_BLOOP_IMM12BY4, + +/* S12Z relocations. */ + BFD_RELOC_S12Z_OPR, BFD_RELOC_UNUSED }; typedef enum bfd_reloc_code_real bfd_reloc_code_real_type; diff --git a/bfd/elf32-s12z.c b/bfd/elf32-s12z.c index 57681cf..a8f9b4a 100644 --- a/bfd/elf32-s12z.c +++ b/bfd/elf32-s12z.c @@ -119,7 +119,7 @@ static reloc_howto_type elf_s12z_howto_table[] = shift_addend_reloc, "R_S12Z_OPR", /* name */ FALSE, /* partial_inplace */ - 0x00000000, /* src_mask */ + 0x00ffffff, /* src_mask */ 0x00ffffff, /* dst_mask */ FALSE), /* pcrel_offset */ @@ -232,11 +232,12 @@ struct s12z_reloc_map static const struct s12z_reloc_map s12z_reloc_map[] = { - /* bfd reloc val */ /* elf reloc val */ - {BFD_RELOC_NONE, R_S12Z_NONE}, - {BFD_RELOC_32, R_S12Z_EXT32}, - {BFD_RELOC_24, R_S12Z_EXT24}, - {BFD_RELOC_16_PCREL, R_S12Z_PCREL_7_15} + /* bfd reloc val */ /* elf reloc val */ + {BFD_RELOC_NONE, R_S12Z_NONE}, + {BFD_RELOC_32, R_S12Z_EXT32}, + {BFD_RELOC_24, R_S12Z_EXT24}, + {BFD_RELOC_16_PCREL, R_S12Z_PCREL_7_15}, + {BFD_RELOC_S12Z_OPR, R_S12Z_OPR} }; static reloc_howto_type * diff --git a/bfd/libbfd.h b/bfd/libbfd.h index e56ef37..36284d7 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -3320,6 +3320,7 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", "BFD_RELOC_CKCORE_IRELATIVE", "BFD_RELOC_CKCORE_PCREL_BLOOP_IMM4BY4", "BFD_RELOC_CKCORE_PCREL_BLOOP_IMM12BY4", + "BFD_RELOC_S12Z_OPR", "@@overflow: BFD_RELOC_UNUSED@@", }; #endif diff --git a/bfd/reloc.c b/bfd/reloc.c index b8a1cfe..e6446a7 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -8052,6 +8052,11 @@ ENUMX ENUMDOC C-SKY relocations. +ENUM + BFD_RELOC_S12Z_OPR +ENUMDOC + S12Z relocations. + ENDSENUM BFD_RELOC_UNUSED CODE_FRAGMENT diff --git a/gas/ChangeLog b/gas/ChangeLog index abc0923..986af84 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2019-01-16 John Darrington + + * config/tc-s12z.c (emit_opr): Emit BFD_RELOC_S12Z_OPR instead of + BFD_RELOC_24. + * testsuite/gas/s12z/opr-indirect-expr.d: Expect R_S12Z_OPR instead + of R_S12Z_EXT24. + 2019-01-14 Srinath Parvathaneni * config/tc-arm.c (arm_ext_v6k_v6t2): Define. diff --git a/gas/config/tc-s12z.c b/gas/config/tc-s12z.c index 2f98c04..7d1ddf6 100644 --- a/gas/config/tc-s12z.c +++ b/gas/config/tc-s12z.c @@ -732,12 +732,17 @@ emit_opr (char *f, const uint8_t *buffer, int n_bytes, expressionS *exp) number_to_chars_bigendian (f++, buffer[0], 1); if (exp->X_op != O_absent && exp->X_op != O_constant) { - fix_new_exp (frag_now, - f - frag_now->fr_literal, - 3, - exp, - FALSE, - BFD_RELOC_24); + fixS *fix = fix_new_exp (frag_now, + f - frag_now->fr_literal, + 3, + exp, + FALSE, + BFD_RELOC_S12Z_OPR); + /* Some third party tools seem to use the lower bits + of this addend for flags. They don't get added + to the final location. The purpose of these flags + is not known. We simply set it to zero. */ + fix->fx_addnumber = 0x00; } for (i = 1; i < n_bytes; ++i) number_to_chars_bigendian (f++, buffer[i], 1); @@ -3821,6 +3826,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) bfd_putb16 ((bfd_vma) value, (unsigned char *) where); break; case BFD_RELOC_24: + case BFD_RELOC_S12Z_OPR: bfd_putb24 ((bfd_vma) value, (unsigned char *) where); break; case BFD_RELOC_32: diff --git a/gas/testsuite/gas/s12z/opr-indirect-expr.d b/gas/testsuite/gas/s12z/opr-indirect-expr.d index f7a1fcd..8facde5 100644 --- a/gas/testsuite/gas/s12z/opr-indirect-expr.d +++ b/gas/testsuite/gas/s12z/opr-indirect-expr.d @@ -11,4 +11,4 @@ Disassembly of section .text: 00000000 <.text>: 0: a7 fe 00 00 ld d7, \[1\] 4: 01 - 2: R_S12Z_EXT24 FOO + 2: R_S12Z_OPR FOO -- 2.7.4