From patchwork Fri Dec 23 20:34:59 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Baldwin X-Patchwork-Id: 18674 Received: (qmail 105047 invoked by alias); 23 Dec 2016 20:35:10 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 105025 invoked by uid 89); 23 Dec 2016 20:35:09 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.1 required=5.0 tests=AWL, BAYES_00, SPF_HELO_PASS, SPF_SOFTFAIL autolearn=no version=3.3.2 spammy=sk:freebsd, MIPS64, (unknown) X-Spam-User: qpsmtpd, 2 recipients X-HELO: mail.baldwin.cx Received: from bigwig.baldwin.cx (HELO mail.baldwin.cx) (96.47.65.170) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 23 Dec 2016 20:35:06 +0000 Received: from ralph.baldwin.cx (c-73-231-226-104.hsd1.ca.comcast.net [73.231.226.104]) by mail.baldwin.cx (Postfix) with ESMTPSA id E0EA010AA56; Fri, 23 Dec 2016 15:35:04 -0500 (EST) From: John Baldwin To: Nick Clifton Cc: gdb-patches@sourceware.org, binutils@sourceware.org Subject: Re: [PATCH v2 1/3] Use the ELF class to determine the word size for FreeBSD core notes. Date: Fri, 23 Dec 2016 12:34:59 -0800 Message-ID: <1829689.DkhP3uyY6r@ralph.baldwin.cx> User-Agent: KMail/4.14.10 (FreeBSD/11.0-PRERELEASE; KDE/4.14.10; amd64; ; ) In-Reply-To: References: <20161206210015.40422-1-jhb@FreeBSD.org> <20161206210015.40422-2-jhb@FreeBSD.org> MIME-Version: 1.0 X-IsSubscribed: yes On Tuesday, December 13, 2016 11:04:40 AM Nick Clifton wrote: > Hi John, > > > FreeBSD MIPS64 core dumps contain an empty e_flags value so are assigned > > to the default bfd_arch_mips which is 32-bits. > > I am sorry, but I am worried about this patch breaking things for other, > non-MIPS targets. Wouldn't it be easier to update bfd/elfxx-mips.c:_bfd_elf_mips_mach() > to test the EI_CLASS field if no flags are set. Maybe by using the ABI_64_P macro ? I agree and would rather choose a 64-bit MIPS default bfd_arch_mips in this case if possible. I wasn't sure how to go about that and if doing so would break other things (whereas the function I changed should only break things on FreeBSD if it is wrong since it controls parsing of FreeBSD-specific notes). Here is a patch that does that. I have some other things to respin for a v3 on the GDB side, but am including this inline to see what you think: (In particular, with an empty flags value of 0, the arch field of the flags is E_MIPS_ARCH_1 since E_MIPS_ARCH_1 is 0) diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c index d398810..1ba7042 100644 --- a/bfd/elf32-mips.c +++ b/bfd/elf32-mips.c @@ -2295,7 +2295,7 @@ mips_elf32_object_p (bfd *abfd) if (SGI_COMPAT (abfd)) elf_bad_symtab (abfd) = TRUE; - mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags); + mach = _bfd_elf_mips_mach (abfd); bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach); return TRUE; } diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c index 8cd0a73..10ab5e9 100644 --- a/bfd/elf64-mips.c +++ b/bfd/elf64-mips.c @@ -4251,7 +4251,7 @@ mips_elf64_object_p (bfd *abfd) if (elf64_mips_irix_compat (abfd) != ict_none) elf_bad_symtab (abfd) = TRUE; - mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags); + mach = _bfd_elf_mips_mach (abfd); bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach); return TRUE; } diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c index c7ca646..2864d09 100644 --- a/bfd/elfn32-mips.c +++ b/bfd/elfn32-mips.c @@ -3513,7 +3513,7 @@ mips_elf_n32_object_p (bfd *abfd) if (SGI_COMPAT (abfd)) elf_bad_symtab (abfd) = TRUE; - mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags); + mach = _bfd_elf_mips_mach (abfd); bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach); return TRUE; } diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index 96317aa..9b25303 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -6721,8 +6721,10 @@ mips_elf_create_dynamic_relocation (bfd *output_bfd, /* Return the MACH for a MIPS e_flags value. */ unsigned long -_bfd_elf_mips_mach (flagword flags) +_bfd_elf_mips_mach (bfd *abfd) { + flagword flags = elf_elfheader (abfd)->e_flags; + switch (flags & EF_MIPS_MACH) { case E_MIPS_MACH_3900: @@ -6784,7 +6786,10 @@ _bfd_elf_mips_mach (flagword flags) { default: case E_MIPS_ARCH_1: - return bfd_mach_mips3000; + if (ABI_64_P (abfd)) + return bfd_mach_mips4000; + else + return bfd_mach_mips3000; case E_MIPS_ARCH_2: return bfd_mach_mips6000; @@ -6817,8 +6822,6 @@ _bfd_elf_mips_mach (flagword flags) return bfd_mach_mipsisa64r6; } } - - return 0; } /* Return printable name for ABI. */ diff --git a/bfd/elfxx-mips.h b/bfd/elfxx-mips.h index 8ea7b0f..be95a1b 100644 --- a/bfd/elfxx-mips.h +++ b/bfd/elfxx-mips.h @@ -138,7 +138,7 @@ extern bfd_reloc_status_type _bfd_mips_elf_lo16_reloc extern bfd_reloc_status_type _bfd_mips_elf_generic_reloc (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); extern unsigned long _bfd_elf_mips_mach - (flagword); + (bfd *); extern bfd_boolean _bfd_mips_relax_section (bfd *, asection *, struct bfd_link_info *, bfd_boolean *); extern bfd_vma _bfd_mips_elf_sign_extend