From: Alan Modra Date: Mon, 16 Dec 2019 06:28:30 +0000 (+1030) Subject: ubsan: aarch64: left shift of negative value X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f81e7e2db6d1aaf47561e54356aee12b585533c2;p=binutils-gdb.git ubsan: aarch64: left shift of negative value * aarch64-dis.c (sign_extend): Return uint64_t. Rewrite without conditional. (aarch64_ext_imm): Avoid signed overflow. --- diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index d33c7a17d00..898a916bbb4 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,9 @@ +2019-12-16 Alan Modra + + * aarch64-dis.c (sign_extend): Return uint64_t. Rewrite without + conditional. + (aarch64_ext_imm): Avoid signed overflow. + 2019-12-16 Alan Modra * microblaze-dis.c (read_insn_microblaze): Avoid signed overflow. diff --git a/opcodes/aarch64-dis.c b/opcodes/aarch64-dis.c index 8b32097a5fa..abed2d824c5 100644 --- a/opcodes/aarch64-dis.c +++ b/opcodes/aarch64-dis.c @@ -178,18 +178,15 @@ extract_all_fields (const aarch64_operand *self, aarch64_insn code) } /* Sign-extend bit I of VALUE. */ -static inline int32_t +static inline uint64_t sign_extend (aarch64_insn value, unsigned i) { - uint32_t ret = value; + uint64_t ret, sign; assert (i < 32); - if ((value >> i) & 0x1) - { - uint32_t val = (uint32_t)(-1) << i; - ret = ret | val; - } - return (int32_t) ret; + ret = value; + sign = (uint64_t) 1 << i; + return ((ret & (sign + sign - 1)) ^ sign) - sign; } /* N.B. the following inline helpfer functions create a dependency on the @@ -658,7 +655,7 @@ aarch64_ext_imm (const aarch64_operand *self, aarch64_opnd_info *info, const aarch64_inst *inst ATTRIBUTE_UNUSED, aarch64_operand_error *errors ATTRIBUTE_UNUSED) { - int64_t imm; + uint64_t imm; imm = extract_all_fields (self, code);