From: Andrew Pinski Date: Mon, 7 Sep 2015 09:12:36 +0000 (+0800) Subject: 2015-09-07 Andrew Pinski X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=99f731e26984d3790911c59655d65ab1da13f5e7;p=thirdparty%2Fbinutils-gdb.git 2015-09-07 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 370980df77b..c60a4ac4a39 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2015-09-07 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. + 2015-09-04 Andrew Burgess * tui/tui-data.c (win_with_focus): Remove cast of NULL pointer. diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c index f8cf43e26da..7702581cda8 100644 --- a/gdb/aarch64-linux-tdep.c +++ b/gdb/aarch64-linux-tdep.c @@ -952,8 +952,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 9a44446fd31..570670a6327 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -2705,6 +2705,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)) @@ -2754,6 +2755,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; @@ -2762,6 +2768,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; } @@ -2780,6 +2789,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); @@ -2819,9 +2829,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 af209a95acc..5e558f41dbe 100644 --- a/gdb/aarch64-tdep.h +++ b/gdb/aarch64-tdep.h @@ -91,6 +91,10 @@ struct gdbarch_tdep /* syscall record. */ int (*aarch64_syscall_record) (struct regcache *regcache, unsigned long svc_number); + + /* If this is ILP32 or LP64. */ + char ilp32; + }; extern struct target_desc *tdesc_aarch64;