ubsan: m10300: shift exponent -4
[deliverable/binutils-gdb.git] / gdb / sparc-sol2-tdep.c
index 50434f695f7478a8091d76de49498775c429d979..a886449902dd46c63328b5921bbeca0e6fa0c6ec 100644 (file)
@@ -1,6 +1,6 @@
 /* Target-dependent code for Solaris SPARC.
 
-   Copyright (C) 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
+   Copyright (C) 2003-2020 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "objfiles.h"
 #include "osabi.h"
 #include "regcache.h"
+#include "regset.h"
 #include "target.h"
 #include "trad-frame.h"
 
-#include "gdb_assert.h"
-#include "gdb_string.h"
-
 #include "sol2-tdep.h"
 #include "sparc-tdep.h"
 #include "solib-svr4.h"
 
 /* From <sys/regset.h>.  */
-const struct sparc_gregset sparc32_sol2_gregset =
+const struct sparc_gregmap sparc32_sol2_gregmap =
 {
   32 * 4,                      /* %psr */
   33 * 4,                      /* %pc */
@@ -47,6 +45,58 @@ const struct sparc_gregset sparc32_sol2_gregset =
   1 * 4,                       /* %g1 */
   16 * 4,                      /* %l0 */
 };
+
+const struct sparc_fpregmap sparc32_sol2_fpregmap =
+{
+  0 * 4,                       /* %f0 */
+  33 * 4,                      /* %fsr */
+};
+
+static void
+sparc32_sol2_supply_core_gregset (const struct regset *regset,
+                                 struct regcache *regcache,
+                                 int regnum, const void *gregs, size_t len)
+{
+  sparc32_supply_gregset (&sparc32_sol2_gregmap, regcache, regnum, gregs);
+}
+
+static void
+sparc32_sol2_collect_core_gregset (const struct regset *regset,
+                                  const struct regcache *regcache,
+                                  int regnum, void *gregs, size_t len)
+{
+  sparc32_collect_gregset (&sparc32_sol2_gregmap, regcache, regnum, gregs);
+}
+
+static void
+sparc32_sol2_supply_core_fpregset (const struct regset *regset,
+                                  struct regcache *regcache,
+                                  int regnum, const void *fpregs, size_t len)
+{
+  sparc32_supply_fpregset (&sparc32_sol2_fpregmap, regcache, regnum, fpregs);
+}
+
+static void
+sparc32_sol2_collect_core_fpregset (const struct regset *regset,
+                                   const struct regcache *regcache,
+                                   int regnum, void *fpregs, size_t len)
+{
+  sparc32_collect_fpregset (&sparc32_sol2_fpregmap, regcache, regnum, fpregs);
+}
+
+static const struct regset sparc32_sol2_gregset =
+  {
+    NULL,
+    sparc32_sol2_supply_core_gregset,
+    sparc32_sol2_collect_core_gregset
+  };
+
+static const struct regset sparc32_sol2_fpregset =
+  {
+    NULL,
+    sparc32_sol2_supply_core_fpregset,
+    sparc32_sol2_collect_core_fpregset
+  };
 \f
 
 /* The Solaris signal trampolines reside in libc.  For normal signals,
@@ -56,7 +106,7 @@ const struct sparc_gregset sparc32_sol2_gregset =
    `ucontext_t', which has a member `uc_mcontext' that contains the
    saved registers.  Incidentally, the kernel passes the `ucontext_t'
    pointer as the third argument of the signal trampoline too, and
-   `sigacthandler' simply passes it on. However, if you link your
+   `sigacthandler' simply passes it on.  However, if you link your
    program with "-L/usr/ucblib -R/usr/ucblib -lucb", the function
    `ucbsigvechandler' will be used, which invokes the using the BSD
    convention, where the third argument is a pointer to an instance of
@@ -66,7 +116,7 @@ const struct sparc_gregset sparc32_sol2_gregset =
    ignore this.  */
 
 int
