]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
2015-09-07 Andrew Pinski <apinski@cavium.com>
authorAndrew Pinski <apinski@cavium.com>
Mon, 7 Sep 2015 09:12:36 +0000 (17:12 +0800)
committerAndrew Pinski <apinski@cavium.com>
Mon, 7 Sep 2015 09:12:36 +0000 (17:12 +0800)
* 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
gdb/aarch64-linux-tdep.c
gdb/aarch64-tdep.c
gdb/aarch64-tdep.h

index 370980df77bce829272eea9935330617fb589f0b..c60a4ac4a39efb14aaa84c9b4e48a6471893cc9b 100644 (file)
@@ -1,3 +1,12 @@
+2015-09-07  Andrew Pinski  <apinski@cavium.com>
+
+       * 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  <andrew.burgess@embecosm.com>
 
        * tui/tui-data.c (win_with_focus): Remove cast of NULL pointer.
index f8cf43e26dac812931cf0f5bc166570b8cfa0403..7702581cda8acafd0e181d4c3920b185f73ef554 100644 (file)
@@ -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,
index 9a44446fd3130658f09c043b4ba228379eb2c9a6..570670a6327cf0ca409e405f5b6f5e810ad8c614 100644 (file)
@@ -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);
index af209a95accac8f31539c035b664ce39f140d221..5e558f41dbec9524dec7f898fc6b726bd85cbeec 100644 (file)
@@ -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;