From patchwork Fri Mar 15 20:25:50 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Keith Seitz X-Patchwork-Id: 31866 Received: (qmail 43615 invoked by alias); 15 Mar 2019 20:25:59 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 43580 invoked by uid 89); 15 Mar 2019 20:25:59 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-14.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, SPF_HELO_PASS autolearn=ham version=3.3.1 spammy=urgency, printers, 2038, dim X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 15 Mar 2019 20:25:56 +0000 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 49B55308625A for ; Fri, 15 Mar 2019 20:25:55 +0000 (UTC) Received: from theo.uglyboxes.com.com (ovpn-116-44.phx2.redhat.com [10.3.116.44]) by smtp.corp.redhat.com (Postfix) with ESMTP id 07ED25C21F; Fri, 15 Mar 2019 20:25:54 +0000 (UTC) From: Keith Seitz To: gdb-patches@sourceware.org Cc: sergiodj@redhat.com Subject: [PATCH 2/2] Allow really large fortran array bounds: fortran type/value printers Date: Fri, 15 Mar 2019 13:25:50 -0700 Message-Id: <20190315202550.9741-2-keiths@redhat.com> In-Reply-To: <20190315202550.9741-1-keiths@redhat.com> References: <20190315202550.9741-1-keiths@redhat.com> MIME-Version: 1.0 X-IsSubscribed: yes This is the fortran part of the patch, including tests, which are essentially unchanged from Siddhesh's original 2012 submission: https://sourceware.org/ml/gdb-patches/2012-08/msg00562.html There is, however, one large departure. In the above thread, Jan pointed out problems with GCC debuginfo for -m32 builds (filed usptream as gcc/54934). After investigating the issue, I am dropping the hand-tweaked assembler source file to workaround this case. While I would normally do something to accommodate this, in this case, given the ubiquity of 64-bit systems today (where the tests pass) and the apparent lack of urgency on the compiler side (by users), I don't think the additional complexity and maintenance costs are worth it. It will be very routinely tested on 64-bit systems. [For example, at Red Hat, we always test -m64 and -m32 configurations for all GDB releases.] gdb/ChangeLog: From Siddhesh Poyarekar: * f-lang.h (f77_get_upperbound): Return LONGEST. (f77_get_lowerbound): Likewise. * f-typeprint.c (f_type_print_varspec_suffix): Expand UPPER_BOUND and LOWER_BOUND to LONGEST. Use plongest to format print them. (f_type_print_base): Expand UPPER_BOUND to LONGEST. Use plongest to format print it. * f-valprint.c (f77_get_lowerbound): Return LONGEST. (f77_get_upperbound): Likewise. (f77_get_dynamic_length_of_aggregate): Expand UPPER_BOUND, LOWER_BOUND to LONGEST. (f77_create_arrayprint_offset_tbl): Likewise. testsuite/ChangeLog: * gdb.fortran/array-bounds.exp: New file. * gdb.fortran/array-bounds.f90: New file. --- gdb/f-lang.h | 4 +- gdb/f-typeprint.c | 18 ++++---- gdb/f-valprint.c | 4 +- gdb/testsuite/gdb.fortran/array-bounds.exp | 50 ++++++++++++++++++++++ gdb/testsuite/gdb.fortran/array-bounds.f90 | 26 +++++++++++ 5 files changed, 89 insertions(+), 13 deletions(-) create mode 100644 gdb/testsuite/gdb.fortran/array-bounds.exp create mode 100644 gdb/testsuite/gdb.fortran/array-bounds.f90 diff --git a/gdb/f-lang.h b/gdb/f-lang.h index 746c11fd9f..1ba529d76c 100644 --- a/gdb/f-lang.h +++ b/gdb/f-lang.h @@ -50,9 +50,9 @@ struct common_block struct symbol *contents[1]; }; -extern int f77_get_upperbound (struct type *); +extern LONGEST f77_get_upperbound (struct type *); -extern int f77_get_lowerbound (struct type *); +extern LONGEST f77_get_lowerbound (struct type *); extern void f77_get_dynamic_array_length (struct type *); diff --git a/gdb/f-typeprint.c b/gdb/f-typeprint.c index 2dfae5803c..a0e34b3058 100644 --- a/gdb/f-typeprint.c +++ b/gdb/f-typeprint.c @@ -161,8 +161,6 @@ f_type_print_varspec_suffix (struct type *type, struct ui_file *stream, int show, int passed_a_ptr, int demangled_args, int arrayprint_recurse_level) { - int upper_bound, lower_bound; - /* No static variables are permitted as an error call may occur during execution of this function. */ @@ -192,9 +190,10 @@ f_type_print_varspec_suffix (struct type *type, struct ui_file *stream, f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0, arrayprint_recurse_level); - lower_bound = f77_get_lowerbound (type); + LONGEST lower_bound = f77_get_lowerbound (type); + if (lower_bound != 1) /* Not the default. */ - fprintf_filtered (stream, "%d:", lower_bound); + fprintf_filtered (stream, "%s:", plongest (lower_bound)); /* Make sure that, if we have an assumed size array, we print out a warning and print the upperbound as '*'. */ @@ -203,8 +202,9 @@ f_type_print_varspec_suffix (struct type *type, struct ui_file *stream, fprintf_filtered (stream, "*"); else { - upper_bound = f77_get_upperbound (type); - fprintf_filtered (stream, "%d", upper_bound); + LONGEST upper_bound = f77_get_upperbound (type); + + fputs_filtered (plongest (upper_bound), stream); } if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_ARRAY) @@ -273,7 +273,6 @@ void f_type_print_base (struct type *type, struct ui_file *stream, int show, int level) { - int upper_bound; int index; QUIT; @@ -364,8 +363,9 @@ f_type_print_base (struct type *type, struct ui_file *stream, int show, fprintfi_filtered (level, stream, "character*(*)"); else { - upper_bound = f77_get_upperbound (type); - fprintf_filtered (stream, "character*%d", upper_bound); + LONGEST upper_bound = f77_get_upperbound (type); + + fprintf_filtered (stream, "character*%s", pulongest (upper_bound)); } break; diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c index eee0a62fe8..5f9dd4dedb 100644 --- a/gdb/f-valprint.c +++ b/gdb/f-valprint.c @@ -41,7 +41,7 @@ int f77_array_offset_tbl[MAX_FORTRAN_DIMS + 1][2]; /* Array which holds offsets to be applied to get a row's elements for a given array. Array also holds the size of each subarray. */ -int +LONGEST f77_get_lowerbound (struct type *type) { if (TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED (type)) @@ -50,7 +50,7 @@ f77_get_lowerbound (struct type *type) return TYPE_ARRAY_LOWER_BOUND_VALUE (type); } -int +LONGEST f77_get_upperbound (struct type *type) { if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type)) diff --git a/gdb/testsuite/gdb.fortran/array-bounds.exp b/gdb/testsuite/gdb.fortran/array-bounds.exp new file mode 100644 index 0000000000..e18530c75e --- /dev/null +++ b/gdb/testsuite/gdb.fortran/array-bounds.exp @@ -0,0 +1,50 @@ +# Copyright 2012-2019 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This file is part of the gdb testsuite. It contains test to ensure that +# array bounds accept LONGEST. + +if { [skip_fortran_tests] } { return -1 } + +set testfile "array-bounds" +standard_testfile .f90 + +if {[prepare_for_testing $testfile.exp $testfile $srcfile {f90 debug}]} { + return -1 +} + +if {![runto MAIN__]} { + perror "Could not run to breakpoint `MAIN__'." + continue +} + +# Convenience proc to setup for KFAIL +proc kfail_if {exp bugid triplet} { + if {$exp} { + setup_kfail $bugid $triplet + } +} + +# GCC outputs incorrect range debug info for -m32. +set expect_fail false +if {[is_ilp32_target] && ([istarget "i\[34567\]86-*-linux*"] + || [istarget "x86_64-*-linux*"])} { + set expect_fail true +} + +kfail_if $expect_fail "gcc/54934" "*-*-*" +gdb_test "print &foo" {.*\(4294967296:4294967297\).*} +kfail_if $expect_fail "gcc/54934" "*-*-*" +gdb_test "print &bar" {.*\(-4294967297:-4294967296\).*} diff --git a/gdb/testsuite/gdb.fortran/array-bounds.f90 b/gdb/testsuite/gdb.fortran/array-bounds.f90 new file mode 100644 index 0000000000..ec3c4691ac --- /dev/null +++ b/gdb/testsuite/gdb.fortran/array-bounds.f90 @@ -0,0 +1,26 @@ +! Copyright 2012-2019 Free Software Foundation, Inc. + +! This program is free software; you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by +! the Free Software Foundation; either version 3 of the License, or +! (at your option) any later version. +! +! This program is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY; without even the implied warranty of +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +! GNU General Public License for more details. +! +! You should have received a copy of the GNU General Public License +! along with this program. If not, see . + + dimension foo(4294967296_8:4294967297_8) + dimension bar(-4294967297_8:-4294967296_8) + integer(8) :: lb, ub + bar = 42 + foo = bar + lb = lbound (foo, dim = 1, kind = 8) + ub = ubound (foo, dim = 1, kind = 8) + print *, 'bounds of foo - ', lb, ':', ub + stop + end +