From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-x444.google.com (mail-wr1-x444.google.com [IPv6:2a00:1450:4864:20::444]) by sourceware.org (Postfix) with ESMTPS id A95DF3857C4E for ; Sun, 11 Oct 2020 18:12:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org A95DF3857C4E 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-wr1-x444.google.com with SMTP id n6so16105949wrm.13 for ; Sun, 11 Oct 2020 11:12:20 -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=mce9XbmEy72sUkIbXddt8J2kiCYWUQgQHrxrA5JqQbE=; b=fFeHvm2N4WZ1vz2HHEjnPzNlIKGwycQgEK2Fay6tW7qau/oPAwy+RzEW2laioxpTUq PNfTlyxO5EBThxR+phj56ENIgim1MbG/Rrw1kSrYEmB3q/4+C8NkZeWYDLE29ergLLKx XJRMlLEg9o45UlaShk+izBZJ8V7Q5fhkDXkTN8SP3yUgWI9N0KRhH1rPWKw9n8W0zsxa KVQFPy3AqboDeuRL8E2FpmzhiKKKO3G9Ne8KXKK3ac22Kxcbd3ra6h68UOh3e4WPvQqx UAI1A/TzQw5vAAHcdLaJOFKSYvPpLHs6I0AIt5H5rsFqg4O4xz8pFIGWljBNKZReOd7A h39A== 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=mce9XbmEy72sUkIbXddt8J2kiCYWUQgQHrxrA5JqQbE=; b=VtiALY0tO7aVpiNagwCzNlXleRE2QrihXlkjqIx2wofJbx+RsWOYKi5s1U3kjKuoh2 Vg4sS0bU2smFVChvN1gBbQK6vHze3drV70M41S/gHTT4gwY83tTxLtDiIOznHIQZr4W0 QksMCC7Adl1gjQG6Y8uKEOYYSdP2lmS1gwjBp+7c2R+yrXyRi9OkzOMx+wD6LGzZ4IQu VzoYPSZQ8LgYnf0H4/XhrXVixc87kVK2UxrYtaXV/0e+RpSldIJ0RJyb9KNfFlxWvdOE IBn0etRHLLzY7tk3nQm5FvWeEp0kqUC3l5JMIWgOgVRksqWBFrIGcf9Ml4E4+eJFfDCx xmRw== X-Gm-Message-State: AOAM532ga4FnA2GUGthrF3wD4xWm5pXxLThGVmBjpiZc1l6/75NuYEqC 0N5qhehGQGxhf5sSIsfkttAOH0Puw52akA== X-Google-Smtp-Source: ABdhPJzN8kcCtwKuoMUfCjFrRwW8GBGjsnn60FUCWFot85zn8e5W4UowdiX0dZDM5lZGPzJRTiq/Iw== X-Received: by 2002:adf:cf0c:: with SMTP id o12mr25105747wrj.287.1602439939567; Sun, 11 Oct 2020 11:12:19 -0700 (PDT) Received: from localhost (host86-130-161-39.range86-130.btcentralplus.com. [86.130.161.39]) by smtp.gmail.com with ESMTPSA id h206sm21461270wmf.47.2020.10.11.11.12.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 11 Oct 2020 11:12:19 -0700 (PDT) From: Andrew Burgess To: gdb-patches@sourceware.org Subject: [PATCHv5 3/4] gdb/fortran: add support for parsing array strides in expressions Date: Sun, 11 Oct 2020 19:12:12 +0100 Message-Id: <02f3e9f571844809528e74c2a8621b4ec467e22f.1602439661.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=-10.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, 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: Sun, 11 Oct 2020 18:12:22 -0000 With this commit GDB now understands the syntax of Fortran array strides, a user can type an expression including an array stride, but they will only get an error informing them that array strides are not supported. This alone is an improvement on what we had before in GDB, better to give the user a helpful message that a particular feature is not supported than to just claim a syntax error. Before: (gdb) p array (1:10:2, 2:10:2) A syntax error in expression, near `:2, 2:10:2)'. Now: (gdb) p array (1:10:2, 2:10:2) Fortran array strides are not currently supported Later commits will allow GDB to handle array strides correctly. gdb/ChangeLog: * expprint.c (dump_subexp_body_standard): Print RANGE_HAS_STRIDE. * expression.h (enum range_type): Add RANGE_HAS_STRIDE. * f-exp.y (arglist): Allow for a series of subranges. (subrange): Add cases for subranges with strides. * f-lang.c (value_f90_subarray): Catch use of array strides and throw an error. * parse.c (operator_length_standard): Handle RANGE_HAS_STRIDE. gdb/testsuite/ChangeLog: * gdb.fortran/array-slices.exp: Add a new test. --- gdb/ChangeLog | 10 ++++++ gdb/expprint.c | 4 +++ gdb/expression.h | 3 ++ gdb/f-exp.y | 38 ++++++++++++++++++++++ gdb/f-lang.c | 10 +++++- gdb/parse.c | 2 ++ gdb/testsuite/ChangeLog | 4 +++ gdb/testsuite/gdb.fortran/array-slices.exp | 15 +++++++++ 8 files changed, 85 insertions(+), 1 deletion(-) diff --git a/gdb/expprint.c b/gdb/expprint.c index 2dee2bb1932..a14eeb00f19 100644 --- a/gdb/expprint.c +++ b/gdb/expprint.c @@ -1120,12 +1120,16 @@ dump_subexp_body_standard (struct expression *exp, fputs_filtered ("..", stream); if (!(range_flag & RANGE_HIGH_BOUND_DEFAULT)) fputs_filtered ("EXP", stream); + if (range_flag & RANGE_HAS_STRIDE) + fputs_filtered (":EXP", stream); fputs_filtered ("'", stream); if (!(range_flag & RANGE_LOW_BOUND_DEFAULT)) elt = dump_subexp (exp, stream, elt); if (!(range_flag & RANGE_HIGH_BOUND_DEFAULT)) elt = dump_subexp (exp, stream, elt); + if (range_flag & RANGE_HAS_STRIDE) + elt = dump_subexp (exp, stream, elt); } break; diff --git a/gdb/expression.h b/gdb/expression.h index fd483e5f277..8de712310ec 100644 --- a/gdb/expression.h +++ b/gdb/expression.h @@ -199,6 +199,9 @@ enum range_flag : unsigned /* The high bound of this range is exclusive. */ RANGE_HIGH_BOUND_EXCLUSIVE = 1 << 2, + + /* The range has a stride. */ + RANGE_HAS_STRIDE = 1 << 3, }; DEF_ENUM_FLAGS_TYPE (enum range_flag, range_flags); diff --git a/gdb/f-exp.y b/gdb/f-exp.y index a3314082d90..f227690cea6 100644 --- a/gdb/f-exp.y +++ b/gdb/f-exp.y @@ -284,6 +284,10 @@ arglist : arglist ',' exp %prec ABOVE_COMMA { pstate->arglist_len++; } ; +arglist : arglist ',' subrange %prec ABOVE_COMMA + { pstate->arglist_len++; } + ; + /* There are four sorts of subrange types in F90. */ subrange: exp ':' exp %prec ABOVE_COMMA @@ -314,6 +318,40 @@ subrange: ':' %prec ABOVE_COMMA write_exp_elt_opcode (pstate, OP_RANGE); } ; +/* And each of the four subrange types can also have a stride. */ +subrange: exp ':' exp ':' exp %prec ABOVE_COMMA + { write_exp_elt_opcode (pstate, OP_RANGE); + write_exp_elt_longcst (pstate, + (RANGE_STANDARD + | RANGE_HAS_STRIDE)); + write_exp_elt_opcode (pstate, OP_RANGE); } + ; + +subrange: exp ':' ':' exp %prec ABOVE_COMMA + { write_exp_elt_opcode (pstate, OP_RANGE); + write_exp_elt_longcst (pstate, + (RANGE_HIGH_BOUND_DEFAULT + | RANGE_HAS_STRIDE)); + write_exp_elt_opcode (pstate, OP_RANGE); } + ; + +subrange: ':' exp ':' exp %prec ABOVE_COMMA + { write_exp_elt_opcode (pstate, OP_RANGE); + write_exp_elt_longcst (pstate, + (RANGE_LOW_BOUND_DEFAULT + | RANGE_HAS_STRIDE)); + write_exp_elt_opcode (pstate, OP_RANGE); } + ; + +subrange: ':' ':' exp %prec ABOVE_COMMA + { write_exp_elt_opcode (pstate, OP_RANGE); + write_exp_elt_longcst (pstate, + (RANGE_LOW_BOUND_DEFAULT + | RANGE_HIGH_BOUND_DEFAULT + | RANGE_HAS_STRIDE)); + write_exp_elt_opcode (pstate, OP_RANGE); } + ; + complexnum: exp ',' exp { } ; diff --git a/gdb/f-lang.c b/gdb/f-lang.c index 37d05b27653..b888e3d4122 100644 --- a/gdb/f-lang.c +++ b/gdb/f-lang.c @@ -124,7 +124,7 @@ value_f90_subarray (struct value *array, struct expression *exp, int *pos, enum noside noside) { int pc = (*pos) + 1; - LONGEST low_bound, high_bound; + LONGEST low_bound, high_bound, stride; struct type *range = check_typedef (value_type (array)->index_type ()); enum range_flag range_flag = (enum range_flag) longest_to_int (exp->elts[pc].longconst); @@ -141,6 +141,14 @@ value_f90_subarray (struct value *array, else high_bound = value_as_long (evaluate_subexp (nullptr, exp, pos, noside)); + if ((range_flag & RANGE_HAS_STRIDE) == RANGE_HAS_STRIDE) + stride = value_as_long (evaluate_subexp (nullptr, exp, pos, noside)); + else + stride = 1; + + if (stride != 1) + error (_("Fortran array strides are not currently supported")); + return value_slice (array, low_bound, high_bound - low_bound + 1); } diff --git a/gdb/parse.c b/gdb/parse.c index 4a15de8a499..359ab6211aa 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -924,6 +924,8 @@ operator_length_standard (const struct expression *expr, int endpos, /* Assume the range has 2 arguments (low bound and high bound), then reduce the argument count if any bounds are set to default. */ args = 2; + if (range_flag & RANGE_HAS_STRIDE) + ++args; if (range_flag & RANGE_LOW_BOUND_DEFAULT) --args; if (range_flag & RANGE_HIGH_BOUND_DEFAULT) diff --git a/gdb/testsuite/gdb.fortran/array-slices.exp b/gdb/testsuite/gdb.fortran/array-slices.exp index 31f95a3668d..a0e1d1fe8fc 100644 --- a/gdb/testsuite/gdb.fortran/array-slices.exp +++ b/gdb/testsuite/gdb.fortran/array-slices.exp @@ -69,3 +69,18 @@ foreach result $array_contents msg $message_strings { } gdb_continue_to_breakpoint "continue to Final Breakpoint" + +# Next test that asking for an array with stride at the CLI gives an +# error. +clean_restart ${testfile} + +if ![fortran_runto_main] then { + perror "couldn't run to main" + continue +} + +gdb_breakpoint "show" +gdb_continue_to_breakpoint "show" +gdb_test "up" ".*" +gdb_test "p array (1:10:2, 1:10:2)" \ + "Fortran array strides are not currently supported" -- 2.25.4