Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Andrew Burgess <andrew.burgess@embecosm.com>
To: gdb-patches@sourceware.org
Subject: Re: [PATCHv2 05/10] gdb/fortran: Clean up array/string expression evaluation
Date: Sat, 19 Sep 2020 09:53:37 +0100	[thread overview]
Message-ID: <20200919085337.GD1540618@embecosm.com> (raw)
In-Reply-To: <21becb1edce3be52c86d7b522a504ace8b1b8913.1598452395.git.andrew.burgess@embecosm.com>

* Andrew Burgess <andrew.burgess@embecosm.com> [2020-08-26 15:49:12 +0100]:

> In preparation for adding Fortan array stride expression support, this
> is the first phase of some clean up to the expression evaluation for
> Fortran arrays and strings.
> 
> The current code is split into two blocks, linked, weirdly, with a
> goto.  After this commit all the code is moved to its own function,
> and arrays and strings are now handled using the same code; this will
> be useful later when I want to add array stride support where strings
> will want to be treated just like arrays.
> 
> For now the new function is added as a static within eval.c, even
> though the function is Fortran only.  A following commit will remove
> some of the Fortran specific code from eval.c into one of the Fortran
> specific files, including this new function.
> 
> There should be no user visible changes after this commit.
> 
> gdb/ChangeLog:
> 
> 	* eval.c (fortran_value_subarray): New function, content is taken
> 	from...
> 	(evaluate_subexp_standard): ...here, in two places.  Now arrays
> 	and strings both call the new function.
> 	(calc_f77_array_dims): Add header comment, handle strings.

I went ahead and pushed this patch with a slightly modified commit
message.

Thanks,
Andrew