-sparc_sol2_pc_in_sigtramp (CORE_ADDR pc, char *name)
+sparc_sol2_pc_in_sigtramp (CORE_ADDR pc, const char *name)
 {
   return (name && (strcmp (name, "sigacthandler") == 0
                   || strcmp (name, "ucbsigvechandler") == 0
@@ -74,7 +124,7 @@ sparc_sol2_pc_in_sigtramp (CORE_ADDR pc, char *name)
 }
 
 static struct sparc_frame_cache *
-sparc32_sol2_sigtramp_frame_cache (struct frame_info *next_frame,
+sparc32_sol2_sigtramp_frame_cache (struct frame_info *this_frame,
                                   void **this_cache)
 {
   struct sparc_frame_cache *cache;
@@ -82,18 +132,19 @@ sparc32_sol2_sigtramp_frame_cache (struct frame_info *next_frame,
   int regnum;
 
   if (*this_cache)
-    return *this_cache;
+    return (struct sparc_frame_cache *) *this_cache;
 
-  cache = sparc_frame_cache (next_frame, this_cache);
+  cache = sparc_frame_cache (this_frame, this_cache);
   gdb_assert (cache == *this_cache);
 
-  cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
+  cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
 
   /* The third argument is a pointer to an instance of `ucontext_t',
      which has a member `uc_mcontext' that contains the saved
      registers.  */
-  regnum = (cache->frameless_p ? SPARC_O2_REGNUM : SPARC_I2_REGNUM);
-  mcontext_addr = frame_unwind_register_unsigned (next_frame, regnum) + 40;
+  regnum =
+    (cache->copied_regs_mask & 0x04) ? SPARC_I2_REGNUM : SPARC_O2_REGNUM;
+  mcontext_addr = get_frame_register_unsigned (this_frame, regnum) + 40;
 
   cache->saved_regs[SPARC32_PSR_REGNUM].addr = mcontext_addr + 0 * 4;
   cache->saved_regs[SPARC32_PC_REGNUM].addr = mcontext_addr + 1 * 4;
@@ -105,7 +156,7 @@ sparc32_sol2_sigtramp_frame_cache (struct frame_info *next_frame,
        regnum <= SPARC_O7_REGNUM; regnum++, addr += 4)
     cache->saved_regs[regnum].addr = addr;
 
-  if (get_frame_memory_unsigned (next_frame, mcontext_addr + 19 * 4, 4))
+  if (get_frame_memory_unsigned (this_frame, mcontext_addr + 19 * 4, 4))
     {
       /* The register windows haven't been flushed.  */
       for (regnum = SPARC_L0_REGNUM; regnum <= SPARC_I7_REGNUM; regnum++)
@@ -114,7 +165,7 @@ sparc32_sol2_sigtramp_frame_cache (struct frame_info *next_frame,
   else
     {
       addr = cache->saved_regs[SPARC_SP_REGNUM].addr;
-      addr = get_frame_memory_unsigned (next_frame, addr, 4);
+      addr = get_frame_memory_unsigned (this_frame, addr, 4);
       for (regnum = SPARC_L0_REGNUM;
           regnum <= SPARC_I7_REGNUM; regnum++, addr += 4)
        cache->saved_regs[regnum].addr = addr;
@@ -124,55 +175,56 @@ sparc32_sol2_sigtramp_frame_cache (struct frame_info *next_frame,
 }
 
 static void
-sparc32_sol2_sigtramp_frame_this_id (struct frame_info *next_frame,
+sparc32_sol2_sigtramp_frame_this_id (struct frame_info *this_frame,
                                     void **this_cache,
                                     struct frame_id *this_id)
 {
   struct sparc_frame_cache *cache =
-    sparc32_sol2_sigtramp_frame_cache (next_frame, this_cache);
+    sparc32_sol2_sigtramp_frame_cache (this_frame, this_cache);
 
   (*this_id) = frame_id_build (cache->base, cache->pc);
 }
 
-static void
-sparc32_sol2_sigtramp_frame_prev_register (struct frame_info *next_frame,
+static struct value *
+sparc32_sol2_sigtramp_frame_prev_register (struct frame_info *this_frame,
                                           void **this_cache,
-                                          int regnum, int *optimizedp,
-                                          enum lval_type *lvalp,
-                                          CORE_ADDR *addrp,
-                                          int *realnump, gdb_byte *valuep)
+                                          int regnum)
 {
   struct sparc_frame_cache *cache =
-    sparc32_sol2_sigtramp_frame_cache (next_frame, this_cache);
+    sparc32_sol2_sigtramp_frame_cache (this_frame, this_cache);
 
-  trad_frame_get_prev_register (next_frame, cache->saved_regs, regnum,
-                               optimizedp, lvalp, addrp, realnump, valuep);
+  return trad_frame_get_prev_register (this_frame, cache->saved_regs, regnum);
 }
 
-static const struct frame_unwind sparc32_sol2_sigtramp_frame_unwind =
-{
-  SIGTRAMP_FRAME,
-  sparc32_sol2_sigtramp_frame_this_id,
-  sparc32_sol2_sigtramp_frame_prev_register
-};
-
-static const struct frame_unwind *
-sparc32_sol2_sigtramp_frame_sniffer (struct frame_info *next_frame)
+static int
+sparc32_sol2_sigtramp_frame_sniffer (const struct frame_unwind *self,
+                                    struct frame_info *this_frame,
+                                    void **this_cache)
 {
-  CORE_ADDR pc = frame_pc_unwind (next_frame);
-  char *name;
+  CORE_ADDR pc = get_frame_pc (this_frame);
+  const char *name;
 
   find_pc_partial_function (pc, &name, NULL, NULL);
   if (sparc_sol2_pc_in_sigtramp (pc, name))
-    return &sparc32_sol2_sigtramp_frame_unwind;
+    return 1;
 
-  return NULL;
+  return 0;
 }
 
+static const struct frame_unwind sparc32_sol2_sigtramp_frame_unwind =
+{
+  SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
+  sparc32_sol2_sigtramp_frame_this_id,
+  sparc32_sol2_sigtramp_frame_prev_register,
+  NULL,
+  sparc32_sol2_sigtramp_frame_sniffer
+};
+
 /* Unglobalize NAME.  */
 
-char *
-sparc_sol2_static_transform_name (char *name)
+const char *
+sparc_sol2_static_transform_name (const char *name)
 {
   /* The Sun compilers (Sun ONE Studio, Forte Developer, Sun WorkShop,
      SunPRO) convert file static variables into global values, a
@@ -182,17 +234,17 @@ sparc_sol2_static_transform_name (char *name)
      globalization prefix is followed by the function name (nested
      static variables within a function are supposed to generate a
      warning message, and are left alone).  The procedure is
-     documented in the Stabs Interface Manual, which is distrubuted
+     documented in the Stabs Interface Manual, which is distributed
      with the compilers, although version 4.0 of the manual seems to
      be incorrect in some places, at least for SPARC.  The
      globalization prefix is encoded into an N_OPT stab, with the form
      "G=<prefix>".  The globalization prefix always seems to start
-     with a dollar sign '$'; a dot '.' is used as a seperator.  So we
+     with a dollar sign '$'; a dot '.' is used as a separator.  So we
      simply strip everything up until the last dot.  */
 
   if (name[0] == '$')
     {
-      char *p = strrchr (name, '.');
+      const char *p = strrchr (name, '.');
       if (p)
         return p + 1;
     }
@@ -206,6 +258,12 @@ sparc32_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
+  tdep->gregset = &sparc32_sol2_gregset;
+  tdep->sizeof_gregset = 152;
+
+  tdep->fpregset = &sparc32_sol2_fpregset;
+  tdep->sizeof_fpregset = 400;
+
   /* The Sun compilers (Sun ONE Studio, Forte Developer, Sun WorkShop, SunPRO)
      compiler puts out 0 instead of the address in N_SO stabs.  Starting with
      SunPRO 3.0, the compiler does this for N_FUN stabs too.  */
@@ -229,12 +287,11 @@ sparc32_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   /* Solaris has kernel-assisted single-stepping support.  */
   set_gdbarch_software_single_step (gdbarch, NULL);
 
-  frame_unwind_append_sniffer (gdbarch, sparc32_sol2_sigtramp_frame_sniffer);
-}
-\f
+  frame_unwind_append_unwinder (gdbarch, &sparc32_sol2_sigtramp_frame_unwind);
 
-/* Provide a prototype to silence -Wmissing-prototypes.  */
-void _initialize_sparc_sol2_tdep (void);
+  /* How to print LWP PTIDs from core files.  */
+  set_gdbarch_core_pid_to_str (gdbarch, sol2_core_pid_to_str);
+}
 
 void
 _initialize_sparc_sol2_tdep (void)
This page took 0.027227 seconds and 4 git commands to generate.