From: Ian Lance Taylor Date: Thu, 9 Jan 1997 19:13:42 +0000 (+0000) Subject: * read.c (emit_expr): Check for overflow of a negative value X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6468dabdecc5e692fcd9d179d802ac6c37d985ec;p=binutils-gdb.git * read.c (emit_expr): Check for overflow of a negative value correctly. * write.c (fixup_segment): Likewise. * config/obj-coff.c (fixup_segment): Likewise. PR 11411. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index adbeaeae049..777616304d2 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,10 @@ Thu Jan 9 09:08:43 1997 Ian Lance Taylor + * read.c (emit_expr): Check for overflow of a negative value + correctly. + * write.c (fixup_segment): Likewise. + * config/obj-coff.c (fixup_segment): Likewise. + * config/tc-m68k.c (struct label_line): Define. (labels, current_label): New static variables. (md_assemble): Mark current_label as text, and clear it. diff --git a/gas/read.c b/gas/read.c index f63bae405c4..7488ddcceb2 100644 --- a/gas/read.c +++ b/gas/read.c @@ -3198,14 +3198,25 @@ emit_expr (exp, nbytes) register valueT get; register valueT use; register valueT mask; + valueT hibit; register valueT unmask; /* JF << of >= number of bits in the object is undefined. In particular SPARC (Sun 4) has problems */ if (nbytes >= sizeof (valueT)) - mask = 0; + { + mask = 0; + if (nbytes > sizeof (valueT)) + hibit = 0; + else + hibit = (valueT) 1 << (nbytes * BITS_PER_CHAR - 1); + } else - mask = ~(valueT) 0 << (BITS_PER_CHAR * nbytes); /* Don't store these bits. */ + { + /* Don't store these bits. */ + mask = ~(valueT) 0 << (BITS_PER_CHAR * nbytes); + hibit = (valueT) 1 << (nbytes * BITS_PER_CHAR - 1); + } unmask = ~mask; /* Do store these bits. */ @@ -3216,7 +3227,9 @@ emit_expr (exp, nbytes) get = exp->X_add_number; use = get & unmask; - if ((get & mask) != 0 && (get & mask) != mask) + if ((get & mask) != 0 + && ((get & mask) != mask + || (get & hibit) == 0)) { /* Leading bits contain both 0s & 1s. */ as_warn ("Value 0x%lx truncated to 0x%lx.", (unsigned long) get, (unsigned long) use);