From 0e98f924382c57b9d2781944ca534c893a7976b8 Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Tue, 26 Feb 2002 06:58:01 +0000 Subject: dwarf2out.c (modified_type_die): Do not call type_main_variant for vectors. 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. From-SVN: r50048 --- gcc/attribs.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) (limited to 'gcc/attribs.c') diff --git a/gcc/attribs.c b/gcc/attribs.c index b915c880..d046a62 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; -- cgit v1.1