aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorJohn Darrington <john@darrington.wattle.id.au>2019-01-16 14:34:50 +0100
committerJohn Darrington <john@darrington.wattle.id.au>2019-01-16 14:39:04 +0100
commitd5dcaf1b59e77047e10a1f246095d6b21f7d9772 (patch)
treef0849cbdc103770465bd83bf4905515b0191b270 /bfd
parent338c923d26fa86f695fcdc4b659a5f0772768093 (diff)
downloadbinutils-d5dcaf1b59e77047e10a1f246095d6b21f7d9772.zip
binutils-d5dcaf1b59e77047e10a1f246095d6b21f7d9772.tar.gz
binutils-d5dcaf1b59e77047e10a1f246095d6b21f7d9772.tar.bz2
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.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog9
-rw-r--r--bfd/bfd-in2.h3
-rw-r--r--bfd/elf32-s12z.c13
-rw-r--r--bfd/libbfd.h1
-rw-r--r--bfd/reloc.c5
5 files changed, 25 insertions, 6 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 <john@darrington.wattle.id.au>
+
+ * 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 <maamountk@hotmail.com>
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