Please have a look at the following source, variable "a" is a two-dimension array (5 X 5): program array2 integer a(5, 5) do i = 1, 5 do j = 1, 5 a(i, j) = i * j write (*, *) a(i, j) end do end do end program After using gfortran to compile it, use "readelf -wi array2" to see the outputed debuginfo: <2><89>: Abbrev Number: 3 (DW_TAG_variable) DW_AT_name : a DW_AT_decl_file : 1 DW_AT_decl_line : 2 DW_AT_type : <be> DW_AT_location : 3 byte block: 75 94 7f (DW_OP_breg5: -108) ... <1><be>: Abbrev Number: 7 (DW_TAG_array_type) DW_AT_type : <b6> <2><c3>: Abbrev Number: 8 (DW_TAG_subrange_type) DW_AT_type : <b6> DW_AT_lower_bound : 0 DW_AT_upper_bound : 24 From the above, we can see that two-dimension array a(5, 5) is flatten to a one-dimension array with 25 elements (0 - 24). This will hinder GDB from correctly inteprete "a". This might also has some other negative impacts. Feng Wang ever said that (I put him in the CC list): It's not only gdb problem, but also affects performance and optimization on the tree-level. We lose the dimension infomation and can not get correct data dependency. This limits many optimizations like loop interchange and loop distribution, etc.
This is Feng's comment: http://gcc.gnu.org/ml/fortran/2005-06/msg00479.html Just FYI. Thanks.
Confirmed.
Confirmed, Paul B. said he was going to do this (IIRC).
g77 gets this right: $ g77 -g array2.f $ gdb ./a.out GNU gdb Red Hat Linux (6.3.0.0-0.30.1rh) Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "ia64-redhat-linux-gnu"...Using host libthread_db library "/lib/tls/libthread_db.so.1". (gdb) b array2.f:8 Breakpoint 1 at 0x4000000000000db2: file array2.f, line 8. (gdb) r Starting program: /home/zfkts/Krempel/a.out Breakpoint 1, MAIN__ () at array2.f:8 8 write (*, *) a(i, j) Current language: auto; currently fortran (gdb) p a $1 = (( 1, 0, 65598, 0, -1357861061) ( -597610038, 65544, 0, -2147483648, - 169227304) ( 65513, 0, 0, -2019811328, 65515) ( 0, 448693, 0, 65598, 0) ( 0, 0, 0, 0, 0) ) (gdb) p a(1,1) $2 = 1
Also this causes us to lose information lowering in the middle-end that what the size of the arrays were.
I'd add that this isn't a problem just for multi-dimension arrays. If you declare different arrays like "integer a1(5)" "integer a2(1:5)" "integer a3(2:6)" they all show up with incorrect lower bound of 0 and upper bound of 4, making it impossible to actually reference the correct array element in a subscript expression in a debugger.
Subject: Bug 22244 Author: jakub Date: Tue Aug 28 16:08:57 2007 New Revision: 127864 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=127864 Log: PR fortran/22244 * Make-lang.in (fortran/trans-types.o): Depend on $(FLAGS_H). * trans-types.c: Include flags.h. (gfc_get_nodesc_array_type): Add TYPE_DECL TYPE_NAME with correct bounds and dimensions for packed arrays. Modified: trunk/gcc/fortran/ChangeLog trunk/gcc/fortran/Make-lang.in trunk/gcc/fortran/trans-types.c
Subject: Bug 22244 Author: jakub Date: Tue Sep 25 09:32:44 2007 New Revision: 128747 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=128747 Log: PR fortran/22244 * Make-lang.in (fortran/trans-types.o): Depend on $(FLAGS_H). * trans-types.c: Include flags.h. (gfc_get_nodesc_array_type): Add TYPE_DECL TYPE_NAME with correct bounds and dimensions for packed arrays. Modified: branches/redhat/gcc-4_1-branch/gcc/fortran/ChangeLog branches/redhat/gcc-4_1-branch/gcc/fortran/Make-lang.in branches/redhat/gcc-4_1-branch/gcc/fortran/trans-types.c
Can this be closed?
I think there are other issues with array information, so I think this PR shouldn't be closed yet.
Attempt to deal with assumed shape, allocated etc. arrays: http://gcc.gnu.org/ml/gcc-patches/2007-11/msg00612.html Does not yet implement the DW_AT_associated and DW_AT_allocated attributes. For those, guess for ALLOCATABLE, but non-POINTER, DW_AT_allocated could be just a test whether varx.data != NULL. For POINTER I have no idea yet. Any help would be appreciated.
I think the patch also fixes PR 17905. Current patch links: http://gcc.gnu.org/ml/gcc-patches/2007-11/msg00888.html http://gcc.gnu.org/ml/gcc-patches/2007-11/msg00903.html
Subject: Bug 22244 Author: jakub Date: Sun Dec 9 17:08:06 2007 New Revision: 130724 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=130724 Log: PR fortran/22244 * langhooks-def.h (LANG_HOOKS_GET_ARRAY_DESCR_INFO): Define. (LANG_HOOKS_FOR_TYPES_INITIALIZER): Add it. * langhooks.h (struct array_descr_info): Forward declaration. (struct lang_hooks_for_types): Add get_array_descr_info field. * dwarf2.h (DW_AT_bit_stride, DW_AT_byte_stride): New. (DW_AT_stride_size, DW_AT_stride): Keep around for Dwarf2 compatibility. * dwarf2out.h (struct array_descr_info): New type. * dwarf2out.c (dwarf_attr_name): Rename DW_AT_stride to DW_AT_byte_stride and DW_AT_stride_size to DW_AT_bit_size. (descr_info_loc, add_descr_info_field, gen_descr_array_type_die): New functions. (gen_type_die_with_usage): Call lang_hooks.types.get_array_descr_info and gen_descr_array_type_die. * trans.h (struct array_descr_info): Forward declaration. (gfc_get_array_descr_info): New prototype. (enum gfc_array_kind): New type. (struct lang_type): Add akind field. (GFC_TYPE_ARRAY_AKIND): Define. * trans-types.c: Include dwarf2out.h. (gfc_build_array_type): Add akind argument. Adjust gfc_get_array_type_bounds call. (gfc_get_nodesc_array_type): Include proper debug info even for assumed-size arrays. (gfc_get_array_type_bounds): Add akind argument, set GFC_TYPE_ARRAY_AKIND to it. (gfc_sym_type, gfc_get_derived_type): Adjust gfc_build_array_type callers. (gfc_get_array_descr_info): New function. * trans-array.c (gfc_trans_create_temp_array, gfc_conv_expr_descriptor): Adjust gfc_get_array_type_bounds callers. * trans-stmt.c (gfc_trans_pointer_assign_need_temp): Likewise. * trans-types.h (gfc_get_array_type_bounds): Adjust prototype. * Make-lang.in (fortran/trans-types.o): Depend on dwarf2out.h. * f95-lang.c (LANG_HOOKS_GET_ARRAY_DESCR_INFO): Define. Modified: trunk/gcc/ChangeLog trunk/gcc/dwarf2.h trunk/gcc/dwarf2out.c trunk/gcc/dwarf2out.h trunk/gcc/fortran/ChangeLog trunk/gcc/fortran/Make-lang.in trunk/gcc/fortran/f95-lang.c trunk/gcc/fortran/trans-array.c trunk/gcc/fortran/trans-stmt.c trunk/gcc/fortran/trans-types.c trunk/gcc/fortran/trans-types.h trunk/gcc/fortran/trans.h trunk/gcc/langhooks-def.h trunk/gcc/langhooks.h
Close as FIXED (on the trunk/4.3.0). Note, for debugging multi-dimensional arrays one also needs the following gdb patch: http://sourceware.org/ml/gdb-patches/2007-11/msg00438.html