From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3282 invoked by alias); 26 Apr 2011 11:58:41 -0000 Received: (qmail 3271 invoked by uid 22791); 26 Apr 2011 11:58:41 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL,BAYES_00,SPF_FAIL X-Spam-Check-By: sourceware.org Received: from gate.lvk.cs.msu.su (HELO mail.lvk.cs.msu.su) (158.250.17.1) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 26 Apr 2011 11:58:27 +0000 Received: from mail.lvk.cs.msu.su (localhost [127.0.0.1]) by mail.lvk.cs.msu.su (Postfix) with ESMTP id 83175179A1; Tue, 26 Apr 2011 15:58:23 +0400 (MSD) X-Spam-ASN: Received: from thunder.localnet (gate.lvknet [192.168.128.254]) by mail.lvk.cs.msu.su (Postfix) with ESMTPSA id 76234133A5; Tue, 26 Apr 2011 15:58:23 +0400 (MSD) From: Vladimir Prus To: Mark Kettenis Subject: Re: m68k-elf return value registers Date: Tue, 26 Apr 2011 11:58:00 -0000 User-Agent: KMail/1.13.5 (Linux/2.6.35-28-generic-pae; KDE/4.6.2; i686; ; ) Cc: gdb-patches@sources.redhat.com References: <201101140157.38487.vladimir@codesourcery.com> <201101141037.p0EAbFFA023135@glazunov.sibelius.xs4all.nl> <201101251949.15840.vladimir@codesourcery.com> In-Reply-To: <201101251949.15840.vladimir@codesourcery.com> MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_eNrtNGKbakplMku" Message-Id: <201104261558.22776.vladimir@codesourcery.com> X-AV-Checked: ClamAV using ClamSMTP Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-04/txt/msg00474.txt.bz2 --Boundary-00=_eNrtNGKbakplMku Content-Type: Text/Plain; charset="iso-8859-6" Content-Transfer-Encoding: 7bit Content-length: 665 On Tuesday, January 25, 2011 19:49:15 Vladimir Prus wrote: > How about this split: > > - Register used to return structures > - Logic used to decide whether a structure is returned in register > - Adjusting register used for returning pointers And here's the patch that adjusts the register used to return structures. Earlier, you said: > > Also, you should make sure that that code doesn't get used for > > OpenBSD/m68k a.out, since it will be wrong. but I've lost track of what bit of the patch you meant. Could you clarify that, as part of reviewing whatever individual patch is applicable? - Volodya -- Vladimir Prus Mentor Graphics +7 (812) 677-68-40 --Boundary-00=_eNrtNGKbakplMku Content-Type: text/x-patch; charset="UTF-8"; name="struct_return_register.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="struct_return_register.diff" Content-length: 2610 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; + } } --Boundary-00=_eNrtNGKbakplMku--