This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Emit Fortran CHARACTER types as DW_TAG_string_type
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Jason Merrill <jason at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org, fortran at gcc dot gnu dot org, Jan Kratochvil <jkratoch at redhat dot com>, Michael Eager <eager at eagercon dot com>
- Date: Fri, 22 Aug 2008 14:29:25 -0400
- Subject: Re: [PATCH] Emit Fortran CHARACTER types as DW_TAG_string_type
- References: <20080822163610.GF30397@hs20-bc2-1.build.redhat.com> <48AEFE39.6050801@redhat.com>
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
On Fri, Aug 22, 2008 at 01:58:17PM -0400, Jason Merrill wrote:
> It seems like this patch uses DW_TAG_string_type for kind 1 CHARACTERs,
> which makes sense, and leaves other CHARACTERs as DW_TAG_array_types,
> which seems reasonable until the standards issue is cleared up, but then
> also removes the array size/subscript information from those
> DW_TAG_array_types, which I don't understand.
You're right, I should have done the break in add_subscript_info only
for dimension_number > 0. The rest is IMHO correct. Even for kind 4
CHARACTER types IMHO we don't want character (kind=4,len=10) :: x (2:5,2:8)
be represented as 3 dimensional array, but 2 dimensional array of
1 dimensional arrays (when we can't use DW_TAG_string_type), to at least
hint the debugger it is not integer (kind=4) :: x (2:5,2:8,10).
2008-08-22 Jakub Jelinek <jakub@redhat.com>
* dwarf2out.c (add_subscript_info): Stop on Fortran TYPE_STRING_FLAG
types.
(gen_array_type_die): Emit DW_TAG_string_type for Fortran character
types.
--- gcc/dwarf2out.c.jj 2008-08-22 13:39:21.000000000 +0200
+++ gcc/dwarf2out.c 2008-08-22 17:49:10.000000000 +0200
@@ -12037,6 +12037,9 @@ add_subscript_info (dw_die_ref type_die,
{
tree domain = TYPE_DOMAIN (type);
+ if (TYPE_STRING_FLAG (type) && is_fortran () && dimension_number > 0)
+ break;
+
/* Arrays come in three flavors: Unspecified bounds, fixed bounds,
and (in GNU C only) variable bounds. Handle all three forms
here. */
@@ -12570,7 +12573,40 @@ gen_array_type_die (tree type, dw_die_re
bool collapse_nested_arrays = !is_ada ();
tree element_type;
-
+
+ /* Emit DW_TAG_string_type for Fortran character types (with kind 1 only, as
+ DW_TAG_string_type doesn't have DW_AT_type attribute). */
+ if (TYPE_STRING_FLAG (type)
+ && TREE_CODE (type) == ARRAY_TYPE
+ && is_fortran ()
+ && TYPE_MODE (TREE_TYPE (type)) == TYPE_MODE (char_type_node))
+ {
+ HOST_WIDE_INT size;
+
+ array_die = new_die (DW_TAG_string_type, scope_die, type);
+ add_name_attribute (array_die, type_tag (type));
+ equate_type_number_to_die (type, array_die);
+ size = int_size_in_bytes (type);
+ if (size >= 0)
+ add_AT_unsigned (array_die, DW_AT_byte_size, size);
+ else if (TYPE_DOMAIN (type) != NULL_TREE
+ && TYPE_MAX_VALUE (TYPE_DOMAIN (type)) != NULL_TREE
+ && DECL_P (TYPE_MAX_VALUE (TYPE_DOMAIN (type))))
+ {
+ tree szdecl = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
+ dw_loc_descr_ref loc = loc_descriptor_from_tree (szdecl);
+
+ size = int_size_in_bytes (TREE_TYPE (szdecl));
+ if (loc && size > 0)
+ {
+ add_AT_loc (array_die, DW_AT_string_length, loc);
+ if (size != DWARF2_ADDR_SIZE)
+ add_AT_unsigned (array_die, DW_AT_byte_size, size);
+ }
+ }
+ return;
+ }
+
/* ??? The SGI dwarf reader fails for array of array of enum types
(e.g. const enum machine_mode insn_operand_mode[2][10]) unless the inner
array type comes before the outer array type. We thus call gen_type_die
@@ -12597,7 +12633,8 @@ gen_array_type_die (tree type, dw_die_re
/* For Fortran multidimensional arrays use DW_ORD_col_major ordering. */
if (is_fortran ()
&& TREE_CODE (type) == ARRAY_TYPE
- && TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE)
+ && TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE
+ && !TYPE_STRING_FLAG (TREE_TYPE (type)))
add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_col_major);
#if 0
@@ -12625,8 +12662,12 @@ gen_array_type_die (tree type, dw_die_re
element_type = TREE_TYPE (type);
if (collapse_nested_arrays)
while (TREE_CODE (element_type) == ARRAY_TYPE)
- element_type = TREE_TYPE (element_type);
-
+ {
+ if (TYPE_STRING_FLAG (element_type) && is_fortran ())
+ break;
+ element_type = TREE_TYPE (element_type);
+ }
+
#ifndef MIPS_DEBUGGING_INFO
gen_type_die (element_type, context_die);
#endif
Jakub