From: David Lecomber <david@streamline-computing.com>
To: gdb-patches@sources.redhat.com
Subject: Patches to improve Fortran support
Date: Mon, 13 Jan 2003 16:58:00 -0000 [thread overview]
Message-ID: <20030113165758.A2221@streamline-computing.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 1111 bytes --]
I have two patches that are fairly useful to basic Fortran usage
for gdb-5.2 and gdb-5.3
Problem 1: Fortran array access problems.. Presently gdb allocates an
entire copy of the array and then fills it, before looking for the
required value. This patch changes the behaviour to be more like the
C code and just allocates and copies the value required..
This solves a pretty major problem where an array is passed as a
parameter to a function with an underspecified dimension (ie. real
(10:*) ) because the * is translated to '-1' which then completely
screws up the allocation of memory.. This previously would mean that
you couldn't access data in a function where the array was passed like
this; it also eliminates the SEG faults caused when it previously
tried to allocate a negative amount of memory (ie. sizeof(real) * 10 *
-1)...
Problem 2: printing an array prints too many elements for
multi-dimensional arrays. This patch limits the number of elements
printed to the same number that a single-dimensioned array prints.
NB. similar patch required for C, but this is less frequently used.
David
[-- Attachment #2: gdb.array-arg-expression-eval-patch --]
[-- Type: text/plain, Size: 885 bytes --]
*** values.c Tue Jan 29 03:08:26 2002
--- values.c Thu Oct 17 12:21:26 2002
*************** allocate_value (struct type *type)
*** 81,88 ****
{
struct value *val;
struct type *atype = check_typedef (type);
!
! val = (struct value *) xmalloc (sizeof (struct value) + TYPE_LENGTH (atype));
VALUE_NEXT (val) = all_values;
all_values = val;
VALUE_TYPE (val) = type;
--- 81,93 ----
{
struct value *val;
struct type *atype = check_typedef (type);
! if (((int) TYPE_LENGTH(atype)) < 0) {
! /* a silly fortran problem - the
! unspecified array dimension
! issue.. */
! val = (struct value *) xmalloc (sizeof (struct value) - TYPE_LENGTH (atype));}
! else {
! val = (struct value *) xmalloc (sizeof (struct value) + TYPE_LENGTH (atype));}
VALUE_NEXT (val) = all_values;
all_values = val;
VALUE_TYPE (val) = type;
[-- Attachment #3: gdb.huge-array-patch --]
[-- Type: text/plain, Size: 4228 bytes --]
*** f-valprint.c Wed Mar 7 02:57:08 2001
--- f-valprint.c Mon Oct 7 10:22:57 2002
*************** static void f77_print_array (struct type
*** 46,52 ****
enum val_prettyprint);
static void f77_print_array_1 (int, int, struct type *, char *,
CORE_ADDR, struct ui_file *, int, int, int,
! enum val_prettyprint);
static void f77_create_arrayprint_offset_tbl (struct type *,
struct ui_file *);
static void f77_get_dynamic_length_of_aggregate (struct type *);
--- 46,53 ----
enum val_prettyprint);
static void f77_print_array_1 (int, int, struct type *, char *,
CORE_ADDR, struct ui_file *, int, int, int,
! enum val_prettyprint,
! int *elts);
static void f77_create_arrayprint_offset_tbl (struct type *,
struct ui_file *);
static void f77_get_dynamic_length_of_aggregate (struct type *);
*************** f77_create_arrayprint_offset_tbl (struct
*** 270,300 ****
}
}
/* Actual function which prints out F77 arrays, Valaddr == address in
the superior. Address == the address in the inferior. */
-
static void
f77_print_array_1 (int nss, int ndimensions, struct type *type, char *valaddr,
CORE_ADDR address, struct ui_file *stream, int format,
! int deref_ref, int recurse, enum val_prettyprint pretty)
{
int i;
if (nss != ndimensions)
{
! for (i = 0; i < F77_DIM_SIZE (nss); i++)
{
fprintf_filtered (stream, "( ");
f77_print_array_1 (nss + 1, ndimensions, TYPE_TARGET_TYPE (type),
valaddr + i * F77_DIM_OFFSET (nss),
address + i * F77_DIM_OFFSET (nss),
! stream, format, deref_ref, recurse, pretty);
fprintf_filtered (stream, ") ");
}
}
else
{
! for (i = 0; (i < F77_DIM_SIZE (nss) && i < print_max); i++)
{
val_print (TYPE_TARGET_TYPE (type),
valaddr + i * F77_DIM_OFFSET (ndimensions),
--- 271,306 ----
}
}
+
+
/* Actual function which prints out F77 arrays, Valaddr == address in
the superior. Address == the address in the inferior. */
static void
f77_print_array_1 (int nss, int ndimensions, struct type *type, char *valaddr,
CORE_ADDR address, struct ui_file *stream, int format,
! int deref_ref, int recurse, enum val_prettyprint pretty,
! int *elts)
{
int i;
if (nss != ndimensions)
{
! for (i = 0; i < F77_DIM_SIZE (nss) && *elts < print_max; i++)
{
fprintf_filtered (stream, "( ");
f77_print_array_1 (nss + 1, ndimensions, TYPE_TARGET_TYPE (type),
valaddr + i * F77_DIM_OFFSET (nss),
address + i * F77_DIM_OFFSET (nss),
! stream, format, deref_ref, recurse, pretty, elts);
fprintf_filtered (stream, ") ");
}
+ if (*elts >= print_max && i < F77_DIM_SIZE (nss)) {
+ fprintf_filtered (stream, "...");
+ }
}
else
{
! for (i = 0; (i < F77_DIM_SIZE (nss) && (*elts) < print_max); i++ , (*elts)++)
{
val_print (TYPE_TARGET_TYPE (type),
valaddr + i * F77_DIM_OFFSET (ndimensions),
*************** f77_print_array_1 (int nss, int ndimensi
*** 305,311 ****
if (i != (F77_DIM_SIZE (nss) - 1))
fprintf_filtered (stream, ", ");
! if (i == print_max - 1)
fprintf_filtered (stream, "...");
}
}
--- 311,317 ----
if (i != (F77_DIM_SIZE (nss) - 1))
fprintf_filtered (stream, ", ");
! if (( *elts) > print_max - 1)
fprintf_filtered (stream, "...");
}
}
*************** f77_print_array (struct type *type, char
*** 320,325 ****
--- 326,332 ----
enum val_prettyprint pretty)
{
int ndimensions;
+ int elts = 0;
ndimensions = calc_f77_array_dims (type);
*************** f77_print_array (struct type *type, char
*** 334,340 ****
f77_create_arrayprint_offset_tbl (type, stream);
f77_print_array_1 (1, ndimensions, type, valaddr, address, stream, format,
! deref_ref, recurse, pretty);
}
\f
--- 341,347 ----
f77_create_arrayprint_offset_tbl (type, stream);
f77_print_array_1 (1, ndimensions, type, valaddr, address, stream, format,
! deref_ref, recurse, pretty, &elts);
}
\f
next reply other threads:[~2003-01-13 16:58 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-01-13 16:58 David Lecomber [this message]
2003-01-13 17:54 Michael Elizabeth Chastain
2003-01-15 21:32 David Lecomber
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=20030113165758.A2221@streamline-computing.com \
--to=david@streamline-computing.com \
--cc=gdb-patches@sources.redhat.com \
/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