aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2008-08-29 20:53:33 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2008-08-29 20:53:33 +0200
commitde870512b6dfd173e888bead942fe051a4c59b43 (patch)
treec114c4587eae8ac0792d25948c7ef9bac93f6a3b /gcc
parentbd11e37d6102fa1e90174e627a5f15e7975adc14 (diff)
downloadgcc-de870512b6dfd173e888bead942fe051a4c59b43.zip
gcc-de870512b6dfd173e888bead942fe051a4c59b43.tar.gz
gcc-de870512b6dfd173e888bead942fe051a4c59b43.tar.bz2
dwarf2out.c (descr_info_loc): Handle VAR_DECL.
* dwarf2out.c (descr_info_loc): Handle VAR_DECL. * trans.h (struct lang_type): Add span. (GFC_TYPE_ARRAY_SPAN): Define. * trans-decl.c (gfc_get_symbol_decl): For subref array pointers, copy TREE_STATIC from decl to span instead of setting it unconditionally, set DECL_ARTIFICIAL, fix type of initializer and set GFC_TYPE_ARRAY_SPAN on decl's type. * trans-types.c (gfc_get_array_descr_info): If GFC_TYPE_ARRAY_SPAN is non-NULL, use it as element size. From-SVN: r139782
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog2
-rw-r--r--gcc/dwarf2out.c2
-rw-r--r--gcc/fortran/ChangeLog9
-rw-r--r--gcc/fortran/trans-decl.c6
-rw-r--r--gcc/fortran/trans-types.c5
-rw-r--r--gcc/fortran/trans.h2
6 files changed, 23 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 09d5e1e..1158c2f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,7 @@
2008-08-29 Jakub Jelinek <jakub@redhat.com>
+ * dwarf2out.c (descr_info_loc): Handle VAR_DECL.
+
* dwarf2out.c (gen_const_die): New function.
(size_of_die, value_format, output_die): Output larger
dw_val_class_vec using DW_FORM_block2 or DW_FORM_block4.
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index deddf7e..22c3624 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -12854,6 +12854,8 @@ descr_info_loc (tree val, tree base_decl)
{
CASE_CONVERT:
return descr_info_loc (TREE_OPERAND (val, 0), base_decl);
+ case VAR_DECL:
+ return loc_descriptor_from_tree_1 (val, 0);
case INTEGER_CST:
if (host_integerp (val, 0))
return int_loc_descriptor (tree_low_cst (val, 0));
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index b509e57..196626c 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,14 @@
2008-08-29 Jakub Jelinek <jakub@redhat.com>
+ * trans.h (struct lang_type): Add span.
+ (GFC_TYPE_ARRAY_SPAN): Define.
+ * trans-decl.c (gfc_get_symbol_decl): For subref array pointers,
+ copy TREE_STATIC from decl to span instead of setting it
+ unconditionally, set DECL_ARTIFICIAL, fix type of initializer
+ and set GFC_TYPE_ARRAY_SPAN on decl's type.
+ * trans-types.c (gfc_get_array_descr_info): If
+ GFC_TYPE_ARRAY_SPAN is non-NULL, use it as element size.
+
* trans-decl.c (check_constant_initializer,
gfc_emit_parameter_debug_info): New functions.
(gfc_generate_module_vars, gfc_generate_function_code): Emit
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index c6128a6..72f5973 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -1105,10 +1105,12 @@ gfc_get_symbol_decl (gfc_symbol * sym)
span = build_decl (VAR_DECL, create_tmp_var_name ("span"),
gfc_array_index_type);
gfc_finish_var_decl (span, sym);
- TREE_STATIC (span) = 1;
- DECL_INITIAL (span) = build_int_cst (NULL_TREE, 0);
+ TREE_STATIC (span) = TREE_STATIC (decl);
+ DECL_ARTIFICIAL (span) = 1;
+ DECL_INITIAL (span) = build_int_cst (gfc_array_index_type, 0);
GFC_DECL_SPAN (decl) = span;
+ GFC_TYPE_ARRAY_SPAN (TREE_TYPE (decl)) = span;
}
sym->backend_decl = decl;
diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c
index dbda199..8178ae3 100644
--- a/gcc/fortran/trans-types.c
+++ b/gcc/fortran/trans-types.c
@@ -2289,7 +2289,10 @@ gfc_get_array_descr_info (const_tree type, struct array_descr_info *info)
else
info->base_decl = base_decl = build_decl (VAR_DECL, NULL_TREE, ptype);
- elem_size = fold_convert (gfc_array_index_type, TYPE_SIZE_UNIT (etype));
+ if (GFC_TYPE_ARRAY_SPAN (type))
+ elem_size = GFC_TYPE_ARRAY_SPAN (type);
+ else
+ elem_size = fold_convert (gfc_array_index_type, TYPE_SIZE_UNIT (etype));
field = TYPE_FIELDS (TYPE_MAIN_VARIANT (type));
data_off = byte_position (field);
field = TREE_CHAIN (field);
diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h
index 290c92b..5d729ea 100644
--- a/gcc/fortran/trans.h
+++ b/gcc/fortran/trans.h
@@ -615,6 +615,7 @@ struct lang_type GTY(())
tree offset;
tree dtype;
tree dataptr_type;
+ tree span;
};
struct lang_decl GTY(())
@@ -667,6 +668,7 @@ struct lang_decl GTY(())
#define GFC_TYPE_ARRAY_DTYPE(node) (TYPE_LANG_SPECIFIC(node)->dtype)
#define GFC_TYPE_ARRAY_DATAPTR_TYPE(node) \
(TYPE_LANG_SPECIFIC(node)->dataptr_type)
+#define GFC_TYPE_ARRAY_SPAN(node) (TYPE_LANG_SPECIFIC(node)->span)
/* Build an expression with void type. */
#define build1_v(code, arg) fold_build1(code, void_type_node, arg)