2003-11-07 Andrew Cagney <cagney@redhat.com>
authorAndrew Cagney <cagney@redhat.com>
Fri, 7 Nov 2003 20:44:51 +0000 (20:44 +0000)
committerAndrew Cagney <cagney@redhat.com>
Fri, 7 Nov 2003 20:44:51 +0000 (20:44 +0000)
* ppc-linux-tdep.c (ppc_linux_init_abi): When 32-bit GNU/Linux,
set "return_value" instead of "use_struct_convention".
(ppc_linux_use_struct_convention): Delete function.
(ppc_linux_return_value): New function.
* ppc-sysv-tdep.c (ppc_sysv_abi_return_value): New function.
(ppc_sysv_abi_broken_return_value): New function.
(do_ppc_sysv_return_value): Add "gdbarch" parameter.
(ppc64_sysv_abi_push_dummy_call): Add "gdbarch" parameter, drop
static.
(ppc_sysv_abi_extract_return_value): Delete function.
(ppc_sysv_abi_broken_extract_return_value): Delete function.
(ppc_sysv_abi_store_return_value): Delete function.
(ppc_sysv_abi_broken_store_return_value): Delete function.
(ppc_sysv_abi_use_struct_convention): Delete function.
(ppc64_sysv_abi_use_struct_convention): Delete function.
(ppc64_sysv_abi_extract_return_value): Delete function.
(ppc64_sysv_abi_store_return_value): Delete function.
* ppcnbsd-tdep.c (ppcnbsd_return_value): New function.
(ppcnbsd_init_abi): Set "return_value", instead of
"use_struct_convention", "extract_return_value", and
"store_return_value".
(ppcnbsd_use_struct_convention): Delete function.
* ppc-tdep.h (ppc64_sysv_abi_return_value): Declare.
(ppc_sysv_abi_return_value): Declare.
(ppc_sysv_abi_broken_return_value): Declare.
(ppc_sysv_abi_use_struct_convention): Delete.
(ppc_sysv_abi_store_return_value): Delete.
(ppc_sysv_abi_extract_return_value): Delete.
(ppc_sysv_abi_broken_store_return_value): Delete.
(ppc_sysv_abi_broken_extract_return_value): Delete.
(ppc64_sysv_abi_use_struct_convention): Delete.
(ppc64_sysv_abi_extract_return_value): Delete.
(ppc64_sysv_abi_store_return_value): Delete.
* rs6000-tdep.c (rs6000_gdbarch_init): For 32-bit and 64-bit SYSV,
set "return_value" instead of "extract_return_value",
"store_return_value", and "use_struct_convention".

gdb/ChangeLog
gdb/ppc-linux-tdep.c
gdb/ppc-sysv-tdep.c
gdb/ppc-tdep.h
gdb/ppcnbsd-tdep.c
gdb/rs6000-tdep.c

index 71b6df248981b8917c102685a7e5f832910078ad..adce433df2fb311e609ff9ad8e5b6d52e2c3439a 100644 (file)
@@ -1,3 +1,42 @@
+2003-11-07  Andrew Cagney  <cagney@redhat.com>
+
+       * ppc-linux-tdep.c (ppc_linux_init_abi): When 32-bit GNU/Linux,
+       set "return_value" instead of "use_struct_convention".
+       (ppc_linux_use_struct_convention): Delete function.
+       (ppc_linux_return_value): New function.
+       * ppc-sysv-tdep.c (ppc_sysv_abi_return_value): New function.
+       (ppc_sysv_abi_broken_return_value): New function.
+       (do_ppc_sysv_return_value): Add "gdbarch" parameter.
+       (ppc64_sysv_abi_push_dummy_call): Add "gdbarch" parameter, drop
+       static.
+       (ppc_sysv_abi_extract_return_value): Delete function.
+       (ppc_sysv_abi_broken_extract_return_value): Delete function.
+       (ppc_sysv_abi_store_return_value): Delete function.
+       (ppc_sysv_abi_broken_store_return_value): Delete function.
+       (ppc_sysv_abi_use_struct_convention): Delete function.
+       (ppc64_sysv_abi_use_struct_convention): Delete function.
+       (ppc64_sysv_abi_extract_return_value): Delete function.
+       (ppc64_sysv_abi_store_return_value): Delete function.
+       * ppcnbsd-tdep.c (ppcnbsd_return_value): New function.
+       (ppcnbsd_init_abi): Set "return_value", instead of
+       "use_struct_convention", "extract_return_value", and
+       "store_return_value".
+       (ppcnbsd_use_struct_convention): Delete function.
+       * ppc-tdep.h (ppc64_sysv_abi_return_value): Declare.
+       (ppc_sysv_abi_return_value): Declare.
+       (ppc_sysv_abi_broken_return_value): Declare.
+       (ppc_sysv_abi_use_struct_convention): Delete.
+       (ppc_sysv_abi_store_return_value): Delete.
+       (ppc_sysv_abi_extract_return_value): Delete.
+       (ppc_sysv_abi_broken_store_return_value): Delete.
+       (ppc_sysv_abi_broken_extract_return_value): Delete.
+       (ppc64_sysv_abi_use_struct_convention): Delete.
+       (ppc64_sysv_abi_extract_return_value): Delete.
+       (ppc64_sysv_abi_store_return_value): Delete.
+       * rs6000-tdep.c (rs6000_gdbarch_init): For 32-bit and 64-bit SYSV,
+       set "return_value" instead of "extract_return_value",
+       "store_return_value", and "use_struct_convention".
+
 2003-11-07  Mark Kettenis  <kettenis@gnu.org>
 
        * dwarf2-frame.c (dwarf2_build_frame_info): Wrap comment.
