From 20a9ba7dcb7f3981aaee0a840a06714bb35a5316 Mon Sep 17 00:00:00 2001 From: dsl Date: Sun, 29 Aug 2004 10:12:05 +0000 Subject: [PATCH] 2004-08-29 David Lecomber Fix PR gdb/648 * language.h (enum array_ordering): New enum. * language.h (struct language_defn): New la_array_ordering attribute. * language.c (unknown_language_defn, auto_language_defn) (local_language_defn): Ditto. * ada-lang.c (ada_language_defn): Ditto. * c-lang.c (c_language_defn, cplus_language_defn) (asm_language_defn, minimal_language_defn): Ditto. * f-lang.c (f_language_defn): Ditto. * jv-lang.c (java_language_defn): Ditto. * m2-lang.c (f_language_defn): Ditto. * objc-lang.c (objc_language_defn): Ditto. * p-lang.c (pascal_language_defn): Ditto. * scm-lang.c (scm_language_defn): Ditto. * eval.c (evaluate_subexp_standard): Assume Fortran arrays are oriented large to small in type structure. * dwarf2read.c (read_array_order): New function. (read_array_type): Use read_array_order to check row/column major ordering. --- gdb/ChangeLog | 23 +++++++++++++++++++++++ gdb/ada-lang.c | 1 + gdb/c-lang.c | 4 ++++ gdb/dwarf2read.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 79 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e5fa2245fe..c141526e60 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,26 @@ +2004-08-29 David Lecomber + + Fix PR gdb/648 + * language.h (enum array_ordering): New enum. + * language.h (struct language_defn): New la_array_ordering + attribute. + * language.c (unknown_language_defn, auto_language_defn) + (local_language_defn): Ditto. + * ada-lang.c (ada_language_defn): Ditto. + * c-lang.c (c_language_defn, cplus_language_defn) + (asm_language_defn, minimal_language_defn): Ditto. + * f-lang.c (f_language_defn): Ditto. + * jv-lang.c (java_language_defn): Ditto. + * m2-lang.c (f_language_defn): Ditto. + * objc-lang.c (objc_language_defn): Ditto. + * p-lang.c (pascal_language_defn): Ditto. + * scm-lang.c (scm_language_defn): Ditto. + * eval.c (evaluate_subexp_standard): Assume Fortran arrays are + oriented large to small in type structure. + * dwarf2read.c (read_array_order): New function. + (read_array_type): Use read_array_order to check row/column + major ordering. + 2004-08-27 Nathan J. Williams * target.c (target_resize_to_sections): Check diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 1bb3ca09ea..fd73fc58da 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -10166,6 +10166,7 @@ const struct language_defn ada_language_defn = { ada_lookup_symbol, ada_lookup_minimal_symbol, #endif /* GNAT_GDB */ + array_row_major, &ada_exp_descriptor, parse, ada_error, diff --git a/gdb/c-lang.c b/gdb/c-lang.c index 5ab15b8edf..ad8fa5c8eb 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -570,6 +570,7 @@ const struct language_defn c_language_defn = range_check_off, type_check_off, case_sensitive_on, + array_row_major, &exp_descriptor_standard, c_preprocess_and_parse, c_error, @@ -631,6 +632,7 @@ const struct language_defn cplus_language_defn = range_check_off, type_check_off, case_sensitive_on, + array_row_major, &exp_descriptor_standard, c_preprocess_and_parse, c_error, @@ -669,6 +671,7 @@ const struct language_defn asm_language_defn = range_check_off, type_check_off, case_sensitive_on, + array_row_major, &exp_descriptor_standard, c_preprocess_and_parse, c_error, @@ -712,6 +715,7 @@ const struct language_defn minimal_language_defn = range_check_off, type_check_off, case_sensitive_on, + array_row_major, &exp_descriptor_standard, c_preprocess_and_parse, c_error, diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index fa11475a69..4e9cdfa89f 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -848,6 +848,9 @@ static CORE_ADDR decode_locdesc (struct dwarf_block *, struct dwarf2_cu *); static void read_array_type (struct die_info *, struct dwarf2_cu *); +static enum dwarf_array_dim_ordering read_array_order (struct die_info *, + struct dwarf2_cu *); + static void read_tag_pointer_type (struct die_info *, struct dwarf2_cu *); static void read_tag_ptr_to_member_type (struct die_info *, @@ -3724,9 +3727,20 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu) /* Dwarf2 dimensions are output from left to right, create the necessary array types in backwards order. */ + type = element_type; - while (ndim-- > 0) - type = create_array_type (NULL, type, range_types[ndim]); + + if (read_array_order (die, cu) == DW_ORD_col_major) + { + int i = 0; + while (i < ndim) + type = create_array_type (NULL, type, range_types[i++]); + } + else + { + while (ndim-- > 0) + type = create_array_type (NULL, type, range_types[ndim]); + } /* Understand Dwarf2 support for vector types (like they occur on the PowerPC w/ AltiVec). Gcc just adds another attribute to the @@ -3744,6 +3758,41 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu) die->type = type; } +static enum dwarf_array_dim_ordering +read_array_order (struct die_info *die, struct dwarf2_cu *cu) +{ + struct attribute *attr; + + attr = dwarf2_attr (die, DW_AT_ordering, cu); + + if (attr) return DW_SND (attr); + + /* + GNU F77 is a special case, as at 08/2004 array type info is the + opposite order to the dwarf2 specification, but data is still + laid out as per normal fortran. + + FIXME: dsl/2004-8-20: If G77 is ever fixed, this will also need + version checking. + */ + + if (cu->language == language_fortran && + cu->producer && strstr (cu->producer, "GNU F77")) + { + return DW_ORD_row_major; + } + + switch (cu->language_defn->la_array_ordering) + { + case array_column_major: + return DW_ORD_col_major; + case array_row_major: + default: + return DW_ORD_row_major; + }; +} + + /* First cut: install each common block member as a global variable. */ static void -- 2.11.0