> ---
>  gdb/ChangeLog |   8 +++
>  gdb/eval.c    | 136 +++++++++++++++++++++++++-------------------------
>  2 files changed, 75 insertions(+), 69 deletions(-)
> 
> diff --git a/gdb/eval.c b/gdb/eval.c
> index cd300ddfef6..660edbe34af 100644
> --- a/gdb/eval.c
> +++ b/gdb/eval.c
> @@ -1260,6 +1260,67 @@ is_integral_or_integral_reference (struct type *type)
>  	  && is_integral_type (TYPE_TARGET_TYPE (type)));
>  }
>  
> +/* Called from evaluate_subexp_standard to perform array indexing, and
> +   sub-range extraction, for Fortran.  As well as arrays this function
> +   also handles strings as they can be treated like arrays of characters.
> +   ARRAY is the array or string being accessed.  EXP, POS, and NOSIDE are
> +   as for evaluate_subexp_standard, and NARGS is the number of arguments
> +   in this access (e.g. 'array (1,2,3)' would be NARGS 3).  */
> +
> +static struct value *
> +fortran_value_subarray (struct value *array, struct expression *exp,
> +			int *pos, int nargs, enum noside noside)
> +{
> +  if (exp->elts[*pos].opcode == OP_RANGE)
> +    return value_f90_subarray (array, exp, pos, noside);
> +
> +  if (noside == EVAL_SKIP)
> +    {
> +      skip_undetermined_arglist (nargs, exp, pos, noside);
> +      /* Return the dummy value with the correct type.  */
> +      return array;
> +    }
> +
> +  LONGEST subscript_array[MAX_FORTRAN_DIMS];
> +  int ndimensions = 1;
> +  struct type *type = check_typedef (value_type (array));
> +
> +  if (nargs > MAX_FORTRAN_DIMS)
> +    error (_("Too many subscripts for F77 (%d Max)"), MAX_FORTRAN_DIMS);
> +
> +  ndimensions = calc_f77_array_dims (type);
> +
> +  if (nargs != ndimensions)
> +    error (_("Wrong number of subscripts"));
> +
> +  gdb_assert (nargs > 0);
> +
> +  /* Now that we know we have a legal array subscript expression let us
> +     actually find out where this element exists in the array.  */
> +
> +  /* Take array indices left to right.  */
> +  for (int i = 0; i < nargs; i++)
> +    {
> +      /* Evaluate each subscript; it must be a legal integer in F77.  */
> +      value *arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
> +
> +      /* Fill in the subscript array.  */
> +      subscript_array[i] = value_as_long (arg2);
> +    }
> +
> +  /* Internal type of array is arranged right to left.  */
> +  for (int i = nargs; i > 0; i--)
> +    {
> +      struct type *array_type = check_typedef (value_type (array));
> +      LONGEST index = subscript_array[i - 1];
> +
> +      array = value_subscripted_rvalue (array, index,
> +					f77_get_lowerbound (array_type));
> +    }
> +
> +  return array;
> +}
> +
>  struct value *
>  evaluate_subexp_standard (struct type *expect_type,
>  			  struct expression *exp, int *pos,
> @@ -1954,33 +2015,8 @@ evaluate_subexp_standard (struct type *expect_type,
>        switch (code)
>  	{
>  	case TYPE_CODE_ARRAY:
> -	  if (exp->elts[*pos].opcode == OP_RANGE)
> -	    return value_f90_subarray (arg1, exp, pos, noside);
> -	  else
> -	    {
> -	      if (noside == EVAL_SKIP)
> -		{
> -		  skip_undetermined_arglist (nargs, exp, pos, noside);
> -		  /* Return the dummy value with the correct type.  */
> -		  return arg1;
> -		}
> -	      goto multi_f77_subscript;
> -	    }
> -
>  	case TYPE_CODE_STRING:
> -	  if (exp->elts[*pos].opcode == OP_RANGE)
> -	    return value_f90_subarray (arg1, exp, pos, noside);
> -	  else
> -	    {
> -	      if (noside == EVAL_SKIP)
> -		{
> -		  skip_undetermined_arglist (nargs, exp, pos, noside);
> -		  /* Return the dummy value with the correct type.  */
> -		  return arg1;
> -		}
> -	      arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
> -	      return value_subscript (arg1, value_as_long (arg2));
> -	    }
> +	  return fortran_value_subarray (arg1, exp, pos, nargs, noside);
>  
>  	case TYPE_CODE_PTR:
>  	case TYPE_CODE_FUNC:
> @@ -2400,49 +2436,6 @@ evaluate_subexp_standard (struct type *expect_type,
>  	}
>        return (arg1);
>  
> -    multi_f77_subscript:
> -      {
> -	LONGEST subscript_array[MAX_FORTRAN_DIMS];
> -	int ndimensions = 1, i;
> -	struct value *array = arg1;
> -
> -	if (nargs > MAX_FORTRAN_DIMS)
> -	  error (_("Too many subscripts for F77 (%d Max)"), MAX_FORTRAN_DIMS);
> -
> -	ndimensions = calc_f77_array_dims (type);
> -
> -	if (nargs != ndimensions)
> -	  error (_("Wrong number of subscripts"));
> -
> -	gdb_assert (nargs > 0);
> -
> -	/* Now that we know we have a legal array subscript expression 
> -	   let us actually find out where this element exists in the array.  */
> -
> -	/* Take array indices left to right.  */
> -	for (i = 0; i < nargs; i++)
> -	  {
> -	    /* Evaluate each subscript; it must be a legal integer in F77.  */
> -	    arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
> -
> -	    /* Fill in the subscript array.  */
> -
> -	    subscript_array[i] = value_as_long (arg2);
> -	  }
> -
> -	/* Internal type of array is arranged right to left.  */
> -	for (i = nargs; i > 0; i--)
> -	  {
> -	    struct type *array_type = check_typedef (value_type (array));
> -	    LONGEST index = subscript_array[i - 1];
> -
> -	    array = value_subscripted_rvalue (array, index,
> -					      f77_get_lowerbound (array_type));
> -	  }
> -
> -	return array;
> -      }
> -
>      case BINOP_LOGICAL_AND:
>        arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
>        if (noside == EVAL_SKIP)
> @@ -3356,12 +3349,17 @@ parse_and_eval_type (char *p, int length)
>    return expr->elts[1].type;
>  }
>  
> +/* Return the number of dimensions for a Fortran array or string.  */
> +
>  int
>  calc_f77_array_dims (struct type *array_type)
>  {
>    int ndimen = 1;
>    struct type *tmp_type;
>  
> +  if ((array_type->code () == TYPE_CODE_STRING))
> +    return 1;
> +
>    if ((array_type->code () != TYPE_CODE_ARRAY))
>      error (_("Can't get dimensions for a non-array type"));
>  
> -- 
> 2.25.4
> 


  reply	other threads:[~2020-09-19  8:53 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-13 12:58 [PATCH 0/8] Fortran Array Slicing and Striding Support Andrew Burgess
2020-08-13 12:58 ` [PATCH 1/8] gdbsupport: Provide global operators |=, &=, and ^= for enum bit flags Andrew Burgess
2020-08-15 17:16   ` Tom Tromey
2020-08-16  9:13     ` Andrew Burgess
2020-08-17 10:40     ` Andrew Burgess
2020-08-20 16:00       ` Pedro Alves
2020-08-21 14:49       ` Pedro Alves
2020-08-21 15:57         ` Andrew Burgess
2020-08-21 18:10           ` Pedro Alves
2020-08-13 12:58 ` [PATCH 2/8] gdbsupport: Make function arguments constant in enum-flags.h Andrew Burgess
2020-08-15 19:45   ` Tom Tromey
2020-08-16  9:08     ` Andrew Burgess
2020-08-13 12:58 ` [PATCH 3/8] gdb/fortran: Clean up array/string expression evaluation Andrew Burgess
2020-08-13 12:58 ` [PATCH 4/8] gdb/fortran: Move Fortran expression handling into f-lang.c Andrew Burgess
2020-08-13 12:58 ` [PATCH 5/8] gdb/fortran: Change whitespace when printing arrays Andrew Burgess
2020-08-13 12:58 ` [PATCH 6/8] gdb: Convert enum range_type to a bit field enum Andrew Burgess
2020-08-13 12:58 ` [PATCH 7/8] gdb/testsuite: Add missing expected results Andrew Burgess
2020-08-13 12:58 ` [PATCH 8/8] gdb/fortran: Add support for Fortran array slices at the GDB prompt Andrew Burgess
2020-08-13 13:31   ` Eli Zaretskii
2020-08-26 14:49 ` [PATCHv2 00/10] Fortran Array Slicing and Striding Support Andrew Burgess
2020-08-26 14:49   ` [PATCHv2 01/10] Rewrite valid-expr.h's internals in terms of the detection idiom (C++17/N4502) Andrew Burgess
2020-08-26 14:49   ` [PATCHv2 02/10] Use type_instance_flags more throughout Andrew Burgess
2020-08-26 14:49   ` [PATCHv2 03/10] Rewrite enum_flags, add unit tests, fix problems Andrew Burgess
2020-08-26 14:49   ` [PATCHv2 04/10] gdb: additional changes to make use of type_instance_flags more Andrew Burgess
2020-08-26 14:49   ` [PATCHv2 05/10] gdb/fortran: Clean up array/string expression evaluation Andrew Burgess
2020-09-19  8:53     ` Andrew Burgess [this message]
2020-08-26 14:49   ` [PATCHv2 06/10] gdb/fortran: Move Fortran expression handling into f-lang.c Andrew Burgess
2020-09-19  8:53     ` Andrew Burgess
2020-08-26 14:49   ` [PATCHv2 07/10] gdb/fortran: Change whitespace when printing arrays Andrew Burgess
2020-09-19  8:54     ` Andrew Burgess
2020-08-26 14:49   ` [PATCHv2 08/10] gdb: Convert enum range_type to a bit field enum Andrew Burgess
2020-08-26 14:49   ` [PATCHv2 09/10] gdb/testsuite: Add missing expected results Andrew Burgess
2020-09-18  9:53     ` Andrew Burgess
2020-08-26 14:49   ` [PATCHv2 10/10] gdb/fortran: Add support for Fortran array slices at the GDB prompt Andrew Burgess
2020-08-26 17:02     ` Eli Zaretskii
2020-09-19  9:47   ` [PATCHv3 0/2] Fortran Array Slicing and Striding Support Andrew Burgess
2020-09-19  9:48     ` [PATCHv3 1/2] gdb: Convert enum range_type to a bit field enum Andrew Burgess
2020-09-19 13:50       ` Simon Marchi
2020-09-19  9:48     ` [PATCHv3 2/2] gdb/fortran: Add support for Fortran array slices at the GDB prompt Andrew Burgess
2020-09-19 10:03       ` Eli Zaretskii
2020-09-28  9:40     ` [PATCHv4 0/3] Fortran Array Slicing and Striding Support Andrew Burgess
2020-09-28  9:40       ` [PATCHv4 1/3] gdb: Convert enum range_type to a bit field enum Andrew Burgess
2020-09-28  9:40       ` [PATCHv4 2/3] gdb: rename 'enum range_type' to 'enum range_flag' Andrew Burgess
2020-09-28  9:40       ` [PATCHv4 3/3] gdb/fortran: Add support for Fortran array slices at the GDB prompt Andrew Burgess
2020-09-28  9:52         ` Eli Zaretskii via Gdb-patches
2020-10-11 18:12       ` [PATCHv5 0/4] Fortran Array Slicing and Striding Support Andrew Burgess
2020-10-11 18:12         ` [PATCHv5 1/4] gdb: Convert enum range_type to a bit field enum Andrew Burgess
2020-10-20 20:16           ` Tom Tromey
2020-10-11 18:12         ` [PATCHv5 2/4] gdb: rename 'enum range_type' to 'enum range_flag' Andrew Burgess
2020-10-20 20:16           ` Tom Tromey
2020-10-11 18:12         ` [PATCHv5 3/4] gdb/fortran: add support for parsing array strides in expressions Andrew Burgess
2020-10-12 13:21           ` Simon Marchi
2020-10-20 20:17           ` Tom Tromey
2020-10-22 10:42           ` Andrew Burgess
2020-10-11 18:12         ` [PATCHv5 4/4] gdb/fortran: Add support for Fortran array slices at the GDB prompt Andrew Burgess
2020-10-12 14:10           ` Simon Marchi
2020-10-20 20:45           ` Tom Tromey
2020-10-29 11:08             ` Andrew Burgess
2020-10-31 22:16           ` [PATCHv6] " Andrew Burgess
2020-11-12 12:09             ` Andrew Burgess
2020-11-12 18:58             ` Tom Tromey
2020-11-19 11:56             ` Andrew Burgess

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200919085337.GD1540618@embecosm.com \
    --to=andrew.burgess@embecosm.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox