This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [PATCH] Add support for dwarf2 vectors
- From: Elena Zannoni <ezannoni at redhat dot com>
- To: gdb-patches at sources dot redhat dot com
- Date: Fri, 26 Apr 2002 16:08:18 -0400
- Subject: Re: [PATCH] Add support for dwarf2 vectors
- References: <15559.25131.290360.770795@localhost.redhat.com>
Committed.
Elena
Elena Zannoni writes:
>
> This is anohter bit of the support for AltiVec on PowerPC.
>
> This introduces support for the new gcc debug info introduced by Jason Merrill:
> http://gcc.gnu.org/ml/gcc-patches/2002-04/msg01428.html
>
> It is a bit hard to test, not having the corresponding simulator
> changes in the tree yet. It can be done on native G4 machines, though.
>
> I'll follow up with powerpc ABI updates that actually use this stuff.
>
> Elena
>
> Note: this is dependent on a patch for /include/elf/dwarf2.h that I
> just posted to the binutils list, otherwise gdb won't build.
>
> 2002-04-24 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).
>
>
> Index: dwarf2read.c
> ===================================================================
> RCS file: /cvs/uberbaum/gdb/dwarf2read.c,v
> retrieving revision 1.52
> diff -u -p -r1.52 dwarf2read.c
> --- dwarf2read.c 4 Apr 2002 22:26:43 -0000 1.52
> +++ dwarf2read.c 24 Apr 2002 21:40:25 -0000
> @@ -2662,6 +2662,16 @@ read_array_type (struct die_info *die, s
> 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: gdbtypes.h
> ===================================================================
> RCS file: /cvs/uberbaum/gdb/gdbtypes.h,v
> retrieving revision 1.27
> diff -u -p -r1.27 gdbtypes.h
> --- gdbtypes.h 23 Mar 2002 01:24:54 -0000 1.27
> +++ gdbtypes.h 24 Apr 2002 21:42:08 -0000
> @@ -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
> {
>
> Index: gdbtypes.c
> ===================================================================
> RCS file: /cvs/uberbaum/gdb/gdbtypes.c,v
> retrieving revision 1.43
> diff -u -p -r1.43 gdbtypes.c
> --- gdbtypes.c 20 Apr 2002 01:09:28 -0000 1.43
> +++ gdbtypes.c 24 Apr 2002 21:42:31 -0000
> @@ -3031,6 +3031,13 @@ recursive_dump_type (struct type *type,
> {
> 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);