commit 6dfd0b7446fce82dba3ae07e24fadb89b9908455 Author: Vladimir Prus Date: Fri Jan 14 00:10:12 2011 +0300 Use the right structure and pointer return registers on m68k-elf. * m68k-tdep.c (m68k_gdbarch_init): Use A0 for structure returns on ELF targets, A1 otherwise. (m68k_svr4_init_abi): No need to specify %a0 for structure returns here. * m68kbsd-tdep.c (m68kbsd_elf_init_abi): Use A1 for struct return on OpenBSD. diff --git a/gdb/m68k-tdep.c b/gdb/m68k-tdep.c index 736bf5b..accffc8 100644 --- a/gdb/m68k-tdep.c +++ b/gdb/m68k-tdep.c @@ -1114,8 +1114,7 @@ m68k_svr4_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) /* SVR4 uses a different calling convention. */ set_gdbarch_return_value (gdbarch, m68k_svr4_return_value); - /* SVR4 uses %a0 instead of %a1. */ - tdep->struct_value_regnum = M68K_A0_REGNUM; + tdep->ptr_value_regnum = M68K_A0_REGNUM; tdep->ptr_value_regnum = M68K_A0_REGNUM; } @@ -1291,7 +1290,16 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* Function call & return. */ set_gdbarch_push_dummy_call (gdbarch, m68k_push_dummy_call); set_gdbarch_return_value (gdbarch, m68k_return_value); + tdep->struct_return = reg_struct_return; + /* These register numbers may be overridden by an OSABI + sniffer. */ + if (info.abfd == NULL) + tdep->struct_value_regnum = M68K_A0_REGNUM; + else if (bfd_get_flavour (info.abfd) == bfd_target_elf_flavour) + tdep->struct_value_regnum = M68K_A0_REGNUM; + else + tdep->struct_value_regnum = M68K_A1_REGNUM; tdep->ptr_value_regnum = M68K_D0_REGNUM; /* Disassembler. */ @@ -1303,8 +1311,6 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) #else tdep->jb_pc = -1; #endif - tdep->struct_value_regnum = M68K_A1_REGNUM; - tdep->struct_return = reg_struct_return; /* Frame unwinder. */ set_gdbarch_dummy_id (gdbarch, m68k_dummy_id); diff --git a/gdb/m68kbsd-tdep.c b/gdb/m68kbsd-tdep.c index 3b5f5e0..f5bfa1a 100644 --- a/gdb/m68kbsd-tdep.c +++ b/gdb/m68kbsd-tdep.c @@ -234,6 +234,15 @@ m68kbsd_elf_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) /* NetBSD ELF uses SVR4-style shared libraries. */ set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); + + /* OpenBSD uses %a1to return structures. */ + if (info.abfd) + { + enum gdb_osabi osabi = gdbarch_lookup_osabi (info.abfd); + + if (osabi == GDB_OSABI_OPENBSD_ELF) + tdep->struct_value_regnum = M68K_A1_REGNUM; + } }