* arm-tdep.h (enum struct_return): New.
authorMark Kettenis <kettenis@gnu.org>
Tue, 1 Aug 2006 18:27:52 +0000 (18:27 +0000)
committerMark Kettenis <kettenis@gnu.org>
Tue, 1 Aug 2006 18:27:52 +0000 (18:27 +0000)
(struct gdbarch_tdep): Add struct_return member.
* arm-tdep.c (arm_return_value): Return
RETURN_VALUE_STRUCT_CONVENTION for aggregates when the ABI uses
pcc_struct_return.
(arm_gdbarch_init): Default to reg_struct_return.
* armobsd-tdep.c (armobsd_init_abi): Set pcc_struct_return.

gdb/ChangeLog
gdb/arm-tdep.c
gdb/arm-tdep.h
gdb/armobsd-tdep.c

index c16fd24..c61bcb4 100644 (file)
@@ -1,3 +1,13 @@
+2006-08-01  Mark Kettenis  <kettenis@gnu.org>
+
+       * arm-tdep.h (enum struct_return): New.
+       (struct gdbarch_tdep): Add struct_return member.
+       * arm-tdep.c (arm_return_value): Return
+       RETURN_VALUE_STRUCT_CONVENTION for aggregates when the ABI uses
+       pcc_struct_return.
+       (arm_gdbarch_init): Default to reg_struct_return.
+       * armobsd-tdep.c (armobsd_init_abi): Set pcc_struct_return.
+
 2006-07-31  Mark Kettenis  <kettenis@gnu.org>
 
        * alpha-tdep.h (ALPHA_S0_REGNUM): New define.
index c5c903b..a8c00d8 100644 (file)
@@ -2259,11 +2259,14 @@ arm_return_value (struct gdbarch *gdbarch, struct type *valtype,
                  struct regcache *regcache, gdb_byte *readbuf,
                  const gdb_byte *writebuf)
 {
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
   if (TYPE_CODE (valtype) == TYPE_CODE_STRUCT
       || TYPE_CODE (valtype) == TYPE_CODE_UNION
       || TYPE_CODE (valtype) == TYPE_CODE_ARRAY)
     {
-      if (arm_return_in_memory (gdbarch, valtype))
+      if (tdep->struct_return == pcc_struct_return
+         || arm_return_in_memory (gdbarch, valtype))
        return RETURN_VALUE_STRUCT_CONVENTION;
     }
 
@@ -2757,6 +2760,10 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   tdep->lowest_pc = 0x20;
   tdep->jb_pc = -1;    /* Longjump support not enabled by default.  */
 
+  /* The default, for both APCS and AAPCS, is to return small
+     structures in registers.  */
+  tdep->struct_return = reg_struct_return;
+
   set_gdbarch_push_dummy_call (gdbarch, arm_push_dummy_call);
   set_gdbarch_frame_align (gdbarch, arm_frame_align);
 
index f6dc635..7b369d5 100644 (file)
@@ -125,6 +125,14 @@ enum arm_abi_kind
   ARM_ABI_LAST
 };
 
+/* Convention for returning structures.  */
+
+enum struct_return
+{
+  pcc_struct_return,           /* Return "short" structures in memory.  */
+  reg_struct_return            /* Return "short" structures in registers.  */
+};
+
 /* Target-dependent structure in gdbarch.  */
 struct gdbarch_tdep
 {
@@ -147,10 +155,15 @@ struct gdbarch_tdep
                                   will be disabled.  */
   size_t jb_elt_size;          /* And the size of each entry in the buf.  */
 
+  /* Convention for returning structures.  */
+  enum struct_return struct_return;
+
   /* Cached core file helpers.  */
   struct regset *gregset, *fpregset;
 };
 
+
+
 #ifndef LOWEST_PC
 #define LOWEST_PC (gdbarch_tdep (current_gdbarch)->lowest_pc)
 #endif
index 0f5e7a4..9b14382 100644 (file)
@@ -88,6 +88,9 @@ armobsd_init_abi (struct gdbarch_info info,
 
   tdep->jb_pc = 24;
   tdep->jb_elt_size = 4;
+
+  /* OpenBSD/arm uses -fpcc-struct-return by default.  */
+  tdep->struct_return = pcc_struct_return;
 }
 
 void