[PATCH] RISC-V: Fix build with GCC-8

Mark Zhuang <[email protected]>
Newsgroups gmane.comp.gnu.binutils
Message-ID <[email protected]>
From: Mark Zhuang <[email protected]>

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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.