From 5a00ea25afb99f2d34e3c0240a32b5a2a78a757d Mon Sep 17 00:00:00 2001 From: Hans-Peter Nilsson Date: Sat, 20 Dec 2008 00:27:35 +0000 Subject: [PATCH] * config/tc-cris.c (cris_process_instruction): Handle BFD_RELOC_CRIS_32_IE, in the test whether the relocation fits. (get_3op_or_dip_prefix_op): Handle TLS/PIC decoration for the "double indirect" addressing mode. (cris_get_reloc_suffix): Add entry for :IE for BFD_RELOC_CRIS_32_IE. (cris_number_to_imm, tc_gen_reloc): Handle BFD_RELOC_CRIS_32_IE. --- gas/ChangeLog | 9 +++++++++ gas/config/tc-cris.c | 8 ++++++++ 2 files changed, 17 insertions(+) diff --git a/gas/ChangeLog b/gas/ChangeLog index 6b06d757d4f..b41964a528c 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,12 @@ +2008-12-20 Hans-Peter Nilsson + + * config/tc-cris.c (cris_process_instruction): Handle + BFD_RELOC_CRIS_32_IE, in the test whether the relocation fits. + (get_3op_or_dip_prefix_op): Handle TLS/PIC decoration for the + "double indirect" addressing mode. + (cris_get_reloc_suffix): Add entry for :IE for BFD_RELOC_CRIS_32_IE. + (cris_number_to_imm, tc_gen_reloc): Handle BFD_RELOC_CRIS_32_IE. + 2008-12-08 H.J. Lu * config/tc-i386.c (build_modrm_byte): Remove an extra blank diff --git a/gas/config/tc-cris.c b/gas/config/tc-cris.c index c64f786eb95..48e17be4507 100644 --- a/gas/config/tc-cris.c +++ b/gas/config/tc-cris.c @@ -2208,6 +2208,7 @@ cris_process_instruction (char *insn_text, struct cris_instruction *out_insnp, as_bad (out_insnp->reloc == BFD_RELOC_CRIS_32_GD || out_insnp->reloc == BFD_RELOC_CRIS_32_TPREL || out_insnp->reloc == BFD_RELOC_CRIS_16_TPREL + || out_insnp->reloc == BFD_RELOC_CRIS_32_IE ? _("TLS relocation size does not match operand size") : _("PIC relocation size does not match operand size")); } @@ -3045,6 +3046,10 @@ get_3op_or_dip_prefix_op (char **cPP, struct cris_prefix *prefixp) prefixp->kind = PREFIX_DIP; prefixp->opcode = DIP_OPCODE | (AUTOINCR_BIT << 8) | REG_PC; prefixp->reloc = BFD_RELOC_32; + + /* For :GD and :IE, it makes sense to have TLS specifiers here. */ + if ((pic || tls) && **cPP == RELOC_SUFFIX_CHAR) + cris_get_reloc_suffix (cPP, &prefixp->reloc, &prefixp->expr); } else /* Neither '[' nor register nor expression. We lose. */ @@ -3489,6 +3494,7 @@ cris_get_reloc_suffix (char **cPP, bfd_reloc_code_real_type *relocp, TLSMAP ("GD", BFD_RELOC_CRIS_32_GD), PICTLSMAP ("DTPREL16", BFD_RELOC_CRIS_16_DTPREL), PICTLSMAP ("DTPREL", BFD_RELOC_CRIS_32_DTPREL), + TLSMAP ("IE", BFD_RELOC_CRIS_32_IE), PICTLSMAP ("TPOFFGOT16", BFD_RELOC_CRIS_16_GOT_TPREL), PICTLSMAP ("TPOFFGOT", BFD_RELOC_CRIS_32_GOT_TPREL), TLSMAP ("TPOFF16", BFD_RELOC_CRIS_16_TPREL), @@ -3630,6 +3636,7 @@ cris_number_to_imm (char *bufp, long val, int n, fixS *fixP, segT seg) case BFD_RELOC_CRIS_32_GOT_GD: case BFD_RELOC_CRIS_16_GOT_GD: case BFD_RELOC_CRIS_32_GD: + case BFD_RELOC_CRIS_32_IE: case BFD_RELOC_CRIS_32_DTPREL: case BFD_RELOC_CRIS_16_DTPREL: case BFD_RELOC_CRIS_32_GOT_TPREL: @@ -3911,6 +3918,7 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixP) case BFD_RELOC_CRIS_32_GOT_GD: case BFD_RELOC_CRIS_16_GOT_GD: case BFD_RELOC_CRIS_32_GD: + case BFD_RELOC_CRIS_32_IE: case BFD_RELOC_CRIS_32_DTPREL: case BFD_RELOC_CRIS_16_DTPREL: case BFD_RELOC_CRIS_32_GOT_TPREL: -- 2.30.2