From: Alan Modra Date: Fri, 31 Mar 2023 04:49:10 +0000 (+1030) Subject: ubsan: aarch64 parse_vector_reg_list X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f679aaa4c8fd6f72a8e2d60aba2c88127133101a;p=binutils-gdb.git ubsan: aarch64 parse_vector_reg_list tc-aarch64.c:1473:27: runtime error: left shift of 7 by 30 places cannot be represented in type 'int'. * config/tc-aarch64.c (parse_vector_reg_list): Avoid UB left shift. --- diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index 747cf37d4b8..99fb5de2679 100644 --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -1393,7 +1393,7 @@ parse_vector_reg_list (char **ccp, aarch64_reg_type type, char *str = *ccp; int nb_regs; struct vector_type_el typeinfo, typeinfo_first; - int val, val_range, mask; + uint32_t val, val_range, mask; int in_range; int ret_val; bool error = false; @@ -1414,8 +1414,8 @@ parse_vector_reg_list (char **ccp, aarch64_reg_type type, typeinfo_first.element_size = 0; typeinfo_first.index = 0; ret_val = 0; - val = -1; - val_range = -1; + val = -1u; + val_range = -1u; in_range = 0; mask = reg_type_mask (type); do @@ -1470,7 +1470,7 @@ parse_vector_reg_list (char **ccp, aarch64_reg_type type, if (! error) for (;;) { - ret_val |= val_range << (5 * nb_regs); + ret_val |= val_range << ((5 * nb_regs) & 31); nb_regs++; if (val_range == val) break;