aboutsummaryrefslogtreecommitdiff
path: root/gas/config
diff options
context:
space:
mode:
authorThiemo Seufer <ths@networkno.de>2003-09-18 05:20:04 +0000
committerThiemo Seufer <ths@networkno.de>2003-09-18 05:20:04 +0000
commitae826530f3d83e7923a4d0beea55ea83fc38d5f4 (patch)
tree9db2bcffb2eb604a32a8d53445d3756dde248f9b /gas/config
parentcdbf20f73486c66e24f322400eba877eb534ae51 (diff)
downloadgdb-ae826530f3d83e7923a4d0beea55ea83fc38d5f4.zip
gdb-ae826530f3d83e7923a4d0beea55ea83fc38d5f4.tar.gz
gdb-ae826530f3d83e7923a4d0beea55ea83fc38d5f4.tar.bz2
* 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.
Diffstat (limited to 'gas/config')
-rw-r--r--gas/config/tc-mips.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index 8c7c69e..e638883 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