From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x32e.google.com (mail-wm1-x32e.google.com [IPv6:2a00:1450:4864:20::32e]) by sourceware.org (Postfix) with ESMTPS id 84117386F02C for ; Wed, 26 Aug 2020 14:49:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 84117386F02C Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=andrew.burgess@embecosm.com Received: by mail-wm1-x32e.google.com with SMTP id w2so1798078wmi.1 for ; Wed, 26 Aug 2020 07:49:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=7EtYfqUwX5VTl/vAmcBfJAeczr/Yi9iNrnqZ8GDNpZY=; b=Ppo8d/N3K1dpLLmGRmeVZWd1A1gENHT2ZO7C9ALD6kh8Pck8LojMKhPAFA1KKWkZc4 hhBcS2+lkJdpBcGNZvpNCfn9ph/8wUWJ9VbDMj9J0NOymz4TDHNaMd9lk5qBV33k/6as d123c9jp002ikxWVGrWTAYx6xmKmxRL/S/m0wK3+VQQMWe5/mRRMe8iI5NZCgjsb38DN esyjk+j8Qf26h2DuJxZ44VevO/NkVVeFyQaA/BZj2hnNPiIBuEUfwGxMKfHwpuqGITOu SQ+HUlsfs5uBlRWvYXjNLgKkHqcJhe/R6wPFO/N6+5iYK+ExrczXL3rc//st41Gv3n+1 Cobg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=7EtYfqUwX5VTl/vAmcBfJAeczr/Yi9iNrnqZ8GDNpZY=; b=T+I167o/r9kZjZRBy4tRF0KesHoJgh/7bnif2teUPvve3OzmkrjICddmWw1uLARODr JAEN8CCKkj9VEdhbQ4zDXRB5szMMhcno6DJ52Ut4z6EqaqGdKqt4hzAFz5k8Wis1owBJ 40hsvTfWRAKLDVvCxjpKogvVnj81NRYH54M6Dij5qfo7sIyvQN061XbvGnlZ3Ag2f+h2 oAUn+yHqiXaJ8BMBFc+1pDZKzSvamzT870K1DTVwgR4gdVXZiXb8uOn9JEE1dXtMk3ph /8uaF6Gy5intJIakjH1ezjjolhSudcCk1TXSoBKg6ZaPr7+zDmuOsjP3lzcbVvmU7rqx ewtg== X-Gm-Message-State: AOAM531PHrg22Njw5vd4Xb1DRJoxoIQXdhcI4Wymtw9LLs3g8NUoKRk3 Eagz49YPEymRrGEBy/dkWu/lVSU9G9vDdw== X-Google-Smtp-Source: ABdhPJwI+6CYyyLrpLa8rj7s8CSnM9KM/2tUeAun4he5sKLlT33vr7dGCiYzkb7EVt7SDZ5wsIEdRQ== X-Received: by 2002:a1c:63c4:: with SMTP id x187mr7165154wmb.62.1598453378134; Wed, 26 Aug 2020 07:49:38 -0700 (PDT) Received: from localhost (host109-148-134-218.range109-148.btcentralplus.com. [109.148.134.218]) by smtp.gmail.com with ESMTPSA id i6sm6448787wrp.92.2020.08.26.07.49.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Aug 2020 07:49:37 -0700 (PDT) From: Andrew Burgess To: gdb-patches@sourceware.org Subject: [PATCHv2 05/10] gdb/fortran: Clean up array/string expression evaluation Date: Wed, 26 Aug 2020 15:49:12 +0100 Message-Id: <21becb1edce3be52c86d7b522a504ace8b1b8913.1598452395.git.andrew.burgess@embecosm.com> X-Mailer: git-send-email 2.25.4 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-8.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_ABUSEAT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 26 Aug 2020 14:49:41 -0000 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. --- 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