Home | History | Annotate | Line # | Download | only in gdb
      1   1.1  christos /* Traditional frame unwind support, for GDB the GNU Debugger.
      2   1.1  christos 
      3  1.11  christos    Copyright (C) 2003-2024 Free Software Foundation, Inc.
      4   1.1  christos 
      5   1.1  christos    This file is part of GDB.
      6   1.1  christos 
      7   1.1  christos    This program is free software; you can redistribute it and/or modify
      8   1.1  christos    it under the terms of the GNU General Public License as published by
      9   1.1  christos    the Free Software Foundation; either version 3 of the License, or
     10   1.1  christos    (at your option) any later version.
     11   1.1  christos 
     12   1.1  christos    This program is distributed in the hope that it will be useful,
     13   1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14   1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15   1.1  christos    GNU General Public License for more details.
     16   1.1  christos 
     17   1.1  christos    You should have received a copy of the GNU General Public License
     18   1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     19   1.1  christos 
     20  1.12  christos #ifndef GDB_TRAD_FRAME_H
     21  1.12  christos #define GDB_TRAD_FRAME_H
     22   1.1  christos 
     23  1.11  christos #include "frame.h"
     24   1.1  christos 
     25  1.10  christos class frame_info_ptr;
     26   1.8  christos struct regcache_map_entry;
     27   1.1  christos struct trad_frame_cache;
     28   1.1  christos 
     29   1.1  christos /* A simple, or traditional frame cache.
     30   1.1  christos 
     31   1.1  christos    The entire cache is populated in a single pass and then generic
     32   1.1  christos    routines are used to extract the various cache values.  */
     33   1.1  christos 
     34  1.11  christos struct trad_frame_cache *trad_frame_cache_zalloc (const frame_info_ptr &);
     35   1.1  christos 
     36   1.1  christos /* This frame's ID.  */
     37   1.1  christos void trad_frame_set_id (struct trad_frame_cache *this_trad_cache,
     38   1.1  christos 			struct frame_id this_id);
     39   1.1  christos void trad_frame_get_id (struct trad_frame_cache *this_trad_cache,
     40   1.1  christos 			struct frame_id *this_id);
     41   1.1  christos void trad_frame_set_this_base (struct trad_frame_cache *this_trad_cache,
     42   1.1  christos 			       CORE_ADDR this_base);
     43   1.1  christos CORE_ADDR trad_frame_get_this_base (struct trad_frame_cache *this_trad_cache);
     44   1.1  christos 
     45   1.1  christos void trad_frame_set_reg_realreg (struct trad_frame_cache *this_trad_cache,
     46   1.1  christos 				 int regnum, int realreg);
     47   1.1  christos void trad_frame_set_reg_addr (struct trad_frame_cache *this_trad_cache,
     48   1.1  christos 			      int regnum, CORE_ADDR addr);
     49   1.8  christos void trad_frame_set_reg_regmap (struct trad_frame_cache *this_trad_cache,
     50   1.8  christos 				const struct regcache_map_entry *regmap,
     51   1.8  christos 				CORE_ADDR addr, size_t size);
     52   1.1  christos void trad_frame_set_reg_value (struct trad_frame_cache *this_cache,
     53   1.1  christos 			       int regnum, LONGEST val);
     54   1.1  christos 
     55  1.10  christos /* Given the cache in THIS_TRAD_CACHE, set the value of REGNUM to the bytes
     56  1.10  christos    contained in BYTES with size SIZE.  */
     57  1.10  christos void trad_frame_set_reg_value_bytes (struct trad_frame_cache *this_trad_cache,
     58  1.10  christos 				     int regnum,
     59  1.10  christos 				     gdb::array_view<const gdb_byte> bytes);
     60  1.10  christos 
     61   1.1  christos struct value *trad_frame_get_register (struct trad_frame_cache *this_trad_cache,
     62  1.11  christos 				       const frame_info_ptr &this_frame,
     63   1.1  christos 				       int regnum);
     64   1.1  christos 
     65  1.10  christos /* Describes the kind of encoding a stored register has.  */
     66  1.10  christos enum class trad_frame_saved_reg_kind
     67  1.10  christos {
     68  1.10  christos   /* Register value is unknown.  */
     69  1.10  christos   UNKNOWN = 0,
     70  1.10  christos   /* Register value is a constant.  */
     71  1.10  christos   VALUE,
     72  1.10  christos   /* Register value is in another register.  */
     73  1.10  christos   REALREG,
     74  1.10  christos   /* Register value is at an address.  */
     75  1.10  christos   ADDR,
     76  1.10  christos   /* Register value is a sequence of bytes.  */
     77  1.10  christos   VALUE_BYTES
     78  1.10  christos };
     79   1.1  christos 
     80  1.10  christos /* A struct that describes a saved register in a frame.  */
     81   1.1  christos 
     82   1.1  christos struct trad_frame_saved_reg
     83   1.1  christos {
     84  1.10  christos   /* Setters */
     85  1.10  christos 
     86  1.10  christos   /* Encode that the saved register's value is constant VAL in the
     87  1.10  christos      trad-frame.  */
     88  1.10  christos   void set_value (LONGEST val)
     89  1.10  christos   {
     90  1.10  christos     m_kind = trad_frame_saved_reg_kind::VALUE;
     91  1.10  christos     m_reg.value = val;
     92  1.10  christos   }
     93  1.10  christos 
     94  1.10  christos   /* Encode that the saved register's value is stored in register REALREG.  */
     95  1.10  christos   void set_realreg (int realreg)
     96  1.10  christos   {
     97  1.10  christos     m_kind = trad_frame_saved_reg_kind::REALREG;
     98  1.10  christos     m_reg.realreg = realreg;
     99  1.10  christos   }
    100  1.10  christos 
    101  1.10  christos   /* Encode that the saved register's value is stored in memory at ADDR.  */
    102  1.10  christos   void set_addr (LONGEST addr)
    103  1.10  christos   {
    104  1.10  christos     m_kind = trad_frame_saved_reg_kind::ADDR;
    105  1.10  christos     m_reg.addr = addr;
    106  1.10  christos   }
    107  1.10  christos 
    108  1.10  christos   /* Encode that the saved register's value is unknown.  */
    109  1.10  christos   void set_unknown ()
    110  1.10  christos   {
    111  1.10  christos     m_kind = trad_frame_saved_reg_kind::UNKNOWN;
    112  1.10  christos   }
    113  1.10  christos 
    114  1.10  christos   /* Encode that the saved register's value is stored as a sequence of bytes.
    115  1.10  christos      This is useful when the value is larger than what primitive types
    116  1.10  christos      can hold.  */
    117  1.10  christos   void set_value_bytes (gdb::array_view<const gdb_byte> bytes)
    118  1.10  christos   {
    119  1.10  christos     /* Allocate the space and copy the data bytes.  */
    120  1.10  christos     gdb_byte *data = FRAME_OBSTACK_CALLOC (bytes.size (), gdb_byte);
    121  1.10  christos     memcpy (data, bytes.data (), bytes.size ());
    122  1.10  christos 
    123  1.10  christos     m_kind = trad_frame_saved_reg_kind::VALUE_BYTES;
    124  1.10  christos     m_reg.value_bytes = data;
    125  1.10  christos   }
    126  1.10  christos 
    127  1.10  christos   /* Getters */
    128  1.10  christos 
    129  1.10  christos   LONGEST value () const
    130  1.10  christos   {
    131  1.10  christos     gdb_assert (m_kind == trad_frame_saved_reg_kind::VALUE);
    132  1.10  christos     return m_reg.value;
    133  1.10  christos   }
    134  1.10  christos 
    135  1.10  christos   int realreg () const
    136  1.10  christos   {
    137  1.10  christos     gdb_assert (m_kind == trad_frame_saved_reg_kind::REALREG);
    138  1.10  christos     return m_reg.realreg;
    139  1.10  christos   }
    140  1.10  christos 
    141  1.10  christos   LONGEST addr () const
    142  1.10  christos   {
    143  1.10  christos     gdb_assert (m_kind == trad_frame_saved_reg_kind::ADDR);
    144  1.10  christos     return m_reg.addr;
    145  1.10  christos   }
    146  1.10  christos 
    147  1.10  christos   const gdb_byte *value_bytes () const
    148  1.10  christos   {
    149  1.10  christos     gdb_assert (m_kind == trad_frame_saved_reg_kind::VALUE_BYTES);
    150  1.10  christos     return m_reg.value_bytes;
    151  1.10  christos   }
    152  1.10  christos 
    153  1.10  christos   /* Convenience functions, return true if the register has been
    154  1.10  christos      encoded as specified.  Return false otherwise.  */
    155  1.10  christos   bool is_value () const
    156  1.10  christos   {
    157  1.10  christos     return m_kind == trad_frame_saved_reg_kind::VALUE;
    158  1.10  christos   }
    159  1.10  christos 
    160  1.10  christos   bool is_realreg () const
    161  1.10  christos   {
    162  1.10  christos     return m_kind == trad_frame_saved_reg_kind::REALREG;
    163  1.10  christos   }
    164  1.10  christos 
    165  1.10  christos   bool is_addr () const
    166  1.10  christos   {
    167  1.10  christos     return m_kind == trad_frame_saved_reg_kind::ADDR;
    168  1.10  christos   }
    169  1.10  christos 
    170  1.10  christos   bool is_unknown () const
    171  1.10  christos   {
    172  1.10  christos     return m_kind == trad_frame_saved_reg_kind::UNKNOWN;
    173  1.10  christos   }
    174  1.10  christos 
    175  1.10  christos   bool is_value_bytes () const
    176  1.10  christos   {
    177  1.10  christos     return m_kind == trad_frame_saved_reg_kind::VALUE_BYTES;
    178  1.10  christos   }
    179  1.10  christos 
    180  1.10  christos private:
    181  1.10  christos 
    182  1.10  christos   trad_frame_saved_reg_kind m_kind;
    183  1.10  christos 
    184  1.10  christos   union {
    185  1.10  christos     LONGEST value;
    186  1.10  christos     int realreg;
    187  1.10  christos     LONGEST addr;
    188  1.10  christos     const gdb_byte *value_bytes;
    189  1.10  christos   } m_reg;
    190   1.1  christos };
    191   1.1  christos 
    192  1.10  christos /* Reset the saved regs cache, setting register values to REALREG.  */
    193   1.9  christos void trad_frame_reset_saved_regs (struct gdbarch *gdbarch,
    194  1.10  christos 				  trad_frame_saved_reg *regs);
    195   1.1  christos 
    196   1.1  christos /* Return a freshly allocated (and initialized) trad_frame array.  */
    197  1.11  christos trad_frame_saved_reg *trad_frame_alloc_saved_regs (const frame_info_ptr &);
    198  1.10  christos trad_frame_saved_reg *trad_frame_alloc_saved_regs (struct gdbarch *);
    199   1.1  christos 
    200   1.1  christos /* Given the trad_frame info, return the location of the specified
    201   1.1  christos    register.  */
    202  1.11  christos struct value *trad_frame_get_prev_register (const frame_info_ptr &this_frame,
    203  1.10  christos 					    trad_frame_saved_reg this_saved_regs[],
    204   1.1  christos 					    int regnum);
    205   1.1  christos 
    206  1.12  christos #endif /* GDB_TRAD_FRAME_H */
    207