[Ada] Better handling of dynamic types in ada_value_primitive_packed_val
[deliverable/binutils-gdb.git] / gdb / mn10300-linux-tdep.c
index f9bcbf98dddad674c4f2c307fc73ae98f5fa733e..7a6d7793cbceee74bc76770ee5d455478bd569d4 100644 (file)
@@ -1,7 +1,6 @@
 /* Target-dependent code for the Matsushita MN10300 for GDB, the GNU debugger.
 
-   Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008
-   Free Software Foundation, Inc.
+   Copyright (C) 2003-2015 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 
 #include "defs.h"
 #include "gdbcore.h"
-#include "gdb_string.h"
 #include "regcache.h"
 #include "mn10300-tdep.h"
-#include "gdb_assert.h"
 #include "bfd.h"
 #include "elf-bfd.h"
 #include "osabi.h"
@@ -32,8 +29,7 @@
 #include "frame.h"
 #include "trad-frame.h"
 #include "tramp-frame.h"
-
-#include <stdlib.h>
+#include "linux-tdep.h"
 
 /* Transliterated from <asm-mn10300/elf.h>...  */
 #define MN10300_ELF_NGREG 28
@@ -82,7 +78,7 @@ typedef struct
    Given a section name and size, create a struct reg object
    with a supply_register and a collect_register method.  */
 
-/* Copy register value of REGNUM from regset to regcache.  
+/* Copy register value of REGNUM from regset to regcache.
    If REGNUM is -1, do this for all gp registers in regset.  */
 
 static void
