2002-03-22 Elena Zannoni <ezannoni@redhat.com>
authorElena Zannoni <ezannoni@kwikemart.cygnus.com>
Fri, 22 Mar 2002 21:58:16 +0000 (21:58 +0000)
committerElena Zannoni <ezannoni@kwikemart.cygnus.com>
Fri, 22 Mar 2002 21:58:16 +0000 (21:58 +0000)
        * ppc-linux-tdep.c (ppc_sysv_abi_use_struct_convention): New
        function.
* ppc-tdep.h (ppc_sysv_abi_use_struct_convention): Export.
        * rs6000-tdep.c (rs6000_gdbarch_init): Use different
        structure returning convention for SYSV ABI case, but not
        for GNU/Linux, FreeBSD, or NetBSD.

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

index 95ccf861927cbf42eb60886dbc052c7f1220dae1..2f01146f79821fa9ae0c06603125229e6e6d1976 100644 (file)
@@ -1,3 +1,12 @@
+2002-03-22  Elena Zannoni  <ezannoni@redhat.com>
+
+        * ppc-linux-tdep.c (ppc_sysv_abi_use_struct_convention): New
+        function.  
+       * ppc-tdep.h (ppc_sysv_abi_use_struct_convention): Export.
+        * rs6000-tdep.c (rs6000_gdbarch_init): Use different
+        structure returning convention for SYSV ABI case, but not
+        for GNU/Linux, FreeBSD, or NetBSD.
+
 2002-03-22  Daniel Jacobowitz  <drow@mvista.com>
 
        * symtab.h (lookup_block_symbol): Add mangled_name argument
index b12cffd59711279d32467338f627d7dabf543dcc..7e0a70a33d0782327adefeb6130954257526d014 100644 (file)
@@ -414,6 +414,14 @@ ppc_linux_frame_chain (struct frame_info *thisframe)
    it may be used generically by ports which use either the SysV ABI or
    the EABI */
 
+/* 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 (TYPE_LENGTH (value_type) > 8);
+}
+
 /* round2 rounds x up to the nearest multiple of s assuming that s is a
    power of 2 */
 
index 029f87ca6730910aa2e78d18e40de7aa6d037310..ea4d7871501e725b1607fc2c91aeb58feb554bff 100644 (file)
@@ -31,6 +31,7 @@ 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 *);
 CORE_ADDR ppc_sysv_abi_push_arguments (int, struct value **, CORE_ADDR, int,
                                       CORE_ADDR);
 int ppc_linux_memory_remove_breakpoint (CORE_ADDR addr, char *contents_cache);
index ff5a1540332ea78afd8dcfff62dbcc9f653a3f64..9e4d668ca4c26eeff509d28e01e5f139e004c9fe 100644 (file)
@@ -2563,8 +2563,6 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   set_gdbarch_store_struct_return (gdbarch, rs6000_store_struct_return);
   set_gdbarch_store_return_value (gdbarch, rs6000_store_return_value);
   set_gdbarch_extract_struct_value_address (gdbarch, rs6000_extract_struct_value_address);
-  set_gdbarch_use_struct_convention (gdbarch, generic_use_struct_convention);
-
   set_gdbarch_pop_frame (gdbarch, rs6000_pop_frame);
 
   set_gdbarch_skip_prologue (gdbarch, rs6000_skip_prologue);
@@ -2576,6 +2574,27 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   /* Not sure on this. FIXMEmgo */
   set_gdbarch_frame_args_skip (gdbarch, 8);
 
+  /* Until November 2001, gcc was not complying to the SYSV ABI for
+     returning structures less than or equal to 8 bytes in size. It was
+     returning everything in memory. When this was corrected, it wasn't
+     fixed for native platforms. */
+  if (sysv_abi)
+    {
+      if (osabi == ELFOSABI_LINUX
+          || osabi == ELFOSABI_NETBSD
+          || osabi == ELFOSABI_FREEBSD)
+       set_gdbarch_use_struct_convention (gdbarch,
+                                          generic_use_struct_convention);
+      else
+       set_gdbarch_use_struct_convention (gdbarch,
+                                          ppc_sysv_abi_use_struct_convention);
+    }
+  else
+    {
+      set_gdbarch_use_struct_convention (gdbarch,
+                                        generic_use_struct_convention);
+    }
+
   set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid);
   if (osabi == ELFOSABI_LINUX)
     {