From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 68093 invoked by alias); 30 Aug 2016 00:26:12 -0000 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 Received: (qmail 68006 invoked by uid 89); 30 Aug 2016 00:26:09 -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=Hx-languages-length:4445 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; Tue, 30 Aug 2016 00:26:00 +0000 Received: from apinski-ss1.caveonetworks.com ([10.18.106.6]) by camailhost.cavium.com (8.14.7/8.14.7) with ESMTP id u7U0PtPF029804; Mon, 29 Aug 2016 17:25:56 -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 u7U0Pti4030799; Mon, 29 Aug 2016 17:25:55 -0700 Received: (from apinski@localhost) by apinski-ss1.caveonetworks.com (8.15.2/8.15.2/Submit) id u7U0PtYS030798; Mon, 29 Aug 2016 17:25:55 -0700 From: Andrew Pinski To: gdb-patches@sourceware.org, binutils@sourceware.org Cc: Andrew Pinski Subject: [PATCH 2/3] Add ILP32 support to gdb. Date: Tue, 30 Aug 2016 00:26:00 -0000 Message-Id: <1472516750-30743-3-git-send-email-apinski@cavium.com> In-Reply-To: <1472516750-30743-1-git-send-email-apinski@cavium.com> References: <1472516750-30743-1-git-send-email-apinski@cavium.com> X-SW-Source: 2016-08/txt/msg00293.txt.bz2 This patch adds AARCH64:ilp32 support to gdb and sets up the correct sizes for some types like pointers and long. Also sets up the correct linker map offsets for Linux. OK? Thanks, Andrew Pinski 2016-08-29 Andrew Pinski * aarch64-tdep.h (gdbarch_tdep): Add ilp32 field. * aarch64-tdep.c (aarch64_gdbarch_init): Setup ILP32 support. Make sure the gdbarches have compatible ilp32 flags. Set long and ptr sizes correctly for ilp32. * aarch64-linux-tdep.c (aarch64_linux_init_abi): Add support for ILP32. --- gdb/ChangeLog | 9 +++++++++ gdb/aarch64-linux-tdep.c | 8 ++++++-- gdb/aarch64-tdep.c | 14 ++++++++++++-- gdb/aarch64-tdep.h | 3 +++ 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7f580f0..cfaf3fd 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2015-08-29 Andrew Pinski + + * aarch64-tdep.h (gdbarch_tdep): Add ilp32 field. + * aarch64-tdep.c (aarch64_gdbarch_init): Setup ILP32 support. + Make sure the gdbarches have compatible ilp32 flags. + Set long and ptr sizes correctly for ilp32. + * aarch64-linux-tdep.c (aarch64_linux_init_abi): + Add support for ILP32. + 2016-08-25 Andreas Arnez * xtensa-tdep.h (XTENSA_GDBARCH_TDEP_INSTANTIATE): Replace diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c index cd220a6..43f959b 100644 --- a/gdb/aarch64-linux-tdep.c +++ b/gdb/aarch64-linux-tdep.c @@ -1000,8 +1000,12 @@ aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) linux_init_abi (info, gdbarch); - set_solib_svr4_fetch_link_map_offsets (gdbarch, - svr4_lp64_fetch_link_map_offsets); + if (tdep->ilp32) + set_solib_svr4_fetch_link_map_offsets (gdbarch, + svr4_ilp32_fetch_link_map_offsets); + else + set_solib_svr4_fetch_link_map_offsets (gdbarch, + svr4_lp64_fetch_link_map_offsets); /* Enable TLS support. */ set_gdbarch_fetch_tls_load_module_address (gdbarch, diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index 3b7e954..9c1a517 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -2646,6 +2646,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) const struct tdesc_feature *feature; int num_regs = 0; int num_pseudo_regs = 0; + char ilp32 = FALSE; /* Ensure we always have a target descriptor. */ if (!tdesc_has_registers (tdesc)) @@ -2695,6 +2696,11 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) return NULL; } + if (info.abfd + && bfd_get_flavour (info.abfd) == bfd_target_elf_flavour + && elf_elfheader (info.abfd)->e_ident[EI_CLASS] == ELFCLASS32) + ilp32 = TRUE; + /* AArch64 code is always little-endian. */ info.byte_order_for_code = BFD_ENDIAN_LITTLE; @@ -2703,6 +2709,9 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) best_arch != NULL; best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info)) { + /* ILP32 and LP64 are incompatible. */ + if (gdbarch_tdep (arches->gdbarch)->ilp32 != ilp32) + continue; /* Found a match. */ break; } @@ -2721,6 +2730,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) tdep->lowest_pc = 0x20; tdep->jb_pc = -1; /* Longjump support not enabled by default. */ tdep->jb_elt_size = 8; + tdep->ilp32 = ilp32; set_gdbarch_push_dummy_call (gdbarch, aarch64_push_dummy_call); set_gdbarch_frame_align (gdbarch, aarch64_frame_align); @@ -2760,9 +2770,9 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_float_bit (gdbarch, 32); set_gdbarch_double_bit (gdbarch, 64); set_gdbarch_long_double_bit (gdbarch, 128); - set_gdbarch_long_bit (gdbarch, 64); + set_gdbarch_long_bit (gdbarch, ilp32 ? 32 : 64); set_gdbarch_long_long_bit (gdbarch, 64); - set_gdbarch_ptr_bit (gdbarch, 64); + set_gdbarch_ptr_bit (gdbarch, ilp32 ? 32 : 64); set_gdbarch_char_signed (gdbarch, 0); set_gdbarch_float_format (gdbarch, floatformats_ieee_single); set_gdbarch_double_format (gdbarch, floatformats_ieee_double); diff --git a/gdb/aarch64-tdep.h b/gdb/aarch64-tdep.h index a95b613..7b1ce3e 100644 --- a/gdb/aarch64-tdep.h +++ b/gdb/aarch64-tdep.h @@ -95,6 +95,9 @@ struct gdbarch_tdep /* syscall record. */ int (*aarch64_syscall_record) (struct regcache *regcache, unsigned long svc_number); + /* If this is ILP32 or LP64. */ + bool ilp32; + }; extern struct target_desc *tdesc_aarch64; -- 2.7.4