[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, &regno))
-			    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, &regno))
+				  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, &regno))
+				  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, &regno))
+				  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, &regno))
+			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, &regno))
-			    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