This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[rfc] [17/18] Cell multi-arch: Support __ea address space qualifier
- From: "Ulrich Weigand" <uweigand at de dot ibm dot com>
- To: gdb-patches at sourceware dot org
- Date: Sun, 7 Sep 2008 23:16:56 +0200 (CEST)
- Subject: [rfc] [17/18] Cell multi-arch: Support __ea address space qualifier
Hello,
this adds support for the __ea address space qualifier (the GCC patches
to add this feature are currently being contributed to mainline).
This feature adds support for pointers in SPU code that hold PowerPC
addresses. These are marked using an address class of 1 in DWARF-2
debug info. The patch below uses GDB's existing support for address
classes to recognize such pointers, and handle proper conversion in
the pointer/integer to address routines.
Bye,
Ulrich
ChangeLog:
* spu-tdep.c (spu_address_class_type_flags): New function.
(spu_address_class_type_flags_to_name): Likewise.
(spu_address_class_name_to_type_flags): Likewise.
(spu_pointer_to_address): Handle __ea pointers.
(spu_integer_to_address): Likewise.
(spu_gdbarch_init): Install address class handlers.
Index: src/gdb/spu-tdep.c
===================================================================
--- src.orig/gdb/spu-tdep.c
+++ src/gdb/spu-tdep.c
@@ -336,7 +336,8 @@ spu_register_reggroup_p (struct gdbarch
return default_register_reggroup_p (gdbarch, regnum, group);
}
-/* Address conversion. */
+
+/* Address handling. */
static CORE_ADDR
spu_lslr (int id)
@@ -352,6 +353,37 @@ spu_lslr (int id)
return strtoulst (buf, NULL, 16);
}
+static int
+spu_address_class_type_flags (int byte_size, int dwarf2_addr_class)
+{
+ if (dwarf2_addr_class == 1)
+ return TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1;
+ else
+ return 0;
+}
+
+static const char *
+spu_address_class_type_flags_to_name (struct gdbarch *gdbarch, int type_flags)
+{
+ if (type_flags & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1)
+ return "__ea";
+ else
+ return NULL;
+}
+
+static int
+spu_address_class_name_to_type_flags (struct gdbarch *gdbarch,
+ const char *name, int *type_flags_ptr)
+{
+ if (strcmp (name, "__ea") == 0)
+ {
+ *type_flags_ptr = TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1;
+ return 1;
+ }
+ else
+ return 0;
+}
+
static void
spu_address_to_pointer (struct gdbarch *gdbarch,
struct type *type, gdb_byte *buf, CORE_ADDR addr)
@@ -366,6 +398,10 @@ spu_pointer_to_address (struct gdbarch *
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
ULONGEST addr = extract_unsigned_integer (buf, TYPE_LENGTH (type));
+ /* Do not convert __ea pointers. */
+ if (TYPE_ADDRESS_CLASS_1 (type))
+ return addr;
+
return addr? SPUADDR (tdep->id, addr & tdep->lslr) : 0;
}
@@ -376,6 +412,10 @@ spu_integer_to_address (struct gdbarch *
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
ULONGEST addr = unpack_long (type, buf);
+ /* Do not convert __ea pointers. */
+ if (TYPE_ADDRESS_CLASS_1 (type))
+ return addr;
+
return SPUADDR (tdep->id, addr & tdep->lslr);
}
@@ -2366,10 +2406,16 @@ spu_gdbarch_init (struct gdbarch_info in
set_gdbarch_double_format (gdbarch, floatformats_ieee_double);
set_gdbarch_long_double_format (gdbarch, floatformats_ieee_double);
- /* Address conversion. */
+ /* Address handling. */
set_gdbarch_address_to_pointer (gdbarch, spu_address_to_pointer);
set_gdbarch_pointer_to_address (gdbarch, spu_pointer_to_address);
set_gdbarch_integer_to_address (gdbarch, spu_integer_to_address);
+ set_gdbarch_address_class_type_flags (gdbarch, spu_address_class_type_flags);
+ set_gdbarch_address_class_type_flags_to_name
+ (gdbarch, spu_address_class_type_flags_to_name);
+ set_gdbarch_address_class_name_to_type_flags
+ (gdbarch, spu_address_class_name_to_type_flags);
+
/* Inferior function calls. */
set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
--
Dr. Ulrich Weigand
GNU Toolchain for Linux on System z and Cell BE
Ulrich.Weigand@de.ibm.com