diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 98b20742d729..c3ab8948805a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2002-02-26 Aldy Hernandez + + * dwarf2out.c (modified_type_die): Do not call type_main_variant + for vectors. + (gen_type_die): Same. + + * attribs.c (handle_vector_size_attribute): Set debug information. + 2002-02-26 Daniel Egger * config/rs6000/rs6000.md: Swap define_insn attributes to diff --git a/gcc/attribs.c b/gcc/attribs.c index b915c8807167..d046a6242ba4 100644 --- a/gcc/attribs.c +++ b/gcc/attribs.c @@ -1307,12 +1307,33 @@ handle_vector_size_attribute (node, name, args, flags, no_add_attrs) error ("no vector mode with the size and type specified could be found"); else { + tree index, array, rt; + new_type = type_for_mode (new_mode, TREE_UNSIGNED (type)); + if (!new_type) - error ("no vector mode with the size and type specified could be found"); - else - /* Build back pointers if needed. */ - *node = vector_size_helper (*node, new_type); + { + error ("no vector mode with the size and type specified could be found"); + return NULL_TREE; + } + + new_type = build_type_copy (new_type); + + /* Set the debug information here, because this is the only + place where we know the underlying type for a vector made + with vector_size. For debugging purposes we pretend a vector + is an array within a structure. */ + index = build_int_2 (TYPE_VECTOR_SUBPARTS (new_type) - 1, 0); + array = build_array_type (type, build_index_type (index)); + rt = make_node (RECORD_TYPE); + + TYPE_FIELDS (rt) = build_decl (FIELD_DECL, get_identifier ("f"), array); + DECL_CONTEXT (TYPE_FIELDS (rt)) = rt; + layout_type (rt); + TYPE_DEBUG_REPRESENTATION_TYPE (new_type) = rt; + + /* Build back pointers if needed. */ + *node = vector_size_helper (*node, new_type); } return NULL_TREE; diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 8d7d48b39bb2..6313aeba2f48 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -7565,7 +7565,12 @@ modified_type_die (type, is_const_type, is_volatile_type, context_die) copy was created to help us keep track of typedef names) and that copy might have a different TYPE_UID from the original ..._TYPE node. */ - mod_type_die = lookup_type_die (type_main_variant (type)); + if (TREE_CODE (type) != VECTOR_TYPE) + mod_type_die = lookup_type_die (type_main_variant (type)); + else + /* Vectors have the debugging information in the type, + not the main variant. */ + mod_type_die = lookup_type_die (type); if (mod_type_die == NULL) abort (); } @@ -10976,10 +10981,13 @@ gen_type_die (type, context_die) if (type == NULL_TREE || type == error_mark_node) return; - /* We are going to output a DIE to represent the unqualified version of - this type (i.e. without any const or volatile qualifiers) so get the - main variant (i.e. the unqualified version) of this type now. */ - type = type_main_variant (type); + /* We are going to output a DIE to represent the unqualified version + of this type (i.e. without any const or volatile qualifiers) so + get the main variant (i.e. the unqualified version) of this type + now. (Vectors are special because the debugging info is in the + cloned type itself). */ + if (TREE_CODE (type) != VECTOR_TYPE) + type = type_main_variant (type); if (TREE_ASM_WRITTEN (type)) return;