From: Alan Modra Date: Sun, 15 Dec 2019 23:05:30 +0000 (+1030) Subject: ubsan: nds32: left shift cannot be represented in type 'int' X-Git-Url: http://git.efficios.com/?p=deliverable%2Fbinutils-gdb.git;a=commitdiff_plain;h=4bdb25fe6902963ca9cf91d6b2688cf888527bf8 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/ChangeLog b/include/ChangeLog index 1444cc9146..7f6cc9bf55 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,9 @@ +2019-12-16 Alan Modra + + * opcode/nds32.h (N32_BIT): Define using 1u. + (__SEXT): Use __MASK and N32_BIT. + (N32_IMMS): Remove duplicate mask. + 2019-12-12 Luis Machado * diagnostics.h (DIAGNOSTIC_IGNORE_UNUSED_FUNCTION). Remove 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/ChangeLog b/opcodes/ChangeLog index 2d1c9d3f7d..65ef685d07 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,10 @@ +2019-12-16 Alan Modra + + * 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. + 2019-12-16 Alan Modra * moxie-dis.c (INST2OFFSET): Don't left shift a signed value. 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;