diff options
author | Jakub Jelinek <jakub@redhat.com> | 2008-08-29 20:53:33 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2008-08-29 20:53:33 +0200 |
commit | de870512b6dfd173e888bead942fe051a4c59b43 (patch) | |
tree | c114c4587eae8ac0792d25948c7ef9bac93f6a3b /gcc | |
parent | bd11e37d6102fa1e90174e627a5f15e7975adc14 (diff) | |
download | gcc-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/ChangeLog | 2 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 2 | ||||
-rw-r--r-- | gcc/fortran/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/fortran/trans-decl.c | 6 | ||||
-rw-r--r-- | gcc/fortran/trans-types.c | 5 | ||||
-rw-r--r-- | gcc/fortran/trans.h | 2 |
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) |