aboutsummaryrefslogtreecommitdiff
path: root/gas/write.c
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2021-06-16 08:55:20 +0200
committerJan Beulich <jbeulich@suse.com>2021-06-16 08:55:20 +0200
commit4504a6346777d544a144683bd2a534b686fbac41 (patch)
tree65f18b24a6c7df5caaf8eec8bd7ba25f7f466875 /gas/write.c
parentb80d4475804d5f3c4e9d996229e1569b7b3c8426 (diff)
downloadfsf-binutils-gdb-4504a6346777d544a144683bd2a534b686fbac41.zip
fsf-binutils-gdb-4504a6346777d544a144683bd2a534b686fbac41.tar.gz
fsf-binutils-gdb-4504a6346777d544a144683bd2a534b686fbac41.tar.bz2
gas: fix overflow diagnostics
While the logic in fixup_segment() so far was off by 1 for fixups dealing with quantities without known signedness, thus failing to report an overflow when e.g. a byte-sized resulting value is -0x100, the logic in emit_expr_with_reloc() reported an overflow even on large negative values when the respective positive ones would not be warned about, and when fixup_segment() wouldn't do so either. Such diagnostics all ought to follow a similar pattern of what value range is acceptable. (If expressions' X_unsigned was reliably set, emit_expr_with_reloc()'s checking might make sense to tighten based on that flag.) Note that with commit 80aab57939a0 ("Changes to let cons handle bignums like general expressions") having added handling of nbytes > sizeof(valueT) in the O_constant case, converting to O_big, the setting to zero of "hibit" had become dead. With "hibit" no longer used, this code now gets dropped altogether. But additionally a respective know() gets inserted.
Diffstat (limited to 'gas/write.c')
-rw-r--r--gas/write.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/gas/write.c b/gas/write.c
index 682e28f..7dc78b7 100644
--- a/gas/write.c
+++ b/gas/write.c
@@ -1107,7 +1107,10 @@ fixup_segment (fixS *fixP, segT this_segment)
mask = 0;
mask--; /* Set all bits to one. */
mask <<= fixP->fx_size * 8 - (fixP->fx_signed ? 1 : 0);
- if ((add_number & mask) != 0 && (add_number & mask) != mask)
+ if ((add_number & mask) != 0
+ && (fixP->fx_signed
+ ? (add_number & mask) != mask
+ : (-add_number & mask) != 0))
{
char buf[50], buf2[50];
bfd_sprintf_vma (stdoutput, buf, fragP->fr_address + fixP->fx_where);