From fb4cb4e26d16f928f00973fcdc99934c9174c957 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 11 Dec 2019 08:34:57 +1030 Subject: [PATCH] ubsan: ns32k: left shift cannot be represented in type 'int' * ns32k-dis.c (bit_extract): Use unsigned arithmetic. (bit_extract_simple, sign_extend): Likewise. --- opcodes/ChangeLog | 5 +++++ opcodes/ns32k-dis.c | 16 +++++++--------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index b36a9e20361..ddf8cd00724 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,8 @@ +2019-12-11 Alan Modra + + * ns32k-dis.c (bit_extract): Use unsigned arithmetic. + (bit_extract_simple, sign_extend): Likewise. + 2019-12-11 Alan Modra * nios2-dis.c (nios2_print_insn_arg): Use 1u << 31. diff --git a/opcodes/ns32k-dis.c b/opcodes/ns32k-dis.c index 22a9389ecff..5e6f0964b7a 100644 --- a/opcodes/ns32k-dis.c +++ b/opcodes/ns32k-dis.c @@ -262,8 +262,8 @@ list_search (int reg_value, const struct ns32k_option *optionP, char *result) static int bit_extract (bfd_byte *buffer, int offset, int count) { - int result; - int bit; + unsigned int result; + unsigned int bit; if (offset < 0 || count < 0) return 0; @@ -291,8 +291,8 @@ bit_extract (bfd_byte *buffer, int offset, int count) static int bit_extract_simple (bfd_byte *buffer, int offset, int count) { - int result; - int bit; + unsigned int result; + unsigned int bit; if (offset < 0 || count < 0) return 0; @@ -325,12 +325,10 @@ bit_copy (bfd_byte *buffer, int offset, int count, char *to) } static int -sign_extend (int value, int bits) +sign_extend (unsigned int value, unsigned int bits) { - value = value & ((1 << bits) - 1); - return (value & (1 << (bits - 1)) - ? value | (~((1 << bits) - 1)) - : value); + unsigned int sign = 1u << bits; + return ((value & (sign - 1)) ^ sign) - sign; } static void -- 2.30.2