This is the mail archive of the binutils@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]

ubsan: nds32: left shift cannot be represented in type 'int'


Note that using 1u in N32_BIT makes all of N32_BIT, __MASK, __MF, __GF
and __SEXT evaluate as unsigned int (the latter three when when their
v arg is int or smaller).  This would be a problem if assigning the
result to a bfd_vma, long, or other type wider than an int since the
__SEXT result would be zero extended to the wider type.  Fortunately
nds32 target code doesn't use wider types unnecessarily.

include/
	* opcode/nds32.h (N32_BIT): Define using 1u.
	(__SEXT): Use __MASK and N32_BIT.
	(N32_IMMS): Remove duplicate mask.
opcodes/
	* nds32-dis.c (print_insn16, print_insn32): Remove forward decls.
	(struct objdump_disasm_info): Delete.
	(nds32_parse_audio_ext, nds32_parse_opcode): Cast result of
	N32_IMMS to unsigned before shifting left.

diff --git a/include/opcode/nds32.h b/include/opcode/nds32.h
index 7791864dd0..0e60840f78 100644
--- a/include/opcode/nds32.h
+++ b/include/opcode/nds32.h
@@ -51,11 +51,12 @@ static const int nds32_r54map[] ATTRIBUTE_UNUSED =
   -1, -1, -1, -1, -1, -1, -1, -1
 };
 
-#define N32_BIT(n)		(1 << (n))
+#define N32_BIT(n)		(1u << (n))
 #define __MASK(n)		(N32_BIT (n) - 1)
 #define __MF(v, off, bs)	(((v) & __MASK (bs)) << (off))
 #define __GF(v, off, bs)	(((v) >> off) & __MASK (bs))
-#define __SEXT(v, bs)		((((v) & ((1 << (bs)) - 1)) ^ (1 << ((bs) - 1))) - (1 << ((bs) - 1)))
+#define __SEXT(v, bs)		\
+  ((((v) & __MASK ((bs))) ^ N32_BIT ((bs) - 1)) - N32_BIT ((bs) - 1))
 
 /* Make nds32 instructions.  */
 
@@ -150,7 +151,7 @@ static const int nds32_r54map[] ATTRIBUTE_UNUSED =
 #define N32_SUB6(insn)		(((insn) >> 0) & 0x3f)
 #define N32_SWID(insn)		(((insn) >> 5) & 0x3ff)
 #define N32_IMMU(insn, bs)	((insn) & __MASK (bs))
-#define N32_IMMS(insn, bs)	((signed) __SEXT (((insn) & __MASK (bs)), bs))
+#define N32_IMMS(insn, bs)	((signed) __SEXT ((insn), (bs)))
 #define N32_IMM5U(insn)		N32_IMMU (insn, 5)
 #define N32_IMM12S(insn)	N32_IMMS (insn, 12)
 #define N32_IMM14S(insn)	N32_IMMS (insn, 14)
diff --git a/opcodes/nds32-dis.c b/opcodes/nds32-dis.c
index dfd05cbe45..0e41399ef0 100644
--- a/opcodes/nds32-dis.c
+++ b/opcodes/nds32-dis.c
@@ -72,10 +72,7 @@ extern struct nds32_opcode nds32_opcodes[];
 extern const field_t operand_fields[];
 extern keyword_t *keywords[];
 extern const keyword_t keyword_gpr[];
-static void print_insn16 (bfd_vma pc, disassemble_info *info,
-			  uint32_t insn, uint32_t parse_mode);
-static void print_insn32 (bfd_vma pc, disassemble_info *info, uint32_t insn,
-			  uint32_t parse_mode);
+
 static uint32_t nds32_mask_opcode (uint32_t);
 static void nds32_special_opcode (uint32_t, struct nds32_opcode **);
 static int get_mapping_symbol_type (struct disassemble_info *, int,
@@ -83,18 +80,6 @@ static int get_mapping_symbol_type (struct disassemble_info *, int,
 static int is_mapping_symbol (struct disassemble_info *, int,
 			      enum map_type *);
 
-/* define in objdump.c.  */
-struct objdump_disasm_info
-{
-  bfd *              abfd;
-  asection *         sec;
-  bfd_boolean        require_sec;
-  arelent **         dynrelbuf;
-  long               dynrelcount;
-  disassembler_ftype disassemble_fn;
-  arelent *          reloc;
-};
-
 /* Hash function for disassemble.  */
 
 static htab_t opcode_htab;
@@ -128,8 +113,8 @@ nds32_parse_audio_ext (const field_t *pfd,
   if (pfd->hw_res == HW_INT || pfd->hw_res == HW_UINT)
     {
       if (pfd->hw_res == HW_INT)
-	int_value =
-	  N32_IMMS ((insn >> pfd->bitpos), pfd->bitsize) << pfd->shift;
+	int_value = (unsigned) N32_IMMS (insn >> pfd->bitpos,
+					 pfd->bitsize) << pfd->shift;
       else
 	int_value = __GF (insn, pfd->bitpos, pfd->bitsize) << pfd->shift;
 
@@ -321,9 +306,9 @@ nds32_parse_opcode (struct nds32_opcode *opc, bfd_vma pc ATTRIBUTE_UNUSED,
 	      else if ((pfd->hw_res == HW_INT) || (pfd->hw_res == HW_UINT))
 		{
 		  if (pfd->hw_res == HW_INT)
-		    int_value =
-		      N32_IMMS ((insn >> pfd->bitpos),
-			    pfd->bitsize) << pfd->shift;
+		    int_value
+		      = (unsigned) N32_IMMS (insn >> pfd->bitpos,
+					     pfd->bitsize) << pfd->shift;
 		  else
 		    int_value =
 		      __GF (insn, pfd->bitpos, pfd->bitsize) << pfd->shift;
@@ -411,8 +396,8 @@ nds32_parse_opcode (struct nds32_opcode *opc, bfd_vma pc ATTRIBUTE_UNUSED,
 	  else if ((pfd->hw_res == HW_INT) || (pfd->hw_res == HW_UINT))
 	    {
 	      if (pfd->hw_res == HW_INT)
-		int_value =
-		  N32_IMMS ((insn >> pfd->bitpos), pfd->bitsize) << pfd->shift;
+		int_value = (unsigned) N32_IMMS (insn >> pfd->bitpos,
+						 pfd->bitsize) << pfd->shift;
 	      else
 		int_value =
 		  __GF (insn, pfd->bitpos, pfd->bitsize) << pfd->shift;

-- 
Alan Modra
Australia Development Lab, IBM


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