This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]