[PATCH] RISC-V: Fix build with GCC-8
Andrew Burgess
aburgess@redhat.com
Tue Jun 23 10:18:12 GMT 2026
Mark Zhuang <zhuangqiubin@linux.spacemit.com> writes:
> From: Mark Zhuang <mark.zhuang@spacemit.com>
>
> 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
More information about the Binutils
mailing list