From patchwork Thu Sep 1 07:36:38 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Pinski X-Patchwork-Id: 15147 Received: (qmail 12665 invoked by alias); 1 Sep 2016 07:37:00 -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 12362 invoked by uid 89); 1 Sep 2016 07:36:58 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL, BAYES_00, KAM_LAZY_DOMAIN_SECURITY, RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=lp64, *_bfd_error_handler, sk:bfd_get, H*MI:sk:1472516 X-Spam-User: qpsmtpd, 2 recipients X-HELO: camailhost.cavium.com Received: from camailhost.cavium.com (HELO camailhost.cavium.com) (12.108.191.230) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 01 Sep 2016 07:36:49 +0000 Received: from apinski-ss1.caveonetworks.com ([10.18.106.6]) by camailhost.cavium.com (8.14.7/8.14.7) with ESMTP id u817ajN3005039; Thu, 1 Sep 2016 00:36:45 -0700 Received: from apinski-ss1.caveonetworks.com (localhost [127.0.0.1]) by apinski-ss1.caveonetworks.com (8.15.2/8.15.2/Debian-3) with ESMTP id u817ajhJ043096; Thu, 1 Sep 2016 00:36:45 -0700 Received: (from apinski@localhost) by apinski-ss1.caveonetworks.com (8.15.2/8.15.2/Submit) id u817aj8b043095; Thu, 1 Sep 2016 00:36:45 -0700 From: Andrew Pinski To: gdb-patches@sourceware.org, binutils@sourceware.org Cc: Andrew Pinski Subject: [PATCH 1/3] Move AARCH64 ILP32 rejection handling Date: Thu, 1 Sep 2016 00:36:38 -0700 Message-Id: <1472715400-43043-2-git-send-email-apinski@cavium.com> In-Reply-To: <1472715400-43043-1-git-send-email-apinski@cavium.com> References: <1472516750-30743-1-git-send-email-apinski@cavium.com> <1472715400-43043-1-git-send-email-apinski@cavium.com> For AARCH64 ILP32, we reject compatibility too early on to support gdb ILP32. This patch moves ILP32 rejection from compatible to elfNN_aarch64_merge_private_bfd_data which allows aarch64 and aarch64:ilp32 to be handled correctly with gdb. An added bonus is that we can have an error message on why two object files are rejected. OK? Tested both binutils and gdb. Thanks, Andrew Pinski 2016-08-31 Andrew Pinski * cpu-aarch64.c (compatible): Don't reject different mach or ILP32 here. * elfnn-aarch64.c (elfNN_aarch64_merge_private_bfd_data): Add an error message on why endianess is rejected. Reject different ILP32/LP64 settings. Signed-off-by: Andrew Pinski --- bfd/ChangeLog | 8 ++++++++ bfd/cpu-aarch64.c | 28 +++------------------------- bfd/elfnn-aarch64.c | 17 ++++++++++++++++- 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 59dfb2c..77b2b6b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2016-08-31 Andrew Pinski + + * cpu-aarch64.c (compatible): + Don't reject different mach or ILP32 here. + * elfnn-aarch64.c (elfNN_aarch64_merge_private_bfd_data): + Add an error message on why endianess is rejected. + Reject different ILP32/LP64 settings. + 2016-08-31 Alan Modra * elf64-ppc.c (group_sections): Delete stub14_group_size. Instead, diff --git a/bfd/cpu-aarch64.c b/bfd/cpu-aarch64.c index 596d241..6fb9133 100644 --- a/bfd/cpu-aarch64.c +++ b/bfd/cpu-aarch64.c @@ -34,31 +34,9 @@ compatible (const bfd_arch_info_type * a, const bfd_arch_info_type * b) if (a->arch != b->arch) return NULL; - /* If a & b are for the same machine then all is well. */ - if (a->mach == b->mach) - return a; - - /* Don't allow mixing ilp32 with lp64. */ - if ((a->mach & bfd_mach_aarch64_ilp32) != (b->mach & bfd_mach_aarch64_ilp32)) - return NULL; - - /* Otherwise if either a or b is the 'default' machine - then it can be polymorphed into the other. */ - if (a->the_default) - return b; - - if (b->the_default) - return a; - - /* So far all newer cores are - supersets of previous cores. */ - if (a->mach < b->mach) - return b; - else if (a->mach > b->mach) - return a; - - /* Never reached! */ - return NULL; + /* Machine compatibility is checked in + elfNN_aarch64_merge_private_bfd_data. */ + return a; } static struct diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 3435a3d..1e27501 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -6530,11 +6530,26 @@ elfNN_aarch64_merge_private_bfd_data (bfd *ibfd, bfd *obfd) /* Check if we have the same endianess. */ if (!_bfd_generic_verify_endian_match (ibfd, obfd)) - return FALSE; + { + (*_bfd_error_handler) + (_("%B: endianness incompatible with that of the selected emulation"), + ibfd); + return FALSE; + } if (!is_aarch64_elf (ibfd) || !is_aarch64_elf (obfd)) return TRUE; + /* Don't allow mixing ilp32 with lp64. */ + if ((bfd_get_arch_info (ibfd)->mach & bfd_mach_aarch64_ilp32) + != (bfd_get_arch_info (obfd)->mach & bfd_mach_aarch64_ilp32)) + { + (*_bfd_error_handler) + (_("%B: ABI is incompatible with that of the selected emulation: \"%s\" != \"%s\""), + ibfd, bfd_get_target (ibfd), bfd_get_target (obfd)); + return FALSE; + } + /* The input BFD must have had its flags initialised. */ /* The following seems bogus to me -- The flags are initialized in the assembler but I don't think an elf_flags_init field is