index 397f61667f25e7c725f7e200588b2c3d2c110298..c094efeb18294ae24313f9982f323f4bc85ba547 100644 (file)
@@ -596,13 +596,17 @@ ppc_linux_memory_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
    structures, no matter their size, are put in memory.  Vectors,
    which were added later, do get returned in a register though.  */
 
-static int     
-ppc_linux_use_struct_convention (int gcc_p, struct type *value_type)
+static enum return_value_convention
+ppc_linux_return_value (struct gdbarch *gdbarch, struct type *valtype,
+                       struct regcache *regcache, const void *inval, void *outval)
 {  
-  if ((TYPE_LENGTH (value_type) == 16 || TYPE_LENGTH (value_type) == 8)
-      && TYPE_VECTOR (value_type))
-    return 0;                            
-  return 1;
+  if ((TYPE_CODE (valtype) == TYPE_CODE_STRUCT
+       || TYPE_CODE (valtype) == TYPE_CODE_UNION)
+      && !((TYPE_LENGTH (valtype) == 16 || TYPE_LENGTH (valtype) == 8)
+          && TYPE_VECTOR (valtype)))
+    return RETURN_VALUE_STRUCT_CONVENTION;
+  else
+    return ppc_sysv_abi_return_value (gdbarch, valtype, regcache, inval, outval);
 }
 
 /* Fetch (and possibly build) an appropriate link_map_offsets
@@ -1043,7 +1047,7 @@ ppc_linux_init_abi (struct gdbarch_info info,
         (well ignoring vectors that is).  When this was corrected, it
         wasn't fixed for GNU/Linux native platform.  Use the
         PowerOpen struct convention.  */
-      set_gdbarch_use_struct_convention (gdbarch, ppc_linux_use_struct_convention);
+      set_gdbarch_return_value (gdbarch, ppc_linux_return_value);
 
       /* Note: kevinb/2002-04-12: See note in rs6000_gdbarch_init regarding
         *_push_arguments().  The same remarks hold for the methods below.  */
index 02f2ea256d2c3cb2e3cb65079c33c895ad2cedae..a1f52824398cf7b73e7eccc31b8dbf3f2daa92a1 100644 (file)
@@ -322,22 +322,22 @@ ppc_sysv_abi_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
    when returned in general-purpose registers.  */
 
 static enum return_value_convention
