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

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

> From: Mark Zhuang <[email protected]>
>
> 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
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.