This is the mail archive of the
binutils-cvs@sourceware.org
mailing list for the binutils project.
[binutils-gdb] S12Z/GAS: Correct a signed vs unsigned comparison error with GCC 4.1
- From: Maciej W.Rozycki <macro at sourceware dot org>
- To: bfd-cvs at sourceware dot org
- Date: 20 Sep 2018 14:50:52 -0000
- Subject: [binutils-gdb] S12Z/GAS: Correct a signed vs unsigned comparison error with GCC 4.1
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=fa9d2bd6b819ce143c149cee83456fa9dfe729b4
commit fa9d2bd6b819ce143c149cee83456fa9dfe729b4
Author: Maciej W. Rozycki <macro@linux-mips.org>
Date: Thu Sep 20 15:49:01 2018 +0100
S12Z/GAS: Correct a signed vs unsigned comparison error with GCC 4.1
Fix a build error:
cc1: warnings being treated as errors
.../gas/config/tc-s12z.c: In function 'lex_opr':
.../gas/config/tc-s12z.c:617: warning: comparison between signed and unsigned
.../gas/config/tc-s12z.c:624: warning: comparison between signed and unsigned
make[4]: *** [config/tc-s12z.o] Error 1
observed with GCC 4.1.2 with the `s12z-elf' target.
Here we have a constant assembly instruction operand, whose value is
within the 24-bit unsigned range, to be placed in a machine instruction
such as to use the least space-consuming encoding. So the sign of that
value does not matter, because signed values are out of range and are
not supposed to appear here, and we only have this warning here because
the `X_add_number' member of `struct expressionS' is of the `offsetT'
type, which is signed.
Use an auxiliary variable of an unsigned data type then, observing that
both `offsetT' and `valueT' have the same width, as they correspond to
`bfd_signed_vma' and `bfd_vma' respectively.
gas/
* config/tc-s12z.c (lex_opr): Use an auxiliary unsigned variable
in encoding a constant operand.
Diff:
---
gas/ChangeLog | 5 +++++
gas/config/tc-s12z.c | 24 +++++++++++++-----------
2 files changed, 18 insertions(+), 11 deletions(-)
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 91af84b..637fc65 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,10 @@
2018-09-20 Maciej W. Rozycki <macro@linux-mips.org>
+ * config/tc-s12z.c (lex_opr): Use an auxiliary unsigned variable
+ in encoding a constant operand.
+
+2018-09-20 Maciej W. Rozycki <macro@linux-mips.org>
+
* config/tc-ppc.c (ppc_dwsect): Use `valueT' rather than
`offsetT' as the type of `flag'.
diff --git a/gas/config/tc-s12z.c b/gas/config/tc-s12z.c
index 736f062..d3b2ea4 100644
--- a/gas/config/tc-s12z.c
+++ b/gas/config/tc-s12z.c
@@ -614,31 +614,33 @@ lex_opr (uint8_t *buffer, int *n_bytes, expressionS *exp)
buffer[3] = 0;
if (exp->X_op == O_constant)
{
- if (exp->X_add_number < (0x1U << 14))
+ valueT value = exp->X_add_number;
+
+ if (value < (0x1U << 14))
{
*xb = 0x00;
*n_bytes = 2;
- *xb |= exp->X_add_number >> 8;
- buffer[1] = exp->X_add_number;
+ *xb |= value >> 8;
+ buffer[1] = value;
}
- else if (exp->X_add_number < (0x1U << 19))
+ else if (value < (0x1U << 19))
{
*xb = 0xf8;
- if (exp->X_add_number & (0x1U << 17))
+ if (value & (0x1U << 17))
*xb |= 0x04;
- if (exp->X_add_number & (0x1U << 16))
+ if (value & (0x1U << 16))
*xb |= 0x01;
*n_bytes = 3;
- buffer[1] = exp->X_add_number >> 8;
- buffer[2] = exp->X_add_number;
+ buffer[1] = value >> 8;
+ buffer[2] = value;
}
else
{
*xb = 0xfa;
*n_bytes = 4;
- buffer[1] = exp->X_add_number >> 16;
- buffer[2] = exp->X_add_number >> 8;
- buffer[3] = exp->X_add_number;
+ buffer[1] = value >> 16;
+ buffer[2] = value >> 8;
+ buffer[3] = value;
}
}
return 1;