-do_ppc_sysv_return_value (struct type *type, struct regcache *regcache,
-                         const void *inval, void *outval, int broken_gcc)
+do_ppc_sysv_return_value (struct gdbarch *gdbarch, struct type *type,
+                         struct regcache *regcache, const void *inval,
+                         void *outval, int broken_gcc)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   gdb_assert (tdep->wordsize == 4);
   if (TYPE_CODE (type) == TYPE_CODE_FLT
       && TYPE_LENGTH (type) <= 8
-      && ppc_floating_point_unit_p (current_gdbarch))
+      && ppc_floating_point_unit_p (gdbarch))
     {
       if (outval)
        {
          /* Floats and doubles stored in "f1".  Convert the value to
             the required type.  */
          char regval[MAX_REGISTER_SIZE];
-         struct type *regtype = register_type (current_gdbarch,
-                                               FP0_REGNUM + 1);
+         struct type *regtype = register_type (gdbarch, FP0_REGNUM + 1);
          regcache_cooked_read (regcache, FP0_REGNUM + 1, regval);
          convert_typed_floating (regval, regtype, outval, type);
        }
@@ -346,7 +346,7 @@ do_ppc_sysv_return_value (struct type *type, struct regcache *regcache,
          /* Floats and doubles stored in "f1".  Convert the value to
             the register's "double" type.  */
          char regval[MAX_REGISTER_SIZE];
-         struct type *regtype = register_type (current_gdbarch, FP0_REGNUM);
+         struct type *regtype = register_type (gdbarch, FP0_REGNUM);
          convert_typed_floating (inval, type, regval, regtype);
          regcache_cooked_write (regcache, FP0_REGNUM + 1, regval);
        }
@@ -510,43 +510,19 @@ do_ppc_sysv_return_value (struct type *type, struct regcache *regcache,
   return RETURN_VALUE_STRUCT_CONVENTION;
 }
 
-void
-ppc_sysv_abi_extract_return_value (struct type *type,
-                                  struct regcache *regcache, void *valbuf)
-{
-  do_ppc_sysv_return_value (type, regcache, NULL, valbuf, 0);
-}
-
-void
-ppc_sysv_abi_broken_extract_return_value (struct type *type,
-                                         struct regcache *regcache,
-                                         void *valbuf)
+enum return_value_convention
+ppc_sysv_abi_return_value (struct gdbarch *gdbarch, struct type *valtype,
+                          struct regcache *regcache, const void *inval, void *outval)
 {
-  do_ppc_sysv_return_value (type, regcache, NULL, valbuf, 1);
+  return do_ppc_sysv_return_value (gdbarch, valtype, regcache, inval, outval, 0);
 }
 
-void
-ppc_sysv_abi_store_return_value (struct type *type, struct regcache *regcache,
-                                const void *valbuf)
+enum return_value_convention
+ppc_sysv_abi_broken_return_value (struct gdbarch *gdbarch, struct type *valtype,
+                                 struct regcache *regcache, const void *inval,
+                                 void *outval)
 {
-  do_ppc_sysv_return_value (type, regcache, valbuf, NULL, 0);
-}
-
-void
-ppc_sysv_abi_broken_store_return_value (struct type *type,
-                                       struct regcache *regcache,
-                                       const void *valbuf)
-{
-  do_ppc_sysv_return_value (type, regcache, valbuf, NULL, 1);
-}
-
-/* Structures 8 bytes or less long are returned in the r3 & r4
-   registers, according to the SYSV ABI. */
-int
-ppc_sysv_abi_use_struct_convention (int gcc_p, struct type *value_type)
-{
-  return (do_ppc_sysv_return_value (value_type, NULL, NULL, NULL, 0)
-         == RETURN_VALUE_STRUCT_CONVENTION);
+  return do_ppc_sysv_return_value (gdbarch, valtype, regcache, inval, outval, 1);
 }
 
 /* Pass the arguments in either registers, or in the stack. Using the
@@ -849,16 +825,17 @@ ppc64_sysv_abi_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
    copy the buffer to the corresponding register return-value location
    location; when OUTVAL is non-NULL, fill the buffer from the
    corresponding register return-value location.  */
-static enum return_value_convention
-ppc64_sysv_abi_return_value (struct type *valtype, struct regcache *regcache,
-                            const void *inval, void *outval)
+enum return_value_convention
+ppc64_sysv_abi_return_value (struct gdbarch *gdbarch, struct type *valtype,
+                            struct regcache *regcache, const void *inval,
+                            void *outval)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   /* Floats and doubles in F1.  */
   if (TYPE_CODE (valtype) == TYPE_CODE_FLT && TYPE_LENGTH (valtype) <= 8)
     {
       char regval[MAX_REGISTER_SIZE];
-      struct type *regtype = register_type (current_gdbarch, FP0_REGNUM);
+      struct type *regtype = register_type (gdbarch, FP0_REGNUM);
       if (inval != NULL)
        {
          convert_typed_floating (inval, valtype, regval, regtype);
@@ -907,7 +884,7 @@ ppc64_sysv_abi_return_value (struct type *valtype, struct regcache *regcache,
       && TYPE_LENGTH (TYPE_TARGET_TYPE (valtype)) == 1)
     {
       /* Small character arrays are returned, right justified, in r3.  */
-      int offset = (register_size (current_gdbarch, tdep->ppc_gp0_regnum + 3)
+      int offset = (register_size (gdbarch, tdep->ppc_gp0_regnum + 3)
                    - TYPE_LENGTH (valtype));
       if (inval != NULL)
        regcache_cooked_write_part (regcache, tdep->ppc_gp0_regnum + 3,
@@ -990,31 +967,6 @@ ppc64_sysv_abi_return_value (struct type *valtype, struct regcache *regcache,
   return RETURN_VALUE_STRUCT_CONVENTION;
 }
 
-int
-ppc64_sysv_abi_use_struct_convention (int gcc_p, struct type *value_type)
-{
-  return (ppc64_sysv_abi_return_value (value_type, NULL, NULL, NULL)
-         == RETURN_VALUE_STRUCT_CONVENTION);
-}
-
-void
-ppc64_sysv_abi_extract_return_value (struct type *valtype,
-                                    struct regcache *regbuf, void *valbuf)
-{
-  if (ppc64_sysv_abi_return_value (valtype, regbuf, NULL, valbuf)
-      != RETURN_VALUE_REGISTER_CONVENTION)
-    error ("Function return value unknown");
-}
-
-void
-ppc64_sysv_abi_store_return_value (struct type *valtype,
-                                  struct regcache *regbuf,
-                                  const void *valbuf)
-{
-  if (!ppc64_sysv_abi_return_value (valtype, regbuf, valbuf, NULL))
-    error ("Function return value location unknown");
-}
-
 CORE_ADDR
 ppc64_sysv_abi_adjust_breakpoint_address (struct gdbarch *gdbarch,
                                          CORE_ADDR bpaddr)
index 346ac8ebc5fb64adc17a3eaf74d047e44b276f71..7adf5795601e4db4e2f9bd389207b922a9fe9ca7 100644 (file)
@@ -34,19 +34,16 @@ void ppc_linux_init_extra_frame_info (int fromleaf, struct frame_info *);
 int ppc_linux_frameless_function_invocation (struct frame_info *);
 void ppc_linux_frame_init_saved_regs (struct frame_info *);
 CORE_ADDR ppc_linux_frame_chain (struct frame_info *);
-int ppc_sysv_abi_use_struct_convention (int, struct type *);
-void ppc_sysv_abi_store_return_value (struct type *type,
-                                     struct regcache *regcache,
-                                     const void *valbuf);
-void ppc_sysv_abi_extract_return_value (struct type *type,
-                                       struct regcache *regcache,
-                                       void *valbuf);
-void ppc_sysv_abi_broken_store_return_value (struct type *type,
-                                            struct regcache *regcache,
-                                            const void *valbuf);
-void ppc_sysv_abi_broken_extract_return_value (struct type *type,
-                                              struct regcache *regcache,
-                                              void *valbuf);
+enum return_value_convention ppc_sysv_abi_return_value (struct gdbarch *gdbarch,
+                                                       struct type *valtype,
+                                                       struct regcache *regcache,
+                                                       const void *inval,
+                                                       void *outval);
+enum return_value_convention ppc_sysv_abi_broken_return_value (struct gdbarch *gdbarch,
+                                                              struct type *valtype,
+                                                              struct regcache *regcache,
+                                                              const void *inval,
+                                                              void *outval);
 CORE_ADDR ppc_sysv_abi_push_dummy_call (struct gdbarch *gdbarch,
                                        CORE_ADDR func_addr,
                                        struct regcache *regcache,
@@ -68,14 +65,11 @@ struct link_map_offsets *ppc_linux_svr4_fetch_link_map_offsets (void);
 void ppc_linux_supply_gregset (char *buf);
 void ppc_linux_supply_fpregset (char *buf);
 
-int ppc64_sysv_abi_use_struct_convention (int gcc_p, struct type *value_type);
-void ppc64_sysv_abi_extract_return_value (struct type *valtype,
-                                         struct regcache *regbuf,
-                                         void *valbuf);
-void ppc64_sysv_abi_store_return_value (struct type *valtype,
-                                       struct regcache *regbuf,
-                                       const void *valbuf);
-
+enum return_value_convention ppc64_sysv_abi_return_value (struct gdbarch *gdbarch,
+                                                         struct type *valtype,
+                                                         struct regcache *regcache,
+                                                         const void *inval,
+                                                         void *outval);
 
 /* From rs6000-tdep.c... */
 CORE_ADDR rs6000_frame_saved_pc (struct frame_info *fi);
index b566f30e4f7f3d9e15047241e633e3af83f2b4ba..ab535c4febef60385f7308a9e5f2587815439ab3 100644 (file)
@@ -208,17 +208,22 @@ ppcnbsd_pc_in_sigtramp (CORE_ADDR pc, char *func_name)
    convention but, 1.6 switched to the below broken convention.  For
    the moment use the broken convention.  Ulgh!.  */
 
-static int     
-ppcnbsd_use_struct_convention (int gcc_p, struct type *value_type)
-{  
-  if ((TYPE_LENGTH (value_type) == 16 || TYPE_LENGTH (value_type) == 8)
-      && TYPE_VECTOR (value_type))
-    return 0;                            
-
-  return !(TYPE_LENGTH (value_type) == 1
-          || TYPE_LENGTH (value_type) == 2
-          || TYPE_LENGTH (value_type) == 4
-          || TYPE_LENGTH (value_type) == 8);
+static enum return_value_convention
+ppcnbsd_return_value (struct gdbarch *gdbarch, struct type *valtype,
+                     struct regcache *regcache, const void *inval, void *outval)
+{
+  if ((TYPE_CODE (valtype) == TYPE_CODE_STRUCT
+       || TYPE_CODE (valtype) == TYPE_CODE_UNION)
+      && !((TYPE_LENGTH (valtype) == 16 || TYPE_LENGTH (valtype) == 8)
+           && TYPE_VECTOR (valtype))
+      && !(TYPE_LENGTH (valtype) == 1
+          || TYPE_LENGTH (valtype) == 2
+          || TYPE_LENGTH (valtype) == 4
+          || TYPE_LENGTH (valtype) == 8))
+    return RETURN_VALUE_STRUCT_CONVENTION;
+  else
+    return ppc_sysv_abi_broken_return_value (gdbarch, valtype, regcache,
+                                            inval, outval);
 }
 
 static void
@@ -228,9 +233,7 @@ ppcnbsd_init_abi (struct gdbarch_info info,
   set_gdbarch_pc_in_sigtramp (gdbarch, ppcnbsd_pc_in_sigtramp);
   /* For NetBSD, this is an on again, off again thing.  Some systems
      do use the broken struct convention, and some don't.  */
-  set_gdbarch_use_struct_convention (gdbarch, ppcnbsd_use_struct_convention);
-  set_gdbarch_extract_return_value (gdbarch, ppc_sysv_abi_broken_extract_return_value);
-  set_gdbarch_store_return_value (gdbarch, ppc_sysv_abi_broken_store_return_value);
+  set_gdbarch_return_value (gdbarch, ppcnbsd_return_value);
   set_solib_svr4_fetch_link_map_offsets (gdbarch,
                                 nbsd_ilp32_solib_svr4_fetch_link_map_offsets);
 }
index 87ed4dcf9bff960b60221cb24682782f896196ae..bc08fbd3651d36a683ed857a7f5e822934371d69 100644 (file)
@@ -2750,15 +2750,9 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   set_gdbarch_sp_regnum (gdbarch, 1);
   set_gdbarch_deprecated_fp_regnum (gdbarch, 1);
   if (sysv_abi && wordsize == 8)
-    {
-      set_gdbarch_extract_return_value (gdbarch, ppc64_sysv_abi_extract_return_value);
-      set_gdbarch_store_return_value (gdbarch, ppc64_sysv_abi_store_return_value);
-    }
+    set_gdbarch_return_value (gdbarch, ppc64_sysv_abi_return_value);
   else if (sysv_abi && wordsize == 4)
-    {
-      set_gdbarch_extract_return_value (gdbarch, ppc_sysv_abi_extract_return_value);
-      set_gdbarch_store_return_value (gdbarch, ppc_sysv_abi_store_return_value);
-    }
+    set_gdbarch_return_value (gdbarch, ppc_sysv_abi_return_value);
   else
     {
       set_gdbarch_deprecated_extract_return_value (gdbarch, rs6000_extract_return_value);
@@ -2907,12 +2901,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   /* Not sure on this. FIXMEmgo */
   set_gdbarch_frame_args_skip (gdbarch, 8);
 
-  if (sysv_abi && wordsize == 4)
-    set_gdbarch_use_struct_convention (gdbarch,
-                                      ppc_sysv_abi_use_struct_convention);
-  else if (sysv_abi && wordsize == 8)
-    set_gdbarch_use_struct_convention (gdbarch, ppc64_sysv_abi_use_struct_convention);
-  else
+  if (!sysv_abi)
     set_gdbarch_use_struct_convention (gdbarch,
                                       rs6000_use_struct_convention);