diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 98b20742d729d35489ca5f44edc3040b8c117104..c3ab8948805adb11aa5cc632f88fe27d125b36ff 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 b915c88071670bc09087ec6de6d11d0ecbd3b8d3..d046a6242ba47578a6ad011f7698fd332090dd88 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 8d7d48b39bb26ee61c2a73924fe63042be47fb72..6313aeba2f48eb0a6a952d03152a1d8acf256ddf 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;