summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElena Zannoni <ezannoni@kwikemart.cygnus.com>2002-03-22 21:58:16 +0000
committerElena Zannoni <ezannoni@kwikemart.cygnus.com>2002-03-22 21:58:16 +0000
commit90ca5d7153adfb21eccb57b0c2bc7460568be3b9 (patch)
treea590a23ebbb8237266d5dc842f9b7f1e66971853
parent83e117223034ca116e8f02a23145eb4bedbdd225 (diff)
downloadgdb-90ca5d7153adfb21eccb57b0c2bc7460568be3b9.tar.gz
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.
-rw-r--r--gdb/ChangeLog9
-rw-r--r--gdb/ppc-linux-tdep.c8
-rw-r--r--gdb/ppc-tdep.h1
-rw-r--r--gdb/rs6000-tdep.c23
4 files changed, 39 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 95ccf861927..2f01146f798 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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
diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c
index b12cffd5971..7e0a70a33d0 100644
--- a/gdb/ppc-linux-tdep.c
+++ b/gdb/ppc-linux-tdep.c
@@ -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 */
diff --git a/gdb/ppc-tdep.h b/gdb/ppc-tdep.h
index 029f87ca673..ea4d7871501 100644
--- a/gdb/ppc-tdep.h
+++ b/gdb/ppc-tdep.h
@@ -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);
diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c
index ff5a1540332..9e4d668ca4c 100644
--- a/gdb/rs6000-tdep.c
+++ b/gdb/rs6000-tdep.c
@@ -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)
{