S12Z/GAS: Correct a signed vs unsigned comparison error with GCC 4.1
authorMaciej W. Rozycki <macro@linux-mips.org>
Thu, 20 Sep 2018 14:49:01 +0000 (15:49 +0100)
committerMaciej W. Rozycki <macro@linux-mips.org>
Thu, 20 Sep 2018 14:49:01 +0000 (15:49 +0100)
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.

gas/ChangeLog
gas/config/tc-s12z.c

index 91af84b826dec0f90c1c9d2f796c7b8584dde055..637fc65648dc3c2b62b7a7cba458ffcd5400b49c 100644 (file)
@@ -1,3 +1,8 @@
+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
index 736f062b80e74abed6589caf86a09313561c3366..d3b2ea4c4af07f4eab44dfbbf6e4819d378bfc58 100644 (file)
@@ -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;