Re: [PATCH] RISC-V: Fix build with GCC-8
Andrew Burgess <[email protected]>
| Newsgroups | gmane.comp.gnu.binutils |
|---|---|
| Message-ID | <[email protected]> |
Mark Zhuang <[email protected]> writes: > From: Mark Zhuang <[email protected]> > > GCC 8.5.0 rejects a declaration right after a case label. > Add braces to fix it. I cannot approve this patch, but I also ran into this issue building GDB because of the opcodes/ part, and your fix looks good to me (and fixes my build), so +1 here. Thanks, Andrew > --- > gas/config/tc-riscv.c | 335 ++++++++++++++++++++++-------------------- > opcodes/riscv-dis.c | 16 +- > 2 files changed, 182 insertions(+), 169 deletions(-) > > diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c > index 5ffa2ef1f1d..cec3c1f65a2 100644 > --- a/gas/config/tc-riscv.c > +++ b/gas/config/tc-riscv.c > @@ -1791,49 +1791,53 @@ validate_riscv_insn (const struct riscv_opcode *opc, int length) > } > break; > case 'p': /* Vendor-specific (SpacemiT) operands. */ > - size_t n; > - size_t s; > - switch (*++oparg) > - { > - case 'V': > - switch (*++oparg) > - { > - case 'd': > - USE_BITS (OP_MASK_SPACEMIT_IME_VD, OP_SH_SPACEMIT_IME_VD); > + { > + size_t n; > + size_t s; > + switch (*++oparg) > + { > + case 'V': > + switch (*++oparg) > + { > + case 'd': > + USE_BITS (OP_MASK_SPACEMIT_IME_VD, > + OP_SH_SPACEMIT_IME_VD); > + break; > + case 's': > + USE_BITS (OP_MASK_SPACEMIT_IME_VS1, > + OP_SH_SPACEMIT_IME_VS1); > + break; > + case 'm': > + USE_BITS (OP_MASK_SPACEMIT_IME_VMASK, > + OP_SH_SPACEMIT_IME_VMASK); > + break; > + default: > + goto unknown_validate_operand; > + } > break; > - case 's': > - USE_BITS (OP_MASK_SPACEMIT_IME_VS1, > - OP_SH_SPACEMIT_IME_VS1); > + case 'u': /* Integer immediate, 'XpuN@S' ... > + N-bit unsigned immediate at bit S. */ > + n = strtol (oparg + 1, (char **)&oparg, 10); > + if (*oparg != '@') > + goto unknown_validate_operand; > + s = strtol (oparg + 1, (char **)&oparg, 10); > + oparg--; > + USE_IMM (n, s); > break; > - case 'm': > - USE_BITS (OP_MASK_SPACEMIT_IME_VMASK, > - OP_SH_SPACEMIT_IME_VMASK); > + case 'n': > + case 'b': > + used_bits |= ENCODE_SPACEMIT_IME_UIMM2_SP (-1U); > + break; > + case 'w': > + case 'x': > + USE_BITS (OP_MASK_SPACEMIT_IME_WI, > + OP_SH_SPACEMIT_IME_WI); > break; > default: > goto unknown_validate_operand; > - } > - break; > - case 'u': /* Integer immediate, 'XpuN@S' ... > - N-bit unsigned immediate at bit S. */ > - n = strtol (oparg + 1, (char **)&oparg, 10); > - if (*oparg != '@') > - goto unknown_validate_operand; > - s = strtol (oparg + 1, (char **)&oparg, 10); > - oparg--; > - USE_IMM (n, s); > - break; > - case 'n': > - case 'b': > - used_bits |= ENCODE_SPACEMIT_IME_UIMM2_SP (-1U); > - break; > - case 'w': > - case 'x': > - USE_BITS (OP_MASK_SPACEMIT_IME_WI, OP_SH_SPACEMIT_IME_WI); > - break; > - default: > - goto unknown_validate_operand; > - } > - break; > + } > + break; > + } > default: > goto unknown_validate_operand; > } > @@ -4309,144 +4313,149 @@ riscv_ip (char *str, struct riscv_cl_insn *ip, expressionS *imm_expr, > break; > > case 'p': /* Vendor-specific (SpacemiT) operands. */ > - size_t n; > - size_t s; > - switch (*++oparg) > - { > - case 'V': > - switch (*++oparg) > - { > - case 'd': > - if (!reg_lookup (&asarg, RCLASS_VECR, ®no)) > - break; > - if ((regno & 0x1) != 0) > + { > + size_t n; > + size_t s; > + switch (*++oparg) > + { > + case 'V': > + switch (*++oparg) > { > - error.msg > - = _("illegal operands (vd must be even)"); > - error.missing_ext = NULL; > - goto out; > + case 'd': > + if (!reg_lookup (&asarg, RCLASS_VECR, ®no)) > + break; > + if ((regno & 0x1) != 0) > + { > + error.msg > + = _("illegal operands (vd must be even)"); > + error.missing_ext = NULL; > + goto out; > + } > + INSERT_OPERAND (SPACEMIT_IME_VD, *ip, regno>>1); > + continue; > + case 's': > + if (!reg_lookup (&asarg, RCLASS_VECR, ®no)) > + break; > + if ((regno & 0x1) != 0) > + { > + error.msg > + = _("illegal operands " > + "(vs1 must be even)"); > + error.missing_ext = NULL; > + goto out; > + } > + INSERT_OPERAND (SPACEMIT_IME_VS1, > + *ip, regno>>1); > + continue; > + case 'm': > + if (!reg_lookup (&asarg, RCLASS_VECR, ®no)) > + break; > + if (regno >= 2) > + { > + error.msg > + = _("illegal operands " > + "(mask must be v0/v1)"); > + error.missing_ext = NULL; > + goto out; > + } > + INSERT_OPERAND (SPACEMIT_IME_VMASK, *ip, regno); > + continue; > + default: > + goto unknown_riscv_ip_operand; > } > - INSERT_OPERAND (SPACEMIT_IME_VD, *ip, regno>>1); > + break; > + case 'u': /* Integer immediate, 'XpuN@S' ... > + N-bit unsigned immediate at bit S. */ > + n = strtol (oparg + 1, (char **)&oparg, 10); > + if (*oparg != '@') > + goto unknown_riscv_ip_operand; > + s = strtol (oparg + 1, (char **)&oparg, 10); > + oparg--; > + my_getExpression (imm_expr, asarg, force_reloc); > + check_absolute_expr (ip, imm_expr, false); > + if (!VALIDATE_U_IMM (imm_expr->X_add_number, n)) > + as_bad (_("improper immediate value (%"PRIu64")"), > + imm_expr->X_add_number); > + INSERT_IMM (n, s, *ip, imm_expr->X_add_number); > + imm_expr->X_op = O_absent; > + asarg = expr_parse_end; > continue; > - case 's': > - if (!reg_lookup (&asarg, RCLASS_VECR, ®no)) > + case 'n': /* Xpn: stride (0-1), paired with Xpx. */ > + my_getExpression (imm_expr, asarg, force_reloc); > + check_absolute_expr (ip, imm_expr, false); > + if (imm_expr->X_add_number < 0 > + || imm_expr->X_add_number >= 2) > break; > - if ((regno & 0x1) != 0) > + ip->insn_opcode > + |= ENCODE_SPACEMIT_IME_UIMM2_SP > + (imm_expr->X_add_number); > + imm_expr->X_op = O_absent; > + asarg = expr_parse_end; > + continue; > + case 'b': /* Xpb: stride (0-3), paired with Xpw. */ > + my_getExpression (imm_expr, asarg, force_reloc); > + check_absolute_expr (ip, imm_expr, false); > + if (imm_expr->X_add_number < 0 > + || imm_expr->X_add_number >= 4) > { > - error.msg > - = _("illegal operands (vs1 must be even)"); > - error.missing_ext = NULL; > - goto out; > + as_bad (_("bad value for stride field," > + " value must be 0..3")); > + break; > } > - INSERT_OPERAND (SPACEMIT_IME_VS1, *ip, regno>>1); > + ip->insn_opcode > + |= ENCODE_SPACEMIT_IME_UIMM2_SP > + (imm_expr->X_add_number); > + imm_expr->X_op = O_absent; > + asarg = expr_parse_end; > continue; > - case 'm': > - if (!reg_lookup (&asarg, RCLASS_VECR, ®no)) > - break; > - if (regno >= 2) > + case 'w': > + /* Xpw: optional data-width suffix, i8 only (WI=3). > + If omitted, defaults to i8. */ > + if (*asarg == ',') > { > - error.msg > - = _("illegal operands (mask must be v0/v1)"); > - error.missing_ext = NULL; > - goto out; > + if (strcmp (asarg + 1, "i8") != 0) > + { > + error.msg > + = _("illegal operands (invalid data type)"); > + error.missing_ext = NULL; > + goto out; > + } > + asarg += 3; > } > - INSERT_OPERAND (SPACEMIT_IME_VMASK, *ip, regno); > + else if (*asarg != '\0') > + goto unknown_riscv_ip_operand; > + regno = 3; > + INSERT_OPERAND (SPACEMIT_IME_WI, *ip, regno); > continue; > - default: > - goto unknown_riscv_ip_operand; > - } > - break; > - case 'u': /* Integer immediate, 'XpuN@S' ... > - N-bit unsigned immediate at bit S. */ > - n = strtol (oparg + 1, (char **)&oparg, 10); > - if (*oparg != '@') > - goto unknown_riscv_ip_operand; > - s = strtol (oparg + 1, (char **)&oparg, 10); > - oparg--; > - my_getExpression (imm_expr, asarg, force_reloc); > - check_absolute_expr (ip, imm_expr, false); > - if (!VALIDATE_U_IMM (imm_expr->X_add_number, n)) > - as_bad (_("improper immediate value (%"PRIu64")"), > - imm_expr->X_add_number); > - INSERT_IMM (n, s, *ip, imm_expr->X_add_number); > - imm_expr->X_op = O_absent; > - asarg = expr_parse_end; > - continue; > - case 'n': /* Xpn: stride (0-1), paired with Xpx. */ > - my_getExpression (imm_expr, asarg, force_reloc); > - check_absolute_expr (ip, imm_expr, false); > - if (imm_expr->X_add_number < 0 > - || imm_expr->X_add_number >= 2) > - break; > - ip->insn_opcode > - |= ENCODE_SPACEMIT_IME_UIMM2_SP > - (imm_expr->X_add_number); > - imm_expr->X_op = O_absent; > - asarg = expr_parse_end; > - continue; > - case 'b': /* Xpb: stride (0-3), paired with Xpw. */ > - my_getExpression (imm_expr, asarg, force_reloc); > - check_absolute_expr (ip, imm_expr, false); > - if (imm_expr->X_add_number < 0 > - || imm_expr->X_add_number >= 4) > - { > - as_bad (_("bad value for stride field," > - " value must be 0..3")); > - break; > - } > - ip->insn_opcode > - |= ENCODE_SPACEMIT_IME_UIMM2_SP > - (imm_expr->X_add_number); > - imm_expr->X_op = O_absent; > - asarg = expr_parse_end; > - continue; > - case 'w': > - /* Xpw: optional data-width suffix, i8 only (WI=3). > - If omitted, defaults to i8. */ > - if (*asarg == ',') > - { > - if (strcmp (asarg + 1, "i8") != 0) > + case 'x': > + /* Xpx: optional data-width suffix, i4 or i8 (WI=2/3). > + If omitted, defaults to i8. */ > + if (*asarg == ',') > { > - error.msg > - = _("illegal operands (invalid data type)"); > - error.missing_ext = NULL; > - goto out; > + if (strcmp (asarg + 1, "i4") == 0) > + regno = 2; > + else if (strcmp (asarg + 1, "i8") == 0) > + regno = 3; > + else > + { > + error.msg > + = _("illegal operands (invalid data type)"); > + error.missing_ext = NULL; > + goto out; > + } > + asarg += 3; > } > - asarg += 3; > - } > - else if (*asarg != '\0') > - goto unknown_riscv_ip_operand; > - regno = 3; > - INSERT_OPERAND (SPACEMIT_IME_WI, *ip, regno); > - continue; > - case 'x': > - /* Xpx: optional data-width suffix, i4 or i8 (WI=2/3). > - If omitted, defaults to i8. */ > - if (*asarg == ',') > - { > - if (strcmp (asarg + 1, "i4") == 0) > - regno = 2; > - else if (strcmp (asarg + 1, "i8") == 0) > - regno = 3; > + else if (*asarg != '\0') > + goto unknown_riscv_ip_operand; > else > - { > - error.msg > - = _("illegal operands (invalid data type)"); > - error.missing_ext = NULL; > - goto out; > - } > - asarg += 3; > - } > - else if (*asarg != '\0') > - goto unknown_riscv_ip_operand; > - else > - regno = 3; > - INSERT_OPERAND (SPACEMIT_IME_WI, *ip, regno); > - continue; > - default: > - goto unknown_riscv_ip_operand; > - } > - break; > + regno = 3; > + INSERT_OPERAND (SPACEMIT_IME_WI, *ip, regno); > + continue; > + default: > + goto unknown_riscv_ip_operand; > + } > + break; > + } > default: > goto unknown_riscv_ip_operand; > } > diff --git a/opcodes/riscv-dis.c b/opcodes/riscv-dis.c > index ca0d9bfd121..edb9ce04778 100644 > --- a/opcodes/riscv-dis.c > +++ b/opcodes/riscv-dis.c > @@ -924,14 +924,18 @@ print_insn_args (const char *oparg, insn_t l, bfd_vma pc, disassemble_info *info > switch (*++oparg) > { > case 'd': > - unsigned vd = EXTRACT_OPERAND (SPACEMIT_IME_VD, l) * 2; > - print (info->stream, dis_style_register, "%s", > - riscv_vecr_names_numeric[vd]); > + { > + unsigned vd = EXTRACT_OPERAND (SPACEMIT_IME_VD, l) * 2; > + print (info->stream, dis_style_register, "%s", > + riscv_vecr_names_numeric[vd]); > + } > break; > case 's': > - unsigned vs = EXTRACT_OPERAND (SPACEMIT_IME_VS1, l) * 2; > - print (info->stream, dis_style_register, "%s", > - riscv_vecr_names_numeric[vs]); > + { > + unsigned vs = EXTRACT_OPERAND (SPACEMIT_IME_VS1, l) * 2; > + print (info->stream, dis_style_register, "%s", > + riscv_vecr_names_numeric[vs]); > + } > break; > case 'm': > { > -- > 2.34.1