mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-21 02:24:17 +08:00
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.
This commit is contained in:
@ -1,3 +1,9 @@
|
|||||||
|
2019-12-16 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
* opcode/nds32.h (N32_BIT): Define using 1u.
|
||||||
|
(__SEXT): Use __MASK and N32_BIT.
|
||||||
|
(N32_IMMS): Remove duplicate mask.
|
||||||
|
|
||||||
2019-12-12 Luis Machado <luis.machado@linaro.org>
|
2019-12-12 Luis Machado <luis.machado@linaro.org>
|
||||||
|
|
||||||
* diagnostics.h (DIAGNOSTIC_IGNORE_UNUSED_FUNCTION). Remove
|
* diagnostics.h (DIAGNOSTIC_IGNORE_UNUSED_FUNCTION). Remove
|
||||||
|
@ -51,11 +51,12 @@ static const int nds32_r54map[] ATTRIBUTE_UNUSED =
|
|||||||
-1, -1, -1, -1, -1, -1, -1, -1
|
-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 __MASK(n) (N32_BIT (n) - 1)
|
||||||
#define __MF(v, off, bs) (((v) & __MASK (bs)) << (off))
|
#define __MF(v, off, bs) (((v) & __MASK (bs)) << (off))
|
||||||
#define __GF(v, off, bs) (((v) >> off) & __MASK (bs))
|
#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. */
|
/* Make nds32 instructions. */
|
||||||
|
|
||||||
@ -150,7 +151,7 @@ static const int nds32_r54map[] ATTRIBUTE_UNUSED =
|
|||||||
#define N32_SUB6(insn) (((insn) >> 0) & 0x3f)
|
#define N32_SUB6(insn) (((insn) >> 0) & 0x3f)
|
||||||
#define N32_SWID(insn) (((insn) >> 5) & 0x3ff)
|
#define N32_SWID(insn) (((insn) >> 5) & 0x3ff)
|
||||||
#define N32_IMMU(insn, bs) ((insn) & __MASK (bs))
|
#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_IMM5U(insn) N32_IMMU (insn, 5)
|
||||||
#define N32_IMM12S(insn) N32_IMMS (insn, 12)
|
#define N32_IMM12S(insn) N32_IMMS (insn, 12)
|
||||||
#define N32_IMM14S(insn) N32_IMMS (insn, 14)
|
#define N32_IMM14S(insn) N32_IMMS (insn, 14)
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
2019-12-16 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
* 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 <amodra@gmail.com>
|
2019-12-16 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* moxie-dis.c (INST2OFFSET): Don't left shift a signed value.
|
* moxie-dis.c (INST2OFFSET): Don't left shift a signed value.
|
||||||
|
@ -72,10 +72,7 @@ extern struct nds32_opcode nds32_opcodes[];
|
|||||||
extern const field_t operand_fields[];
|
extern const field_t operand_fields[];
|
||||||
extern keyword_t *keywords[];
|
extern keyword_t *keywords[];
|
||||||
extern const keyword_t keyword_gpr[];
|
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 uint32_t nds32_mask_opcode (uint32_t);
|
||||||
static void nds32_special_opcode (uint32_t, struct nds32_opcode **);
|
static void nds32_special_opcode (uint32_t, struct nds32_opcode **);
|
||||||
static int get_mapping_symbol_type (struct disassemble_info *, int,
|
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,
|
static int is_mapping_symbol (struct disassemble_info *, int,
|
||||||
enum map_type *);
|
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. */
|
/* Hash function for disassemble. */
|
||||||
|
|
||||||
static htab_t opcode_htab;
|
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 || pfd->hw_res == HW_UINT)
|
||||||
{
|
{
|
||||||
if (pfd->hw_res == HW_INT)
|
if (pfd->hw_res == HW_INT)
|
||||||
int_value =
|
int_value = (unsigned) N32_IMMS (insn >> pfd->bitpos,
|
||||||
N32_IMMS ((insn >> pfd->bitpos), pfd->bitsize) << pfd->shift;
|
pfd->bitsize) << pfd->shift;
|
||||||
else
|
else
|
||||||
int_value = __GF (insn, pfd->bitpos, pfd->bitsize) << pfd->shift;
|
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))
|
else if ((pfd->hw_res == HW_INT) || (pfd->hw_res == HW_UINT))
|
||||||
{
|
{
|
||||||
if (pfd->hw_res == HW_INT)
|
if (pfd->hw_res == HW_INT)
|
||||||
int_value =
|
int_value
|
||||||
N32_IMMS ((insn >> pfd->bitpos),
|
= (unsigned) N32_IMMS (insn >> pfd->bitpos,
|
||||||
pfd->bitsize) << pfd->shift;
|
pfd->bitsize) << pfd->shift;
|
||||||
else
|
else
|
||||||
int_value =
|
int_value =
|
||||||
__GF (insn, pfd->bitpos, pfd->bitsize) << pfd->shift;
|
__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))
|
else if ((pfd->hw_res == HW_INT) || (pfd->hw_res == HW_UINT))
|
||||||
{
|
{
|
||||||
if (pfd->hw_res == HW_INT)
|
if (pfd->hw_res == HW_INT)
|
||||||
int_value =
|
int_value = (unsigned) N32_IMMS (insn >> pfd->bitpos,
|
||||||
N32_IMMS ((insn >> pfd->bitpos), pfd->bitsize) << pfd->shift;
|
pfd->bitsize) << pfd->shift;
|
||||||
else
|
else
|
||||||
int_value =
|
int_value =
|
||||||
__GF (insn, pfd->bitpos, pfd->bitsize) << pfd->shift;
|
__GF (insn, pfd->bitpos, pfd->bitsize) << pfd->shift;
|
||||||
|
Reference in New Issue
Block a user