summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2002-02-26 06:58:01 +0000
committerAldy Hernandez <aldyh@gcc.gnu.org>2002-02-26 06:58:01 +0000
commit0e98f924382c57b9d2781944ca534c893a7976b8 (patch)
tree5c5f1a8ad11f67954275c0e6979b919433ead64c /gcc
parenta50cfd52a6419578d6010b1a6e4301a308b68017 (diff)
downloadgcc-0e98f924382c57b9d2781944ca534c893a7976b8.tar.gz
dwarf2out.c (modified_type_die): Do not call type_main_variant for vectors.
2002-02-26 Aldy Hernandez <aldyh@redhat.com> * 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/attribs.c29
-rw-r--r--gcc/dwarf2out.c18
3 files changed, 46 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 98b20742d72..c3ab8948805 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2002-02-26 Aldy Hernandez <aldyh@redhat.com>
+
+ * 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 <degger@fhm.edu>
* config/rs6000/rs6000.md: Swap define_insn attributes to
diff --git a/gcc/attribs.c b/gcc/attribs.c
index b915c880716..d046a6242ba 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 8d7d48b39bb..6313aeba2f4 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;