[PATCH] RISC-V: Fix build with GCC-8
Mark Zhuang
zhuangqiubin@linux.spacemit.com
Tue Jun 23 09:52:21 GMT 2026
From: Mark Zhuang <mark.zhuang@spacemit.com>
GCC 8.5.0 rejects a declaration right after a case label.
Add braces to fix it.
---
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