[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, &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