@@ -94,7 +90,7 @@ am33_supply_gregset_method (const struct regset *regset,
   const mn10300_elf_greg_t *regp = (const mn10300_elf_greg_t *) gregs;
   int i;
 
-  gdb_assert (len == sizeof (mn10300_elf_gregset_t));
+  gdb_assert (len >= sizeof (mn10300_elf_gregset_t));
 
   switch (regnum) {
   case E_D0_REGNUM:
@@ -239,17 +235,18 @@ am33_supply_gregset_method (const struct regset *regset,
   return;
 }
 
-/* Copy fp register value of REGNUM from regset to regcache.  
-   If REGNUM is -1, do this for all fp registers in regset. */
+/* Copy fp register value of REGNUM from regset to regcache.
+   If REGNUM is -1, do this for all fp registers in regset.  */
 
 static void
 am33_supply_fpregset_method (const struct regset *regset, 
                             struct regcache *regcache, 
                             int regnum, const void *fpregs, size_t len)
 {
-  const mn10300_elf_fpregset_t *fpregset = fpregs;
+  const mn10300_elf_fpregset_t *fpregset
+    = (const mn10300_elf_fpregset_t *) fpregs;
 
-  gdb_assert (len == sizeof (mn10300_elf_fpregset_t));
+  gdb_assert (len >= sizeof (mn10300_elf_fpregset_t));
 
   if (regnum == -1)
     {
@@ -264,7 +261,8 @@ am33_supply_fpregset_method (const struct regset *regset,
   else if (regnum == E_FPCR_REGNUM)
     regcache_raw_supply (regcache, E_FPCR_REGNUM, 
                         &fpregset->fpcr);
-  else if (E_FS0_REGNUM <= regnum && regnum < E_FS0_REGNUM + MN10300_ELF_NFPREG)
+  else if (E_FS0_REGNUM <= regnum
+          && regnum < E_FS0_REGNUM + MN10300_ELF_NFPREG)
     regcache_raw_supply (regcache, regnum, 
                         &fpregset->fpregs[regnum - E_FS0_REGNUM]);
 
@@ -278,10 +276,10 @@ am33_collect_gregset_method (const struct regset *regset,
                             const struct regcache *regcache, 
                             int regnum, void *gregs, size_t len)
 {
-  mn10300_elf_gregset_t *regp = gregs;
+  mn10300_elf_gregset_t *regp = (gdb_byte (*)[28][4]) gregs;
   int i;
 
-  gdb_assert (len == sizeof (mn10300_elf_gregset_t));
+  gdb_assert (len >= sizeof (mn10300_elf_gregset_t));
 
   switch (regnum) {
   case E_D0_REGNUM:
@@ -426,9 +424,9 @@ am33_collect_fpregset_method (const struct regset *regset,
                              const struct regcache *regcache, 
                              int regnum, void *fpregs, size_t len)
 {
-  mn10300_elf_fpregset_t *fpregset = fpregs;
+  mn10300_elf_fpregset_t *fpregset = (mn10300_elf_fpregset_t *) fpregs;
 
-  gdb_assert (len == sizeof (mn10300_elf_fpregset_t));
+  gdb_assert (len >= sizeof (mn10300_elf_fpregset_t));
 
   if (regnum == -1)
     {
@@ -450,29 +448,33 @@ am33_collect_fpregset_method (const struct regset *regset,
   return;
 }
 
-/* Create a struct regset from a corefile register section.  */
+static const struct regset am33_gregset =
+  {
+    NULL, am33_supply_gregset_method, am33_collect_gregset_method
+  };
 
-static const struct regset *
-am33_regset_from_core_section (struct gdbarch *gdbarch, 
-                              const char *sect_name, 
-                              size_t sect_size)
-{
-  /* We will call regset_alloc, and pass the names of the supply and
-     collect methods.  */
+static const struct regset am33_fpregset =
+  {
+    NULL, am33_supply_fpregset_method, am33_collect_fpregset_method
+  };
 
-  if (sect_size == sizeof (mn10300_elf_fpregset_t))
-    return regset_alloc (gdbarch, 
-                        am33_supply_fpregset_method,
-                        am33_collect_fpregset_method);
-  else
-    return regset_alloc (gdbarch, 
-                        am33_supply_gregset_method,
-                        am33_collect_gregset_method);
+/* Iterate over core file register note sections.  */
+
+static void
+am33_iterate_over_regset_sections (struct gdbarch *gdbarch,
+                                  iterate_over_regset_sections_cb *cb,
+                                  void *cb_data,
+                                  const struct regcache *regcache)
+{
+  cb (".reg", sizeof (mn10300_elf_gregset_t), &am33_gregset,
+      NULL, cb_data);
+  cb (".reg2", sizeof(mn10300_elf_fpregset_t), &am33_fpregset,
+      NULL, cb_data);
 }
 \f
 static void
 am33_linux_sigframe_cache_init (const struct tramp_frame *self,
-                                struct frame_info *next_frame,
+                                struct frame_info *this_frame,
                                struct trad_frame_cache *this_cache,
                                CORE_ADDR func);
 
@@ -615,23 +617,23 @@ struct sigcontext {
 
 static void
 am33_linux_sigframe_cache_init (const struct tramp_frame *self,
-                                struct frame_info *next_frame,
+                                struct frame_info *this_frame,
                                struct trad_frame_cache *this_cache,
                                CORE_ADDR func)
 {
   CORE_ADDR sc_base, fpubase;
   int i;
 
-  sc_base = frame_unwind_register_unsigned (next_frame, E_SP_REGNUM);
+  sc_base = get_frame_register_unsigned (this_frame, E_SP_REGNUM);
   if (self == &am33_linux_sigframe)
     {
       sc_base += 8;
-      sc_base = get_frame_memory_unsigned (next_frame, sc_base, 4);
+      sc_base = get_frame_memory_unsigned (this_frame, sc_base, 4);
     }
   else
     {
       sc_base += 12;
-      sc_base = get_frame_memory_unsigned (next_frame, sc_base, 4);
+      sc_base = get_frame_memory_unsigned (this_frame, sc_base, 4);
       sc_base += 20;
     }
 
@@ -690,8 +692,9 @@ am33_linux_sigframe_cache_init (const struct tramp_frame *self,
   trad_frame_set_reg_addr (this_cache, E_PC_REGNUM,
                            sc_base + AM33_SIGCONTEXT_PC);
 
-  fpubase = get_frame_memory_unsigned (next_frame,
-                                       sc_base + AM33_SIGCONTEXT_FPUCONTEXT, 4);
+  fpubase = get_frame_memory_unsigned (this_frame,
+                                       sc_base + AM33_SIGCONTEXT_FPUCONTEXT,
+                                      4);
   if (fpubase)
     {
       for (i = 0; i < 32; i++)
@@ -709,10 +712,12 @@ am33_linux_sigframe_cache_init (const struct tramp_frame *self,
    Now's our chance to register our corefile handling.  */
 
 static void
-am33_linux_init_osabi (struct gdbarch_info gdbinfo, struct gdbarch *gdbarch)
+am33_linux_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  set_gdbarch_regset_from_core_section (gdbarch, 
-                                       am33_regset_from_core_section);
+  linux_init_abi (info, gdbarch);
+
+  set_gdbarch_iterate_over_regset_sections
+    (gdbarch, am33_iterate_over_regset_sections);
   set_solib_svr4_fetch_link_map_offsets
     (gdbarch, svr4_ilp32_fetch_link_map_offsets);
 
@@ -720,6 +725,9 @@ am33_linux_init_osabi (struct gdbarch_info gdbinfo, struct gdbarch *gdbarch)
   tramp_frame_prepend_unwinder (gdbarch, &am33_linux_rt_sigframe);
 }
 
+/* Provide a prototype to silence -Wmissing-prototypes.  */
+extern initialize_file_ftype _initialize_mn10300_linux_tdep;
+
 void
 _initialize_mn10300_linux_tdep (void)
 {
This page took 0.028006 seconds and 4 git commands to generate.