From: Thiemo Seufer Date: Thu, 18 Sep 2003 05:20:04 +0000 (+0000) Subject: * config/tc-mips.c (macro_build_ldst_constoffset): Don't silently X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ae826530f3d83e7923a4d0beea55ea83fc38d5f4;p=binutils-gdb.git * config/tc-mips.c (macro_build_ldst_constoffset): Don't silently truncate values which won't fit im 32 bits. (load_register): Likewise. (macro): Likewise. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index bbd7ecd197c..53942b7c3f6 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2003-09-18 Thiemo Seufer + + * config/tc-mips.c (macro_build_ldst_constoffset): Don't silently + truncate values which won't fit im 32 bits. + (load_register): Likewise. + (macro): Likewise. + 2003-09-17 Dmitry Diky * config/tc-msp430.c (MAX_OP_LEN): Set to 256. diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index 8c7c69e7c38..e63888354ca 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -3229,8 +3229,14 @@ macro_build_ldst_constoffset (char *place, int *counter, expressionS *ep, /* Sign-extending 32-bit constants makes their handling easier. */ if (! dbl) + { + if (ep->X_add_number & ~((bfd_vma) 0xffffffff) + && ~(ep->X_add_number | 0xffffffff)) + as_bad (_("too large constant specified")); + ep->X_add_number = (((ep->X_add_number & 0xffffffff) ^ 0x80000000) - 0x80000000); + } /* Right now, this routine can only handle signed 32-bit contants. */ if (! IS_SEXT_32BIT_NUM(ep->X_add_number)) @@ -3387,8 +3393,14 @@ load_register (int *counter, int reg, expressionS *ep, int dbl) /* Sign-extending 32-bit constants makes their handling easier. */ if (! dbl) + { + if (ep->X_add_number & ~((bfd_vma) 0xffffffff) + && ~(ep->X_add_number | 0xffffffff)) + as_bad (_("too large constant specified")); + ep->X_add_number = (((ep->X_add_number & 0xffffffff) ^ 0x80000000) - 0x80000000); + } if (IS_SEXT_16BIT_NUM (ep->X_add_number)) { @@ -5793,8 +5805,14 @@ macro (struct mips_cl_insn *ip) if ((! HAVE_64BIT_ADDRESSES && (! HAVE_64BIT_GPRS && offset_expr.X_op == O_constant)) && (offset_expr.X_op == O_constant)) + { + if (offset_expr.X_add_number & ~((bfd_vma) 0xffffffff) + && ~(offset_expr.X_add_number | 0xffffffff)) + as_bad (_("too large constant specified")); + offset_expr.X_add_number = (((offset_expr.X_add_number & 0xffffffff) ^ 0x80000000) - 0x80000000); + } /* For embedded PIC, we allow loads where the offset is calculated by subtracting a symbol in the current segment from an unknown