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
>
next prev parent 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