2002-04-24 Elena Zannoni <ezannoni@redhat.com>
authorElena Zannoni <ezannoni@kwikemart.cygnus.com>
Fri, 26 Apr 2002 20:08:19 +0000 (20:08 +0000)
committerElena Zannoni <ezannoni@kwikemart.cygnus.com>
Fri, 26 Apr 2002 20:08:19 +0000 (20:08 +0000)
         * gdbtypes.h (TYPE_FLAG_VECTOR, TYPE_VECTOR): Define.
         * gdbtypes.c (recursive_dump_type): Output the vector flag.
         * dwarf2read.c (dwarf_attr_name): Handle new attribute for
         vectors.
         (read_array_type): Record the fact that this array type is really a
         vector (i.e. are passed in by value).

gdb/ChangeLog
gdb/dwarf2read.c
gdb/gdbtypes.c
gdb/gdbtypes.h

index 6084d5e..8045153 100644 (file)
@@ -1,3 +1,12 @@
+2002-04-26  Elena Zannoni  <ezannoni@redhat.com>
+
+       * gdbtypes.h (TYPE_FLAG_VECTOR, TYPE_VECTOR): Define.
+       * gdbtypes.c (recursive_dump_type): Output the vector flag.
+       * dwarf2read.c (dwarf_attr_name): Handle new attribute for
+       vectors.
+       (read_array_type): Record the fact that this array type is really a
+       vector (i.e. are passed in by value).
+
 2002-04-26  Jason Thorpe  <thorpej@wasabisystems.com>
 
        * alpha-tdep.h (gdbarch_tdep): Add sigcontext_addr member.
index 4673f9a..0f05c09 100644 (file)
@@ -2662,6 +2662,16 @@ read_array_type (struct die_info *die, struct objfile *objfile,
   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
+     array type.  This is not part of the Dwarf2/3 standard yet, but a
+     custom vendor extension.  The main difference between a regular
+     array and the vector variant is that vectors are passed by value
+     to functions.  */
+  attr = dwarf_attr (die, DW_AT_GNU_vector);
+  if (attr)
+    TYPE_FLAGS (type) |= TYPE_FLAG_VECTOR;
+
   do_cleanups (back_to);
 
   /* Install the type in the die. */
@@ -5267,6 +5277,8 @@ dwarf_attr_name (register unsigned attr)
       return "DW_AT_body_begin";
     case DW_AT_body_end:
       return "DW_AT_body_end";
+    case DW_AT_GNU_vector:
+      return "DW_AT_GNU_vector";
     default:
       return "DW_AT_<unknown>";
     }
index bad0ad8..fa01f36 100644 (file)
@@ -3031,6 +3031,13 @@ recursive_dump_type (struct type *type, int spaces)
     {
       puts_filtered (" TYPE_FLAG_VARARGS");
     }
+  /* This is used for things like AltiVec registers on ppc.  Gcc emits
+     an attribute for the array type, which tells whether or not we
+     have a vector, instead of a regular array.  */
+  if (TYPE_VECTOR (type))
+    {
+      puts_filtered (" TYPE_FLAG_VECTOR");
+    }
   puts_filtered ("\n");
   printfi_filtered (spaces, "nfields %d ", TYPE_NFIELDS (type));
   gdb_print_host_address (TYPE_FIELDS (type), gdb_stdout);
index f4a2cf6..0411aaa 100644 (file)
@@ -248,6 +248,13 @@ enum type_code
 #define TYPE_FLAG_VARARGS      (1 << 11)
 #define TYPE_VARARGS(t)                ((t)->flags & TYPE_FLAG_VARARGS)
 
+/* Identify a vector type.  Gcc is handling this by adding an extra
+   attribute to the array type.  We slurp that in as a new flag of a
+   type.  This is used only in dwarf2read.c.  */
+#define TYPE_FLAG_VECTOR       (1 << 12)
+#define TYPE_VECTOR(t)         ((t)->flags & TYPE_FLAG_VECTOR)
+
+
 struct type
   {