diff options
Diffstat (limited to 'binutils-2.25/gas/config/tc-v850.c')
-rw-r--r-- | binutils-2.25/gas/config/tc-v850.c | 43 |
1 files changed, 24 insertions, 19 deletions
diff --git a/binutils-2.25/gas/config/tc-v850.c b/binutils-2.25/gas/config/tc-v850.c index a23387c1..91acec4e 100644 --- a/binutils-2.25/gas/config/tc-v850.c +++ b/binutils-2.25/gas/config/tc-v850.c @@ -1,5 +1,5 @@ /* tc-v850.c -- Assembler code for the NEC V850 - Copyright 1996-2013 Free Software Foundation, Inc. + Copyright (C) 1996-2014 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -27,9 +27,6 @@ /* Sign-extend a 16-bit number. */ #define SEXT16(x) ((((x) & 0xffff) ^ (~0x7fff)) + 0x8000) -/* Temporarily holds the reloc in a cons expression. */ -static bfd_reloc_code_real_type hold_cons_reloc = BFD_RELOC_UNUSED; - /* Set to TRUE if we want to be pedantic about signed overflows. */ static bfd_boolean warn_signed_overflows = FALSE; static bfd_boolean warn_unsigned_overflows = FALSE; @@ -2032,6 +2029,12 @@ handle_lo16 (const struct v850_operand *operand, const char **errmsg) static bfd_reloc_code_real_type handle_ctoff (const struct v850_operand *operand, const char **errmsg) { + if (v850_target_arch == bfd_arch_v850_rh850) + { + *errmsg = _("ctoff() is not supported by the rh850 ABI. Use -mgcc-abi instead"); + return BFD_RELOC_64; /* Used to indicate an error condition. */ + } + if (operand == NULL) return BFD_RELOC_V850_CALLT_16_16_OFFSET; @@ -2156,7 +2159,7 @@ v850_reloc_prefix (const struct v850_operand *operand, const char **errmsg) if (paren_skipped) --input_line_pointer; - return BFD_RELOC_UNUSED; + return BFD_RELOC_NONE; } /* Insert an operand value into an instruction. */ @@ -2407,7 +2410,7 @@ md_assemble (char *str) input_line_pointer = str; /* lo(), hi(), hi0(), etc... */ - if ((reloc = v850_reloc_prefix (operand, &errmsg)) != BFD_RELOC_UNUSED) + if ((reloc = v850_reloc_prefix (operand, &errmsg)) != BFD_RELOC_NONE) { /* This is a fake reloc, used to indicate an error condition. */ if (reloc == BFD_RELOC_64) @@ -2977,7 +2980,7 @@ md_assemble (char *str) fixups[fc].exp = ex; fixups[fc].opindex = *opindex_ptr; - fixups[fc].reloc = BFD_RELOC_UNUSED; + fixups[fc].reloc = BFD_RELOC_NONE; ++fc; break; } @@ -3239,7 +3242,7 @@ md_assemble (char *str) reloc = fixups[i].reloc; - if (reloc != BFD_RELOC_UNUSED) + if (reloc != BFD_RELOC_NONE) { reloc_howto_type *reloc_howto = bfd_reloc_type_lookup (stdoutput, reloc); @@ -3634,15 +3637,18 @@ md_apply_fix (fixS *fixP, valueT *valueP, segT seg ATTRIBUTE_UNUSED) /* Parse a cons expression. We have to handle hi(), lo(), etc on the v850. */ -void +bfd_reloc_code_real_type parse_cons_expression_v850 (expressionS *exp) { const char *errmsg; + bfd_reloc_code_real_type r; + /* See if there's a reloc prefix like hi() we have to handle. */ - hold_cons_reloc = v850_reloc_prefix (NULL, &errmsg); + r = v850_reloc_prefix (NULL, &errmsg); /* Do normal expression parsing. */ expression (exp); + return r; } /* Create a fixup for a cons expression. If parse_cons_expression_v850 @@ -3653,24 +3659,23 @@ void cons_fix_new_v850 (fragS *frag, int where, int size, - expressionS *exp) + expressionS *exp, + bfd_reloc_code_real_type r) { - if (hold_cons_reloc == BFD_RELOC_UNUSED) + if (r == BFD_RELOC_NONE) { if (size == 4) - hold_cons_reloc = BFD_RELOC_32; + r = BFD_RELOC_32; if (size == 2) - hold_cons_reloc = BFD_RELOC_16; + r = BFD_RELOC_16; if (size == 1) - hold_cons_reloc = BFD_RELOC_8; + r = BFD_RELOC_8; } if (exp != NULL) - fix_new_exp (frag, where, size, exp, 0, hold_cons_reloc); + fix_new_exp (frag, where, size, exp, 0, r); else - fix_new (frag, where, size, NULL, 0, 0, hold_cons_reloc); - - hold_cons_reloc = BFD_RELOC_UNUSED; + fix_new (frag, where, size, NULL, 0, 0, r); } bfd_boolean |