public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Bruno Larsen <blarsen@redhat.com>
To: gdb-patches@sourceware.org
Subject: [PATCH v4 4/5] Continue making GDB use frame_info_ptr
Date: Tue, 30 Aug 2022 12:08:36 +0200	[thread overview]
Message-ID: <20220830100837.926692-5-blarsen@redhat.com> (raw)
In-Reply-To: <20220830100837.926692-1-blarsen@redhat.com>

This commit only exists to make my emails be smaller than 500Kb. It is
going to be squashed into the former commit.
---
 gdb/arm-tdep.c                      |   2 +-
 gdb/cli/cli-cmds.c                  |   2 +-
 gdb/compile/compile-c-symbols.c     |   2 +-
 gdb/compile/compile-cplus-symbols.c |   2 +-
 gdb/compile/compile-loc2c.c         |   2 +-
 gdb/dwarf2/expr.c                   |  20 +-
 gdb/dwarf2/expr.h                   |   6 +-
 gdb/dwarf2/frame-tailcall.c         |  41 ++--
 gdb/dwarf2/frame-tailcall.h         |   6 +-
 gdb/dwarf2/frame.c                  |  39 ++--
 gdb/dwarf2/frame.h                  |  12 +-
 gdb/dwarf2/loc.c                    |  38 ++--
 gdb/dwarf2/loc.h                    |   8 +-
 gdb/f-valprint.c                    |   2 +-
 gdb/findvar.c                       |  26 +--
 gdb/frame-base.c                    |   8 +-
 gdb/frame-base.h                    |  12 +-
 gdb/frame-unwind.c                  |  24 +--
 gdb/frame-unwind.h                  |  36 ++--
 gdb/frame.c                         | 290 ++++++++++++++--------------
 gdb/frame.h                         | 152 +++++++--------
 gdb/frv-linux-tdep.c                |  10 +-
 gdb/frv-tdep.c                      |  10 +-
 gdb/ft32-tdep.c                     |   8 +-
 gdb/guile/scm-frame.c               |   2 +-
 gdb/i386-bsd-tdep.c                 |   2 +-
 gdb/i386-darwin-tdep.c              |   4 +-
 gdb/i386-darwin-tdep.h              |   2 +-
 gdb/i386-fbsd-tdep.c                |   2 +-
 gdb/i386-gnu-tdep.c                 |   6 +-
 gdb/i386-linux-tdep.c               |  10 +-
 gdb/i386-netbsd-tdep.c              |   4 +-
 gdb/i386-nto-tdep.c                 |   4 +-
 gdb/i386-obsd-tdep.c                |  10 +-
 gdb/i386-sol2-tdep.c                |   2 +-
 gdb/i386-tdep.c                     |  54 +++---
 gdb/i386-tdep.h                     |  10 +-
 gdb/i386-windows-tdep.c             |   2 +-
 gdb/i387-tdep.c                     |   6 +-
 gdb/i387-tdep.h                     |   8 +-
 gdb/ia64-libunwind-tdep.c           |  12 +-
 gdb/ia64-libunwind-tdep.h           |  12 +-
 gdb/ia64-tdep.c                     |  50 ++---
 gdb/ia64-tdep.h                     |   4 +-
 gdb/infcall.c                       |   4 +-
 gdb/infcmd.c                        |  28 +--
 gdb/inferior.h                      |   6 +-
 gdb/infrun.c                        |  32 +--
 gdb/infrun.h                        |   4 +-
 gdb/inline-frame.c                  |  14 +-
 gdb/inline-frame.h                  |   4 +-
 gdb/iq2000-tdep.c                   |  10 +-
 gdb/mi/mi-cmd-stack.c               |  22 +--
 gdb/mi/mi-main.c                    |  10 +-
 gdb/python/py-event.h               |   2 +-
 gdb/python/py-finishbreakpoint.c    |   4 +-
 gdb/python/py-frame.c               |  42 ++--
 gdb/python/py-framefilter.c         |  22 +--
 gdb/python/py-inferior.c            |   2 +-
 gdb/python/py-infevents.c           |   4 +-
 gdb/python/py-symbol.c              |   6 +-
 gdb/python/py-unwind.c              |  12 +-
 gdb/python/python-internal.h        |   6 +-
 gdb/s12z-tdep.c                     |  10 +-
 gdb/s390-linux-tdep.c               |   8 +-
 gdb/s390-tdep.c                     |  38 ++--
 gdb/s390-tdep.h                     |   2 +-
 gdb/sentinel-frame.c                |   6 +-
 gdb/sh-linux-tdep.c                 |   6 +-
 gdb/sh-tdep.c                       |  16 +-
 gdb/skip.c                          |   2 +-
 gdb/sol2-tdep.c                     |   2 +-
 gdb/sol2-tdep.h                     |   2 +-
 gdb/solib-svr4.c                    |   4 +-
 gdb/sparc-linux-tdep.c              |   6 +-
 gdb/sparc-netbsd-tdep.c             |  12 +-
 gdb/sparc-obsd-tdep.c               |   8 +-
 gdb/sparc-sol2-tdep.c               |   8 +-
 gdb/sparc-tdep.c                    |  20 +-
 gdb/sparc-tdep.h                    |  12 +-
 gdb/sparc64-fbsd-tdep.c             |   8 +-
 gdb/sparc64-linux-tdep.c            |   8 +-
 gdb/sparc64-netbsd-tdep.c           |  10 +-
 gdb/sparc64-obsd-tdep.c             |  16 +-
 gdb/sparc64-sol2-tdep.c             |   8 +-
 gdb/sparc64-tdep.c                  |  10 +-
 gdb/sparc64-tdep.h                  |   4 +-
 gdb/stack.c                         | 104 +++++-----
 gdb/stack.h                         |   4 +-
 gdb/stap-probe.c                    |   4 +-
 gdb/std-regs.c                      |   8 +-
 gdb/symfile.h                       |   2 +-
 gdb/symtab.h                        |  10 +-
 gdb/tui/tui-disasm.c                |   2 +-
 gdb/tui/tui-disasm.h                |   2 +-
 gdb/tui/tui-hooks.c                 |   6 +-
 gdb/tui/tui-regs.c                  |   8 +-
 gdb/tui/tui-regs.h                  |   4 +-
 gdb/tui/tui-source.c                |   4 +-
 gdb/tui/tui-source.h                |   2 +-
 gdb/tui/tui-stack.c                 |   4 +-
 gdb/tui/tui-stack.h                 |   4 +-
 gdb/tui/tui-winsource.c             |   4 +-
 gdb/tui/tui-winsource.h             |   2 +-
 gdb/v850-tdep.c                     |  10 +-
 gdb/valops.c                        |  10 +-
 gdb/value.c                         |   4 +-
 gdb/value.h                         |  16 +-
 gdb/varobj.c                        |   8 +-
 gdb/vax-tdep.c                      |  14 +-
 110 files changed, 832 insertions(+), 828 deletions(-)

diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index f7fe19d13c0..23151331954 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -3876,7 +3876,7 @@ arm_dwarf2_prev_register (frame_info_ptr this_frame, void **this_cache,
       if (override_with_sp_value)
 	{
 	  /* Use value of SP from previous frame.  */
-	  struct frame_info *prev_frame = get_prev_frame (this_frame);
+	  frame_info_ptr prev_frame = get_prev_frame (this_frame);
 	  if (prev_frame)
 	    val = get_frame_register_unsigned (prev_frame, ARM_SP_REGNUM);
 	  else
diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
index 18fb6e6d869..fde648afa54 100644
--- a/gdb/cli/cli-cmds.c
+++ b/gdb/cli/cli-cmds.c
@@ -1466,7 +1466,7 @@ print_disassembly (struct gdbarch *gdbarch, const char *name,
 static void
 disassemble_current_function (gdb_disassembly_flags flags)
 {
-  struct frame_info *frame;
+  frame_info_ptr frame;
   struct gdbarch *gdbarch;
   CORE_ADDR low, high, pc;
   const char *name;
diff --git a/gdb/compile/compile-c-symbols.c b/gdb/compile/compile-c-symbols.c
index e1f94ec2907..f043ba751e6 100644
--- a/gdb/compile/compile-c-symbols.c
+++ b/gdb/compile/compile-c-symbols.c
@@ -144,7 +144,7 @@ convert_one_symbol (compile_c_instance *context,
 	     by their name.  */
 	  {
 	    struct value *val;
-	    struct frame_info *frame = NULL;
+	    frame_info_ptr frame = NULL;
 
 	    if (symbol_read_needs_frame (sym.symbol))
 	      {
diff --git a/gdb/compile/compile-cplus-symbols.c b/gdb/compile/compile-cplus-symbols.c
index ef2a1f57603..4d3f1602322 100644
--- a/gdb/compile/compile-cplus-symbols.c
+++ b/gdb/compile/compile-cplus-symbols.c
@@ -138,7 +138,7 @@ convert_one_symbol (compile_cplus_instance *instance,
 	     by their name.  */
 	  {
 	    struct value *val;
-	    struct frame_info *frame = nullptr;
+	    frame_info_ptr frame = nullptr;
 
 	    if (symbol_read_needs_frame (sym.symbol))
 	      {
diff --git a/gdb/compile/compile-loc2c.c b/gdb/compile/compile-loc2c.c
index 3ce0bfab45f..3864228ef37 100644
--- a/gdb/compile/compile-loc2c.c
+++ b/gdb/compile/compile-loc2c.c
@@ -633,7 +633,7 @@ do_compile_dwarf_expr_to_c (int indent, string_file *stream,
      offset by hand seemed too hackish.  */
   if (is_tls)
     {
-      struct frame_info *frame = get_selected_frame (NULL);
+      frame_info_ptr frame = get_selected_frame (NULL);
       struct value *val;
 
       if (frame == NULL)
diff --git a/gdb/dwarf2/expr.c b/gdb/dwarf2/expr.c
index 3549745df04..e16f3c2bcbb 100644
--- a/gdb/dwarf2/expr.c
+++ b/gdb/dwarf2/expr.c
@@ -49,7 +49,7 @@ static const registry<gdbarch>::key<dwarf_gdbarch_types> dwarf_arch_cookie;
 /* Ensure that a FRAME is defined, throw an exception otherwise.  */
 
 static void
-ensure_have_frame (frame_info *frame, const char *op_name)
+ensure_have_frame (frame_info_ptr frame, const char *op_name)
 {
   if (frame == nullptr)
     throw_error (GENERIC_ERROR,
@@ -78,7 +78,7 @@ bits_to_bytes (ULONGEST start, ULONGEST n_bits)
 /* See expr.h.  */
 
 CORE_ADDR
-read_addr_from_reg (frame_info *frame, int reg)
+read_addr_from_reg (frame_info_ptr frame, int reg)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
   int regnum = dwarf_reg_to_regnum_or_error (gdbarch, reg);
@@ -112,7 +112,7 @@ static piece_closure *
 allocate_piece_closure (dwarf2_per_cu_data *per_cu,
 			dwarf2_per_objfile *per_objfile,
 			std::vector<dwarf_expr_piece> &&pieces,
-			frame_info *frame)
+			frame_info_ptr frame)
 {
   piece_closure *c = new piece_closure;
 
@@ -208,7 +208,7 @@ rw_pieced_value (value *v, value *from, bool check_optimized)
 	{
 	case DWARF_VALUE_REGISTER:
 	  {
-	    frame_info *frame = frame_find_by_id (c->frame_id);
+	    frame_info_ptr frame = frame_find_by_id (c->frame_id);
 	    gdbarch *arch = get_frame_arch (frame);
 	    int gdb_regnum = dwarf_reg_to_regnum_or_error (arch, p->v.regno);
 	    ULONGEST reg_bits = 8 * register_size (arch, gdb_regnum);
@@ -550,7 +550,7 @@ indirect_pieced_value (value *value)
     }
 
   gdb_assert (piece != NULL && c->per_cu != nullptr);
-  frame_info *frame = get_selected_frame (_("No frame selected."));
+  frame_info_ptr frame = get_selected_frame (_("No frame selected."));
 
   /* This is an offset requested by GDB, such as value subscripts.
      However, due to how synthetic pointers are implemented, this is
@@ -585,7 +585,7 @@ coerce_pieced_ref (const value *value)
     {
       const piece_closure *closure
 	= (piece_closure *) value_computed_closure (value);
-      frame_info *frame
+      frame_info_ptr frame
 	= get_selected_frame (_("No frame selected."));
 
       /* gdb represents synthetic pointers as pieced values with a single
@@ -675,7 +675,7 @@ sect_variable_value (sect_offset sect_off,
     }
 
   struct type *type = lookup_pointer_type (die_type);
-  frame_info *frame = get_selected_frame (_("No frame selected."));
+  frame_info_ptr frame = get_selected_frame (_("No frame selected."));
   return indirect_synthetic_pointer (sect_off, 0, per_cu, per_objfile, frame,
 				     type, true);
 }
@@ -811,7 +811,7 @@ dwarf_expr_context::dwarf_call (cu_offset die_cu_off)
 {
   ensure_have_per_cu (this->m_per_cu, "DW_OP_call");
 
-  frame_info *frame = this->m_frame;
+  frame_info_ptr frame = this->m_frame;
 
   auto get_pc_from_frame = [frame] ()
     {
@@ -866,7 +866,7 @@ dwarf_expr_context::push_dwarf_reg_entry_value (call_site_parameter_kind kind,
 
   dwarf2_per_cu_data *caller_per_cu;
   dwarf2_per_objfile *caller_per_objfile;
-  frame_info *caller_frame = get_prev_frame (this->m_frame);
+  frame_info_ptr caller_frame = get_prev_frame (this->m_frame);
   call_site_parameter *parameter
     = dwarf_expr_reg_to_entry_parameter (this->m_frame, kind, kind_u,
 					 &caller_per_cu,
@@ -1065,7 +1065,7 @@ dwarf_expr_context::fetch_result (struct type *type, struct type *subobj_type,
 
 value *
 dwarf_expr_context::evaluate (const gdb_byte *addr, size_t len, bool as_lval,
-			      dwarf2_per_cu_data *per_cu, frame_info *frame,
+			      dwarf2_per_cu_data *per_cu, frame_info_ptr frame,
 			      const struct property_addr_info *addr_info,
 			      struct type *type, struct type *subobj_type,
 			      LONGEST subobj_offset)
diff --git a/gdb/dwarf2/expr.h b/gdb/dwarf2/expr.h
index 4ce9b734f77..6078dce0abc 100644
--- a/gdb/dwarf2/expr.h
+++ b/gdb/dwarf2/expr.h
@@ -137,7 +137,7 @@ struct dwarf_expr_context
      The ADDR_INFO property can be specified to override the range of
      memory addresses with the passed in buffer.  */
   value *evaluate (const gdb_byte *addr, size_t len, bool as_lval,
-		   dwarf2_per_cu_data *per_cu, frame_info *frame,
+		   dwarf2_per_cu_data *per_cu, frame_info_ptr frame,
 		   const struct property_addr_info *addr_info = nullptr,
 		   struct type *type = nullptr,
 		   struct type *subobj_type = nullptr,
@@ -196,7 +196,7 @@ struct dwarf_expr_context
   dwarf2_per_objfile *m_per_objfile;
 
   /* Frame information used for the evaluation.  */
-  frame_info *m_frame = nullptr;
+  frame_info_ptr m_frame = nullptr;
 
   /* Compilation unit used for the evaluation.  */
   dwarf2_per_cu_data *m_per_cu = nullptr;
@@ -256,7 +256,7 @@ struct dwarf_expr_context
 
 /* Return the value of register number REG (a DWARF register number),
    read as an address in a given FRAME.  */
-CORE_ADDR read_addr_from_reg (frame_info *frame, int reg);
+CORE_ADDR read_addr_from_reg (frame_info_ptr frame, int reg);
 
 void dwarf_expr_require_composition (const gdb_byte *, const gdb_byte *,
 				     const char *);
diff --git a/gdb/dwarf2/frame-tailcall.c b/gdb/dwarf2/frame-tailcall.c
index 7f30a0d3126..a1e43cc18ed 100644
--- a/gdb/dwarf2/frame-tailcall.c
+++ b/gdb/dwarf2/frame-tailcall.c
@@ -39,7 +39,7 @@ static htab_t cache_htab;
 struct tailcall_cache
 {
   /* It must be the first one of this struct.  It is the furthest callee.  */
-  struct frame_info *next_bottom_frame;
+  frame_info *next_bottom_frame;
 
   /* Reference count.  The whole chain of virtual tail call frames shares one
      tailcall_cache.  */
@@ -90,12 +90,12 @@ cache_eq (const void *arg1, const void *arg2)
    tailcall_cache.  */
 
 static struct tailcall_cache *
-cache_new_ref1 (struct frame_info *next_bottom_frame)
+cache_new_ref1 (frame_info_ptr next_bottom_frame)
 {
   struct tailcall_cache *cache = XCNEW (struct tailcall_cache);
   void **slot;
 
-  cache->next_bottom_frame = next_bottom_frame;
+  cache->next_bottom_frame = next_bottom_frame.get ();
   cache->refc = 1;
 
   slot = htab_find_slot (cache_htab, cache, INSERT);
@@ -137,7 +137,7 @@ cache_unref (struct tailcall_cache *cache)
    return 0.  */
 
 static int
-frame_is_tailcall (struct frame_info *fi)
+frame_is_tailcall (frame_info_ptr fi)
 {
   return frame_unwinder_is (fi, &dwarf2_tailcall_frame_unwind);
 }
@@ -146,9 +146,10 @@ frame_is_tailcall (struct frame_info *fi)
    call chain.  Otherwise return NULL.  No new reference is created.  */
 
 static struct tailcall_cache *
-cache_find (struct frame_info *fi)
+cache_find (frame_info_ptr fi)
 {
   struct tailcall_cache *cache;
+  struct tailcall_cache search;
   void **slot;
 
   while (frame_is_tailcall (fi))
@@ -157,7 +158,9 @@ cache_find (struct frame_info *fi)
       gdb_assert (fi != NULL);
     }
 
-  slot = htab_find_slot (cache_htab, &fi, NO_INSERT);
+  search.next_bottom_frame = fi.get();
+  search.refc = 1;
+  slot = htab_find_slot (cache_htab, &search, NO_INSERT);
   if (slot == NULL)
     return NULL;
 
@@ -170,11 +173,11 @@ cache_find (struct frame_info *fi)
    If THIS_FRAME is CACHE-> NEXT_BOTTOM_FRAME return -1.  */
 
 static int
-existing_next_levels (struct frame_info *this_frame,
+existing_next_levels (frame_info_ptr this_frame,
 		      struct tailcall_cache *cache)
 {
   int retval = (frame_relative_level (this_frame)
-		- frame_relative_level (cache->next_bottom_frame) - 1);
+		- frame_relative_level (frame_info_ptr (cache->next_bottom_frame)) - 1);
 
   gdb_assert (retval >= -1);
 
@@ -207,11 +210,11 @@ pretended_chain_levels (struct call_site_chain *chain)
    Specific virtual tail call frames are tracked by INLINE_DEPTH.  */
 
 static void
-tailcall_frame_this_id (struct frame_info *this_frame, void **this_cache,
+tailcall_frame_this_id (frame_info_ptr this_frame, void **this_cache,
 			struct frame_id *this_id)
 {
   struct tailcall_cache *cache = (struct tailcall_cache *) *this_cache;
-  struct frame_info *next_frame;
+  frame_info_ptr next_frame;
 
   /* Tail call does not make sense for a sentinel frame.  */
   next_frame = get_next_frame (this_frame);
@@ -229,7 +232,7 @@ tailcall_frame_this_id (struct frame_info *this_frame, void **this_cache,
    CACHE.  */
 
 static CORE_ADDR
-pretend_pc (struct frame_info *this_frame, struct tailcall_cache *cache)
+pretend_pc (frame_info_ptr this_frame, struct tailcall_cache *cache)
 {
   int next_levels = existing_next_levels (this_frame, cache);
   struct call_site_chain *chain = cache->chain;
@@ -261,7 +264,7 @@ pretend_pc (struct frame_info *this_frame, struct tailcall_cache *cache)
    frames unwind the NULL case differently.  */
 
 struct value *
-dwarf2_tailcall_prev_register_first (struct frame_info *this_frame,
+dwarf2_tailcall_prev_register_first (frame_info_ptr this_frame,
 				     void **tailcall_cachep, int regnum)
 {
   struct gdbarch *this_gdbarch = get_frame_arch (this_frame);
@@ -291,7 +294,7 @@ dwarf2_tailcall_prev_register_first (struct frame_info *this_frame,
    dwarf2_tailcall_prev_register_first.  */
 
 static struct value *
-tailcall_frame_prev_register (struct frame_info *this_frame,
+tailcall_frame_prev_register (frame_info_ptr this_frame,
 			       void **this_cache, int regnum)
 {
   struct tailcall_cache *cache = (struct tailcall_cache *) *this_cache;
@@ -313,9 +316,9 @@ tailcall_frame_prev_register (struct frame_info *this_frame,
 
 static int
 tailcall_frame_sniffer (const struct frame_unwind *self,
-			 struct frame_info *this_frame, void **this_cache)
+			 frame_info_ptr this_frame, void **this_cache)
 {
-  struct frame_info *next_frame;
+  frame_info_ptr next_frame;
   int next_levels;
   struct tailcall_cache *cache;
 
@@ -360,7 +363,7 @@ tailcall_frame_sniffer (const struct frame_unwind *self,
    address pushed on the stack.  */
 
 void
-dwarf2_tailcall_sniffer_first (struct frame_info *this_frame,
+dwarf2_tailcall_sniffer_first (frame_info_ptr this_frame,
 			       void **tailcall_cachep,
 			       const LONGEST *entry_cfa_sp_offsetp)
 {
@@ -444,7 +447,7 @@ dwarf2_tailcall_sniffer_first (struct frame_info *this_frame,
    TAILCALL_FRAME.  */
 
 static void
-tailcall_frame_dealloc_cache (struct frame_info *self, void *this_cache)
+tailcall_frame_dealloc_cache (frame_info *self, void *this_cache)
 {
   struct tailcall_cache *cache = (struct tailcall_cache *) this_cache;
 
@@ -455,12 +458,12 @@ tailcall_frame_dealloc_cache (struct frame_info *self, void *this_cache)
    call frames have gdbarch of the bottom (callee) frame.  */
 
 static struct gdbarch *
-tailcall_frame_prev_arch (struct frame_info *this_frame,
+tailcall_frame_prev_arch (frame_info_ptr this_frame,
 			  void **this_prologue_cache)
 {
   struct tailcall_cache *cache = (struct tailcall_cache *) *this_prologue_cache;
 
-  return get_frame_arch (cache->next_bottom_frame);
+  return get_frame_arch (frame_info_ptr (cache->next_bottom_frame));
 }
 
 /* Virtual tail call frame unwinder if dwarf2_tailcall_sniffer_first finds
diff --git a/gdb/dwarf2/frame-tailcall.h b/gdb/dwarf2/frame-tailcall.h
index e55a59dfbc2..c849bfb070e 100644
--- a/gdb/dwarf2/frame-tailcall.h
+++ b/gdb/dwarf2/frame-tailcall.h
@@ -20,18 +20,18 @@
 #ifndef DWARF2_FRAME_TAILCALL_H
 #define DWARF2_FRAME_TAILCALL_H 1
 
-struct frame_info;
+class frame_info_ptr;
 struct frame_unwind;
 
 /* The tail call frame unwinder.  */
 
 extern void
-  dwarf2_tailcall_sniffer_first (struct frame_info *this_frame,
+  dwarf2_tailcall_sniffer_first (frame_info_ptr this_frame,
 				 void **tailcall_cachep,
 				 const LONGEST *entry_cfa_sp_offsetp);
 
 extern struct value *
-  dwarf2_tailcall_prev_register_first (struct frame_info *this_frame,
+  dwarf2_tailcall_prev_register_first (frame_info_ptr this_frame,
 				       void **tailcall_cachep, int regnum);
 
 extern const struct frame_unwind dwarf2_tailcall_frame_unwind;
diff --git a/gdb/dwarf2/frame.c b/gdb/dwarf2/frame.c
index 0e681f006cd..83565ea7c99 100644
--- a/gdb/dwarf2/frame.c
+++ b/gdb/dwarf2/frame.c
@@ -226,7 +226,7 @@ register %s (#%d) at %s"),
 
 static CORE_ADDR
 execute_stack_op (const gdb_byte *exp, ULONGEST len, int addr_size,
-		  struct frame_info *this_frame, CORE_ADDR initial,
+		  frame_info_ptr this_frame, CORE_ADDR initial,
 		  int initial_in_stack_memory, dwarf2_per_objfile *per_objfile)
 {
   dwarf_expr_context ctx (per_objfile, addr_size);
@@ -583,17 +583,17 @@ execute_cfa_program_test (struct gdbarch *gdbarch)
 static void dwarf2_frame_default_init_reg (struct gdbarch *gdbarch,
 					   int regnum,
 					   struct dwarf2_frame_state_reg *reg,
-					   struct frame_info *this_frame);
+					   frame_info_ptr this_frame);
 
 struct dwarf2_frame_ops
 {
   /* Pre-initialize the register state REG for register REGNUM.  */
   void (*init_reg) (struct gdbarch *, int, struct dwarf2_frame_state_reg *,
-		    struct frame_info *)
+		    frame_info_ptr)
     = dwarf2_frame_default_init_reg;
 
   /* Check whether the THIS_FRAME is a signal trampoline.  */
-  int (*signal_frame_p) (struct gdbarch *, struct frame_info *) = nullptr;
+  int (*signal_frame_p) (struct gdbarch *, frame_info_ptr) = nullptr;
 
   /* Convert .eh_frame register number to DWARF register number, or
      adjust .debug_frame register number.  */
@@ -619,7 +619,7 @@ get_frame_ops (struct gdbarch *gdbarch)
 static void
 dwarf2_frame_default_init_reg (struct gdbarch *gdbarch, int regnum,
 			       struct dwarf2_frame_state_reg *reg,
-			       struct frame_info *this_frame)
+			       frame_info_ptr this_frame)
 {
   /* If we have a register that acts as a program counter, mark it as
      a destination for the return address.  If we have a register that
@@ -660,7 +660,7 @@ void
 dwarf2_frame_set_init_reg (struct gdbarch *gdbarch,
 			   void (*init_reg) (struct gdbarch *, int,
 					     struct dwarf2_frame_state_reg *,
-					     struct frame_info *))
+					     frame_info_ptr ))
 {
   struct dwarf2_frame_ops *ops = get_frame_ops (gdbarch);
 
@@ -672,7 +672,7 @@ dwarf2_frame_set_init_reg (struct gdbarch *gdbarch,
 static void
 dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
 		       struct dwarf2_frame_state_reg *reg,
-		       struct frame_info *this_frame)
+		       frame_info_ptr this_frame)
 {
   struct dwarf2_frame_ops *ops = get_frame_ops (gdbarch);
 
@@ -685,7 +685,7 @@ dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
 void
 dwarf2_frame_set_signal_frame_p (struct gdbarch *gdbarch,
 				 int (*signal_frame_p) (struct gdbarch *,
-							struct frame_info *))
+							frame_info_ptr ))
 {
   struct dwarf2_frame_ops *ops = get_frame_ops (gdbarch);
 
@@ -697,7 +697,7 @@ dwarf2_frame_set_signal_frame_p (struct gdbarch *gdbarch,
 
 static int
 dwarf2_frame_signal_frame_p (struct gdbarch *gdbarch,
-			     struct frame_info *this_frame)
+			     frame_info_ptr this_frame)
 {
   struct dwarf2_frame_ops *ops = get_frame_ops (gdbarch);
 
@@ -866,7 +866,7 @@ struct dwarf2_frame_cache
 };
 
 static struct dwarf2_frame_cache *
-dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache)
+dwarf2_frame_cache (frame_info_ptr this_frame, void **this_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   const int num_regs = gdbarch_num_cooked_regs (gdbarch);
@@ -1095,7 +1095,7 @@ incomplete CFI data; unspecified registers (e.g., %s) at %s"),
 }
 
 static enum unwind_stop_reason
-dwarf2_frame_unwind_stop_reason (struct frame_info *this_frame,
+dwarf2_frame_unwind_stop_reason (frame_info_ptr this_frame,
 				 void **this_cache)
 {
   struct dwarf2_frame_cache *cache
@@ -1111,7 +1111,7 @@ dwarf2_frame_unwind_stop_reason (struct frame_info *this_frame,
 }
 
 static void
-dwarf2_frame_this_id (struct frame_info *this_frame, void **this_cache,
+dwarf2_frame_this_id (frame_info_ptr this_frame, void **this_cache,
 		      struct frame_id *this_id)
 {
   struct dwarf2_frame_cache *cache =
@@ -1126,7 +1126,7 @@ dwarf2_frame_this_id (struct frame_info *this_frame, void **this_cache,
 }
 
 static struct value *
-dwarf2_frame_prev_register (struct frame_info *this_frame, void **this_cache,
+dwarf2_frame_prev_register (frame_info_ptr this_frame, void **this_cache,
 			    int regnum)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
@@ -1226,9 +1226,10 @@ dwarf2_frame_prev_register (struct frame_info *this_frame, void **this_cache,
    call frames chain.  */
 
 static void
-dwarf2_frame_dealloc_cache (struct frame_info *self, void *this_cache)
+dwarf2_frame_dealloc_cache (frame_info *self, void *this_cache)
 {
-  struct dwarf2_frame_cache *cache = dwarf2_frame_cache (self, &this_cache);
+  struct dwarf2_frame_cache *cache
+      = dwarf2_frame_cache (frame_info_ptr (self), &this_cache);
 
   if (cache->tailcall_cache)
     dwarf2_tailcall_frame_unwind.dealloc_cache (self, cache->tailcall_cache);
@@ -1236,7 +1237,7 @@ dwarf2_frame_dealloc_cache (struct frame_info *self, void *this_cache)
 
 static int
 dwarf2_frame_sniffer (const struct frame_unwind *self,
-		      struct frame_info *this_frame, void **this_cache)
+		      frame_info_ptr this_frame, void **this_cache)
 {
   if (!dwarf2_frame_unwinders_enabled_p)
     return 0;
@@ -1312,7 +1313,7 @@ dwarf2_append_unwinders (struct gdbarch *gdbarch)
    response to the "info frame" command.  */
 
 static CORE_ADDR
-dwarf2_frame_base_address (struct frame_info *this_frame, void **this_cache)
+dwarf2_frame_base_address (frame_info_ptr this_frame, void **this_cache)
 {
   struct dwarf2_frame_cache *cache =
     dwarf2_frame_cache (this_frame, this_cache);
@@ -1329,7 +1330,7 @@ static const struct frame_base dwarf2_frame_base =
 };
 
 const struct frame_base *
-dwarf2_frame_base_sniffer (struct frame_info *this_frame)
+dwarf2_frame_base_sniffer (frame_info_ptr this_frame)
 {
   CORE_ADDR block_addr = get_frame_address_in_block (this_frame);
 
@@ -1344,7 +1345,7 @@ dwarf2_frame_base_sniffer (struct frame_info *this_frame)
    DW_OP_call_frame_cfa.  */
 
 CORE_ADDR
-dwarf2_frame_cfa (struct frame_info *this_frame)
+dwarf2_frame_cfa (frame_info_ptr this_frame)
 {
   if (frame_unwinder_is (this_frame, &record_btrace_tailcall_frame_unwind)
       || frame_unwinder_is (this_frame, &record_btrace_frame_unwind))
diff --git a/gdb/dwarf2/frame.h b/gdb/dwarf2/frame.h
index 04ec1e06c48..653156fa509 100644
--- a/gdb/dwarf2/frame.h
+++ b/gdb/dwarf2/frame.h
@@ -23,7 +23,7 @@
 #define DWARF2_FRAME_H 1
 
 struct gdbarch;
-struct frame_info;
+class frame_info_ptr;
 struct dwarf2_per_cu_data;
 struct agent_expr;
 struct axs_value;
@@ -78,7 +78,7 @@ struct dwarf2_frame_state_reg
       const gdb_byte *start;
       ULONGEST len;
     } exp;
-    struct value *(*fn) (struct frame_info *this_frame, void **this_cache,
+    struct value *(*fn) (frame_info_ptr this_frame, void **this_cache,
 			 int regnum);
   } loc;
   enum dwarf2_frame_reg_rule how;
@@ -208,7 +208,7 @@ extern bool dwarf2_frame_unwinders_enabled_p;
 extern void dwarf2_frame_set_init_reg (struct gdbarch *gdbarch,
 				       void (*init_reg) (struct gdbarch *, int,
 					     struct dwarf2_frame_state_reg *,
-					     struct frame_info *));
+					     frame_info_ptr ));
 
 /* Set the architecture-specific signal trampoline recognition
    function for GDBARCH to SIGNAL_FRAME_P.  */
@@ -216,7 +216,7 @@ extern void dwarf2_frame_set_init_reg (struct gdbarch *gdbarch,
 extern void
   dwarf2_frame_set_signal_frame_p (struct gdbarch *gdbarch,
 				   int (*signal_frame_p) (struct gdbarch *,
-							  struct frame_info *));
+							  frame_info_ptr ));
 
 /* Set the architecture-specific adjustment of .eh_frame and .debug_frame
    register numbers.  */
@@ -234,11 +234,11 @@ void dwarf2_append_unwinders (struct gdbarch *gdbarch);
    NULL if it can't be handled by the DWARF CFI frame unwinder.  */
 
 extern const struct frame_base *
-  dwarf2_frame_base_sniffer (struct frame_info *this_frame);
+  dwarf2_frame_base_sniffer (frame_info_ptr this_frame);
 
 /* Compute the DWARF CFA for a frame.  */
 
-CORE_ADDR dwarf2_frame_cfa (struct frame_info *this_frame);
+CORE_ADDR dwarf2_frame_cfa (frame_info_ptr this_frame);
 
 /* Find the CFA information for PC.
 
diff --git a/gdb/dwarf2/loc.c b/gdb/dwarf2/loc.c
index bf0df613f24..c6cf26e75cd 100644
--- a/gdb/dwarf2/loc.c
+++ b/gdb/dwarf2/loc.c
@@ -48,7 +48,7 @@
 #include "gdbsupport/byte-vector.h"
 
 static struct value *dwarf2_evaluate_loc_desc_full
-  (struct type *type, struct frame_info *frame, const gdb_byte *data,
+  (struct type *type, frame_info_ptr frame, const gdb_byte *data,
    size_t size, dwarf2_per_cu_data *per_cu, dwarf2_per_objfile *per_objfile,
    struct type *subobj_type, LONGEST subobj_byte_offset, bool as_lval = true);
 
@@ -488,7 +488,7 @@ locexpr_find_frame_base_location (struct symbol *framefunc, CORE_ADDR pc,
    LOC_BLOCK functions using a DWARF expression as its DW_AT_frame_base.  */
 
 static CORE_ADDR
-locexpr_get_frame_base (struct symbol *framefunc, struct frame_info *frame)
+locexpr_get_frame_base (struct symbol *framefunc, frame_info_ptr frame)
 {
   struct gdbarch *gdbarch;
   struct type *type;
@@ -545,7 +545,7 @@ loclist_find_frame_base_location (struct symbol *framefunc, CORE_ADDR pc,
    LOC_BLOCK functions using a DWARF location list as its DW_AT_frame_base.  */
 
 static CORE_ADDR
-loclist_get_frame_base (struct symbol *framefunc, struct frame_info *frame)
+loclist_get_frame_base (struct symbol *framefunc, frame_info_ptr frame)
 {
   struct gdbarch *gdbarch;
   struct type *type;
@@ -638,7 +638,7 @@ void
 call_site_target::iterate_over_addresses
      (struct gdbarch *call_site_gdbarch,
       const struct call_site *call_site,
-      struct frame_info *caller_frame,
+      frame_info_ptr caller_frame,
       iterate_ftype callback) const
 {
   switch (m_loc_kind)
@@ -1126,7 +1126,7 @@ call_site_parameter_matches (struct call_site_parameter *parameter,
 /* See loc.h.  */
 
 struct call_site_parameter *
-dwarf_expr_reg_to_entry_parameter (struct frame_info *frame,
+dwarf_expr_reg_to_entry_parameter (frame_info_ptr frame,
 				   enum call_site_parameter_kind kind,
 				   union call_site_parameter_u kind_u,
 				   dwarf2_per_cu_data **per_cu_return,
@@ -1134,7 +1134,7 @@ dwarf_expr_reg_to_entry_parameter (struct frame_info *frame,
 {
   CORE_ADDR func_addr, caller_pc;
   struct gdbarch *gdbarch;
-  struct frame_info *caller_frame;
+  frame_info_ptr caller_frame;
   struct call_site *call_site;
   int iparams;
   /* Initialize it just to avoid a GCC false warning.  */
@@ -1251,7 +1251,7 @@ dwarf_expr_reg_to_entry_parameter (struct frame_info *frame,
 static struct value *
 dwarf_entry_parameter_to_value (struct call_site_parameter *parameter,
 				CORE_ADDR deref_size, struct type *type,
-				struct frame_info *caller_frame,
+				frame_info_ptr caller_frame,
 				dwarf2_per_cu_data *per_cu,
 				dwarf2_per_objfile *per_objfile)
 {
@@ -1333,13 +1333,13 @@ static const struct lval_funcs entry_data_value_funcs =
    cannot resolve the parameter for any reason.  */
 
 static struct value *
-value_of_dwarf_reg_entry (struct type *type, struct frame_info *frame,
+value_of_dwarf_reg_entry (struct type *type, frame_info_ptr frame,
 			  enum call_site_parameter_kind kind,
 			  union call_site_parameter_u kind_u)
 {
   struct type *checked_type = check_typedef (type);
   struct type *target_type = TYPE_TARGET_TYPE (checked_type);
-  struct frame_info *caller_frame = get_prev_frame (frame);
+  frame_info_ptr caller_frame = get_prev_frame (frame);
   struct value *outer_val, *target_val, *val;
   struct call_site_parameter *parameter;
   dwarf2_per_cu_data *caller_per_cu;
@@ -1389,7 +1389,7 @@ value_of_dwarf_reg_entry (struct type *type, struct frame_info *frame,
    cannot resolve the parameter for any reason.  */
 
 static struct value *
-value_of_dwarf_block_entry (struct type *type, struct frame_info *frame,
+value_of_dwarf_block_entry (struct type *type, frame_info_ptr frame,
 			    const gdb_byte *block, size_t block_len)
 {
   union call_site_parameter_u kind_u;
@@ -1450,7 +1450,7 @@ struct value *
 indirect_synthetic_pointer (sect_offset die, LONGEST byte_offset,
 			    dwarf2_per_cu_data *per_cu,
 			    dwarf2_per_objfile *per_objfile,
-			    struct frame_info *frame, struct type *type,
+			    frame_info_ptr frame, struct type *type,
 			    bool resolve_abstract_p)
 {
   /* Fetch the location expression of the DIE we're pointing to.  */
@@ -1490,7 +1490,7 @@ indirect_synthetic_pointer (sect_offset die, LONGEST byte_offset,
    SUBOBJ_BYTE_OFFSET within the variable of type TYPE.  */
 
 static struct value *
-dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame,
+dwarf2_evaluate_loc_desc_full (struct type *type, frame_info_ptr frame,
 			       const gdb_byte *data, size_t size,
 			       dwarf2_per_cu_data *per_cu,
 			       dwarf2_per_objfile *per_objfile,
@@ -1555,7 +1555,7 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame,
    passes 0 as the byte_offset.  */
 
 struct value *
-dwarf2_evaluate_loc_desc (struct type *type, struct frame_info *frame,
+dwarf2_evaluate_loc_desc (struct type *type, frame_info_ptr frame,
 			  const gdb_byte *data, size_t size,
 			  dwarf2_per_cu_data *per_cu,
 			  dwarf2_per_objfile *per_objfile, bool as_lval)
@@ -1578,7 +1578,7 @@ dwarf2_evaluate_loc_desc (struct type *type, struct frame_info *frame,
 
 static int
 dwarf2_locexpr_baton_eval (const struct dwarf2_locexpr_baton *dlbaton,
-			   struct frame_info *frame,
+			   frame_info_ptr frame,
 			   const struct property_addr_info *addr_stack,
 			   CORE_ADDR *valp,
 			   gdb::array_view<CORE_ADDR> push_values,
@@ -1639,7 +1639,7 @@ dwarf2_locexpr_baton_eval (const struct dwarf2_locexpr_baton *dlbaton,
 
 bool
 dwarf2_evaluate_property (const struct dynamic_prop *prop,
-			  struct frame_info *frame,
+			  frame_info_ptr frame,
 			  const struct property_addr_info *addr_stack,
 			  CORE_ADDR *value,
 			  gdb::array_view<CORE_ADDR> push_values)
@@ -3044,7 +3044,7 @@ dwarf2_compile_expr_to_ax (struct agent_expr *expr, struct axs_value *loc,
 /* Return the value of SYMBOL in FRAME using the DWARF-2 expression
    evaluator to calculate the location.  */
 static struct value *
-locexpr_read_variable (struct symbol *symbol, struct frame_info *frame)
+locexpr_read_variable (struct symbol *symbol, frame_info_ptr frame)
 {
   struct dwarf2_locexpr_baton *dlbaton
     = (struct dwarf2_locexpr_baton *) SYMBOL_LOCATION_BATON (symbol);
@@ -3062,7 +3062,7 @@ locexpr_read_variable (struct symbol *symbol, struct frame_info *frame)
    will be thrown.  */
 
 static struct value *
-locexpr_read_variable_at_entry (struct symbol *symbol, struct frame_info *frame)
+locexpr_read_variable_at_entry (struct symbol *symbol, frame_info_ptr frame)
 {
   struct dwarf2_locexpr_baton *dlbaton
     = (struct dwarf2_locexpr_baton *) SYMBOL_LOCATION_BATON (symbol);
@@ -3877,7 +3877,7 @@ const struct symbol_computed_ops dwarf2_locexpr_funcs = {
 /* Return the value of SYMBOL in FRAME using the DWARF-2 expression
    evaluator to calculate the location.  */
 static struct value *
-loclist_read_variable (struct symbol *symbol, struct frame_info *frame)
+loclist_read_variable (struct symbol *symbol, frame_info_ptr frame)
 {
   struct dwarf2_loclist_baton *dlbaton
     = (struct dwarf2_loclist_baton *) SYMBOL_LOCATION_BATON (symbol);
@@ -3902,7 +3902,7 @@ loclist_read_variable (struct symbol *symbol, struct frame_info *frame)
    if it cannot resolve the parameter for any reason.  */
 
 static struct value *
-loclist_read_variable_at_entry (struct symbol *symbol, struct frame_info *frame)
+loclist_read_variable_at_entry (struct symbol *symbol, frame_info_ptr frame)
 {
   struct dwarf2_loclist_baton *dlbaton
     = (struct dwarf2_loclist_baton *) SYMBOL_LOCATION_BATON (symbol);
diff --git a/gdb/dwarf2/loc.h b/gdb/dwarf2/loc.h
index a9834d32066..d6709f2e342 100644
--- a/gdb/dwarf2/loc.h
+++ b/gdb/dwarf2/loc.h
@@ -65,7 +65,7 @@ value *compute_var_value (const char *name);
    otherwise.  */
 
 struct call_site_parameter *dwarf_expr_reg_to_entry_parameter
-  (struct frame_info *frame, enum call_site_parameter_kind kind,
+  (frame_info_ptr frame, enum call_site_parameter_kind kind,
    union call_site_parameter_u kind_u, dwarf2_per_cu_data **per_cu_return,
    dwarf2_per_objfile **per_objfile_return);
 
@@ -76,7 +76,7 @@ struct call_site_parameter *dwarf_expr_reg_to_entry_parameter
    be a value or a location description.  */
 
 struct value *dwarf2_evaluate_loc_desc (struct type *type,
-					struct frame_info *frame,
+					frame_info_ptr frame,
 					const gdb_byte *data,
 					size_t size,
 					dwarf2_per_cu_data *per_cu,
@@ -120,7 +120,7 @@ struct property_addr_info
    bottom of the stack.  */
 
 bool dwarf2_evaluate_property (const struct dynamic_prop *prop,
-			       struct frame_info *frame,
+			       frame_info_ptr frame,
 			       const struct property_addr_info *addr_stack,
 			       CORE_ADDR *value,
 			       gdb::array_view<CORE_ADDR> push_values = {});
@@ -293,7 +293,7 @@ extern void invalid_synthetic_pointer ();
 
 extern struct value *indirect_synthetic_pointer
   (sect_offset die, LONGEST byte_offset, dwarf2_per_cu_data *per_cu,
-   dwarf2_per_objfile *per_objfile, struct frame_info *frame,
+   dwarf2_per_objfile *per_objfile, frame_info_ptr frame,
    struct type *type, bool resolve_abstract_p = false);
 
 #endif /* DWARF2LOC_H */
diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c
index 6a3f83c2194..e1ab8a3a760 100644
--- a/gdb/f-valprint.c
+++ b/gdb/f-valprint.c
@@ -662,7 +662,7 @@ info_common_command_for_block (const struct block *block, const char *comname,
 static void
 info_common_command (const char *comname, int from_tty)
 {
-  struct frame_info *fi;
+  frame_info_ptr fi;
   const struct block *block;
   int values_printed = 0;
 
diff --git a/gdb/findvar.c b/gdb/findvar.c
index 36c094534be..5c6eea0778c 100644
--- a/gdb/findvar.c
+++ b/gdb/findvar.c
@@ -259,7 +259,7 @@ copy_integer_to_size (gdb_byte *dest, int dest_size, const gdb_byte *source,
    determined by register_type ().  */
 
 struct value *
-value_of_register (int regnum, struct frame_info *frame)
+value_of_register (int regnum, frame_info_ptr frame)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
   struct value *reg_val;
@@ -279,11 +279,11 @@ value_of_register (int regnum, struct frame_info *frame)
    determined by register_type ().  The value is not fetched.  */
 
 struct value *
-value_of_register_lazy (struct frame_info *frame, int regnum)
+value_of_register_lazy (frame_info_ptr frame, int regnum)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
   struct value *reg_val;
-  struct frame_info *next_frame;
+  frame_info_ptr next_frame;
 
   gdb_assert (regnum < gdbarch_num_cooked_regs (gdbarch));
 
@@ -403,8 +403,8 @@ symbol_read_needs_frame (struct symbol *sym)
    the static links points to and return it.  Return NULL if we could not find
    such a frame.   */
 
-static struct frame_info *
-follow_static_link (struct frame_info *frame,
+static frame_info_ptr
+follow_static_link (frame_info_ptr frame,
 		    const struct dynamic_prop *static_link)
 {
   CORE_ADDR upper_frame_base;
@@ -446,9 +446,9 @@ follow_static_link (struct frame_info *frame,
    For backward compatibility purposes (with old compilers), we then look for
    the first frame that can host it.  */
 
-static struct frame_info *
+static frame_info_ptr
 get_hosting_frame (struct symbol *var, const struct block *var_block,
-		   struct frame_info *frame)
+		   frame_info_ptr frame)
 {
   const struct block *frame_block = NULL;
 
@@ -559,7 +559,7 @@ get_hosting_frame (struct symbol *var, const struct block *var_block,
 struct value *
 language_defn::read_var_value (struct symbol *var,
 			       const struct block *var_block,
-			       struct frame_info *frame) const
+			       frame_info_ptr frame) const
 {
   struct value *v;
   struct type *type = var->type ();
@@ -781,7 +781,7 @@ language_defn::read_var_value (struct symbol *var,
 
 struct value *
 read_var_value (struct symbol *var, const struct block *var_block,
-		struct frame_info *frame)
+		frame_info_ptr frame)
 {
   const struct language_defn *lang = language_def (var->language ());
 
@@ -798,7 +798,7 @@ default_value_from_register (struct gdbarch *gdbarch, struct type *type,
 {
   int len = TYPE_LENGTH (type);
   struct value *value = allocate_value (type);
-  struct frame_info *frame;
+  frame_info_ptr frame;
 
   VALUE_LVAL (value) = lval_register;
   frame = frame_find_by_id (frame_id);
@@ -834,7 +834,7 @@ default_value_from_register (struct gdbarch *gdbarch, struct type *type,
    complete resulting value as optimized out.  */
 
 void
-read_frame_register_value (struct value *value, struct frame_info *frame)
+read_frame_register_value (struct value *value, frame_info_ptr frame)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
   LONGEST offset = 0;
@@ -874,7 +874,7 @@ read_frame_register_value (struct value *value, struct frame_info *frame)
 /* Return a value of type TYPE, stored in register REGNUM, in frame FRAME.  */
 
 struct value *
-value_from_register (struct type *type, int regnum, struct frame_info *frame)
+value_from_register (struct type *type, int regnum, frame_info_ptr frame)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
   struct type *type1 = check_typedef (type);
@@ -924,7 +924,7 @@ value_from_register (struct type *type, int regnum, struct frame_info *frame)
    Will abort if register value is not available.  */
 
 CORE_ADDR
-address_from_register (int regnum, struct frame_info *frame)
+address_from_register (int regnum, frame_info_ptr frame)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
   struct type *type = builtin_type (gdbarch)->builtin_data_ptr;
diff --git a/gdb/frame-base.c b/gdb/frame-base.c
index 06c6af4b8c7..fb577df5143 100644
--- a/gdb/frame-base.c
+++ b/gdb/frame-base.c
@@ -29,19 +29,19 @@
    really need to override this.  */
 
 static CORE_ADDR
-default_frame_base_address (struct frame_info *this_frame, void **this_cache)
+default_frame_base_address (frame_info_ptr this_frame, void **this_cache)
 {
   return get_frame_base (this_frame); /* sigh! */
 }
 
 static CORE_ADDR
-default_frame_locals_address (struct frame_info *this_frame, void **this_cache)
+default_frame_locals_address (frame_info_ptr this_frame, void **this_cache)
 {
   return default_frame_base_address (this_frame, this_cache);
 }
 
 static CORE_ADDR
-default_frame_args_address (struct frame_info *this_frame, void **this_cache)
+default_frame_args_address (frame_info_ptr this_frame, void **this_cache)
 {
   return default_frame_base_address (this_frame, this_cache);
 }
@@ -99,7 +99,7 @@ frame_base_set_default (struct gdbarch *gdbarch,
 }
 
 const struct frame_base *
-frame_base_find_by_frame (struct frame_info *this_frame)
+frame_base_find_by_frame (frame_info_ptr this_frame)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   struct frame_base_table *table = get_frame_base_table (gdbarch);
diff --git a/gdb/frame-base.h b/gdb/frame-base.h
index ba3d99cc02f..334a2e2c750 100644
--- a/gdb/frame-base.h
+++ b/gdb/frame-base.h
@@ -20,7 +20,7 @@
 #if !defined (FRAME_BASE_H)
 #define FRAME_BASE_H 1
 
-struct frame_info;
+class frame_info_ptr;
 struct frame_id;
 struct frame_unwind;
 struct frame_base;
@@ -42,17 +42,17 @@ struct regcache;
 
 /* A generic base address.  */
 
-typedef CORE_ADDR (frame_this_base_ftype) (struct frame_info *this_frame,
+typedef CORE_ADDR (frame_this_base_ftype) (frame_info_ptr this_frame,
 					   void **this_base_cache);
 
 /* The base address of the frame's local variables.  */
 
-typedef CORE_ADDR (frame_this_locals_ftype) (struct frame_info *this_frame,
+typedef CORE_ADDR (frame_this_locals_ftype) (frame_info_ptr this_frame,
 					     void **this_base_cache);
 
 /* The base address of the frame's arguments / parameters.  */
 
-typedef CORE_ADDR (frame_this_args_ftype) (struct frame_info *this_frame,
+typedef CORE_ADDR (frame_this_args_ftype) (frame_info_ptr this_frame,
 					   void **this_base_cache);
 
 struct frame_base
@@ -68,7 +68,7 @@ struct frame_base
 /* Given THIS frame, return the frame base methods for THIS frame,
    or NULL if it can't handle THIS frame.  */
 
-typedef const struct frame_base *(frame_base_sniffer_ftype) (struct frame_info *this_frame);
+typedef const struct frame_base *(frame_base_sniffer_ftype) (frame_info_ptr this_frame);
 
 /* Append a frame base sniffer to the list.  The sniffers are polled
    in the order that they are appended.  */
@@ -86,6 +86,6 @@ extern void frame_base_set_default (struct gdbarch *gdbarch,
 /* Iterate through the list of frame base handlers until one returns
    an implementation.  */
 
-extern const struct frame_base *frame_base_find_by_frame (struct frame_info *this_frame);
+extern const struct frame_base *frame_base_find_by_frame (frame_info_ptr this_frame);
 
 #endif
diff --git a/gdb/frame-unwind.c b/gdb/frame-unwind.c
index 78e3f1d8bad..ed24e6e1747 100644
--- a/gdb/frame-unwind.c
+++ b/gdb/frame-unwind.c
@@ -121,7 +121,7 @@ frame_unwind_append_unwinder (struct gdbarch *gdbarch,
    unchanged and returns 0.  */
 
 static int
-frame_unwind_try_unwinder (struct frame_info *this_frame, void **this_cache,
+frame_unwind_try_unwinder (frame_info_ptr this_frame, void **this_cache,
 			  const struct frame_unwind *unwinder)
 {
   int res = 0;
@@ -181,7 +181,7 @@ frame_unwind_try_unwinder (struct frame_info *this_frame, void **this_cache,
    by this function.  Possibly initialize THIS_CACHE.  */
 
 void
-frame_unwind_find_by_frame (struct frame_info *this_frame, void **this_cache)
+frame_unwind_find_by_frame (frame_info_ptr this_frame, void **this_cache)
 {
   FRAME_SCOPED_DEBUG_ENTER_EXIT;
   frame_debug_printf ("this_frame=%d", frame_relative_level (this_frame));
@@ -215,7 +215,7 @@ frame_unwind_find_by_frame (struct frame_info *this_frame, void **this_cache)
 
 int
 default_frame_sniffer (const struct frame_unwind *self,
-		       struct frame_info *this_frame,
+		       frame_info_ptr this_frame,
 		       void **this_prologue_cache)
 {
   return 1;
@@ -224,7 +224,7 @@ default_frame_sniffer (const struct frame_unwind *self,
 /* The default frame unwinder stop_reason callback.  */
 
 enum unwind_stop_reason
-default_frame_unwind_stop_reason (struct frame_info *this_frame,
+default_frame_unwind_stop_reason (frame_info_ptr this_frame,
 				  void **this_cache)
 {
   struct frame_id this_id = get_frame_id (this_frame);
@@ -238,7 +238,7 @@ default_frame_unwind_stop_reason (struct frame_info *this_frame,
 /* See frame-unwind.h.  */
 
 CORE_ADDR
-default_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
+default_unwind_pc (struct gdbarch *gdbarch, frame_info_ptr next_frame)
 {
   int pc_regnum = gdbarch_pc_regnum (gdbarch);
   CORE_ADDR pc = frame_unwind_register_unsigned (next_frame, pc_regnum);
@@ -249,7 +249,7 @@ default_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
 /* See frame-unwind.h.  */
 
 CORE_ADDR
-default_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
+default_unwind_sp (struct gdbarch *gdbarch, frame_info_ptr next_frame)
 {
   int sp_regnum = gdbarch_sp_regnum (gdbarch);
   return frame_unwind_register_unsigned (next_frame, sp_regnum);
@@ -261,7 +261,7 @@ default_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
 /* Return a value which indicates that FRAME did not save REGNUM.  */
 
 struct value *
-frame_unwind_got_optimized (struct frame_info *frame, int regnum)
+frame_unwind_got_optimized (frame_info_ptr frame, int regnum)
 {
   struct gdbarch *gdbarch = frame_unwind_arch (frame);
   struct type *type = register_type (gdbarch, regnum);
@@ -273,7 +273,7 @@ frame_unwind_got_optimized (struct frame_info *frame, int regnum)
    register NEW_REGNUM.  */
 
 struct value *
-frame_unwind_got_register (struct frame_info *frame,
+frame_unwind_got_register (frame_info_ptr frame,
 			   int regnum, int new_regnum)
 {
   return value_of_register_lazy (frame, new_regnum);
@@ -283,7 +283,7 @@ frame_unwind_got_register (struct frame_info *frame,
    ADDR.  */
 
 struct value *
-frame_unwind_got_memory (struct frame_info *frame, int regnum, CORE_ADDR addr)
+frame_unwind_got_memory (frame_info_ptr frame, int regnum, CORE_ADDR addr)
 {
   struct gdbarch *gdbarch = frame_unwind_arch (frame);
   struct value *v = value_at_lazy (register_type (gdbarch, regnum), addr);
@@ -296,7 +296,7 @@ frame_unwind_got_memory (struct frame_info *frame, int regnum, CORE_ADDR addr)
    REGNUM has a known constant (computed) value of VAL.  */
 
 struct value *
-frame_unwind_got_constant (struct frame_info *frame, int regnum,
+frame_unwind_got_constant (frame_info_ptr frame, int regnum,
 			   ULONGEST val)
 {
   struct gdbarch *gdbarch = frame_unwind_arch (frame);
@@ -310,7 +310,7 @@ frame_unwind_got_constant (struct frame_info *frame, int regnum,
 }
 
 struct value *
-frame_unwind_got_bytes (struct frame_info *frame, int regnum, const gdb_byte *buf)
+frame_unwind_got_bytes (frame_info_ptr frame, int regnum, const gdb_byte *buf)
 {
   struct gdbarch *gdbarch = frame_unwind_arch (frame);
   struct value *reg_val;
@@ -326,7 +326,7 @@ frame_unwind_got_bytes (struct frame_info *frame, int regnum, const gdb_byte *bu
    CORE_ADDR to a target address if necessary.  */
 
 struct value *
-frame_unwind_got_address (struct frame_info *frame, int regnum,
+frame_unwind_got_address (frame_info_ptr frame, int regnum,
 			  CORE_ADDR addr)
 {
   struct gdbarch *gdbarch = frame_unwind_arch (frame);
diff --git a/gdb/frame-unwind.h b/gdb/frame-unwind.h
index af79c808301..84c90fdd143 100644
--- a/gdb/frame-unwind.h
+++ b/gdb/frame-unwind.h
@@ -21,7 +21,7 @@
 #define FRAME_UNWIND_H 1
 
 struct frame_data;
-struct frame_info;
+class frame_info_ptr;
 struct frame_id;
 struct frame_unwind;
 struct gdbarch;
@@ -50,37 +50,37 @@ struct value;
    to set *THIS_PROLOGUE_CACHE to NULL.  */
 
 typedef int (frame_sniffer_ftype) (const struct frame_unwind *self,
-				   struct frame_info *this_frame,
+				   frame_info_ptr this_frame,
 				   void **this_prologue_cache);
 
 typedef enum unwind_stop_reason (frame_unwind_stop_reason_ftype)
-  (struct frame_info *this_frame, void **this_prologue_cache);
+  (frame_info_ptr this_frame, void **this_prologue_cache);
 
 /* A default frame sniffer which always accepts the frame.  Used by
    fallback prologue unwinders.  */
 
 int default_frame_sniffer (const struct frame_unwind *self,
-			   struct frame_info *this_frame,
+			   frame_info_ptr this_frame,
 			   void **this_prologue_cache);
 
 /* A default stop_reason callback which always claims the frame is
    unwindable.  */
 
 enum unwind_stop_reason
-  default_frame_unwind_stop_reason (struct frame_info *this_frame,
+  default_frame_unwind_stop_reason (frame_info_ptr this_frame,
 				    void **this_cache);
 
 /* A default unwind_pc callback that simply unwinds the register identified
    by GDBARCH_PC_REGNUM.  */
 
 extern CORE_ADDR default_unwind_pc (struct gdbarch *gdbarch,
-				    struct frame_info *next_frame);
+				    frame_info_ptr next_frame);
 
 /* A default unwind_sp callback that simply unwinds the register identified
    by GDBARCH_SP_REGNUM.  */
 
 extern CORE_ADDR default_unwind_sp (struct gdbarch *gdbarch,
-				    struct frame_info *next_frame);
+				    frame_info_ptr next_frame);
 
 /* Assuming the frame chain: (outer) prev <-> this <-> next (inner);
    use THIS frame, and through it the NEXT frame's register unwind
@@ -105,7 +105,7 @@ extern CORE_ADDR default_unwind_sp (struct gdbarch *gdbarch,
    with the other unwind methods.  Memory for that cache should be
    allocated using FRAME_OBSTACK_ZALLOC().  */
 
-typedef void (frame_this_id_ftype) (struct frame_info *this_frame,
+typedef void (frame_this_id_ftype) (frame_info_ptr this_frame,
 				    void **this_prologue_cache,
 				    struct frame_id *this_id);
 
@@ -141,19 +141,19 @@ typedef void (frame_this_id_ftype) (struct frame_info *this_frame,
    allocated using FRAME_OBSTACK_ZALLOC().  */
 
 typedef struct value * (frame_prev_register_ftype)
-  (struct frame_info *this_frame, void **this_prologue_cache,
+  (frame_info_ptr this_frame, void **this_prologue_cache,
    int regnum);
 
 /* Deallocate extra memory associated with the frame cache if any.  */
 
-typedef void (frame_dealloc_cache_ftype) (struct frame_info *self,
+typedef void (frame_dealloc_cache_ftype) (frame_info *self,
 					  void *this_cache);
 
 /* Assuming the frame chain: (outer) prev <-> this <-> next (inner);
    use THIS frame, and implicitly the NEXT frame's register unwind
    method, return PREV frame's architecture.  */
 
-typedef struct gdbarch *(frame_prev_arch_ftype) (struct frame_info *this_frame,
+typedef struct gdbarch *(frame_prev_arch_ftype) (frame_info_ptr this_frame,
 						 void **this_prologue_cache);
 
 struct frame_unwind
@@ -193,7 +193,7 @@ extern void frame_unwind_append_unwinder (struct gdbarch *gdbarch,
    unwinder implementation.  THIS_FRAME->UNWIND must be NULL, it will get set
    by this function.  Possibly initialize THIS_CACHE.  */
 
-extern void frame_unwind_find_by_frame (struct frame_info *this_frame,
+extern void frame_unwind_find_by_frame (frame_info_ptr this_frame,
 					void **this_cache);
 
 /* Helper functions for value-based register unwinding.  These return
@@ -201,39 +201,39 @@ extern void frame_unwind_find_by_frame (struct frame_info *this_frame,
 
 /* Return a value which indicates that FRAME did not save REGNUM.  */
 
-struct value *frame_unwind_got_optimized (struct frame_info *frame,
+struct value *frame_unwind_got_optimized (frame_info_ptr frame,
 					  int regnum);
 
 /* Return a value which indicates that FRAME copied REGNUM into
    register NEW_REGNUM.  */
 
-struct value *frame_unwind_got_register (struct frame_info *frame, int regnum,
+struct value *frame_unwind_got_register (frame_info_ptr frame, int regnum,
 					 int new_regnum);
 
 /* Return a value which indicates that FRAME saved REGNUM in memory at
    ADDR.  */
 
-struct value *frame_unwind_got_memory (struct frame_info *frame, int regnum,
+struct value *frame_unwind_got_memory (frame_info_ptr frame, int regnum,
 				       CORE_ADDR addr);
 
 /* Return a value which indicates that FRAME's saved version of
    REGNUM has a known constant (computed) value of VAL.  */
 
-struct value *frame_unwind_got_constant (struct frame_info *frame, int regnum,
+struct value *frame_unwind_got_constant (frame_info_ptr frame, int regnum,
 					 ULONGEST val);
 
 /* Return a value which indicates that FRAME's saved version of
    REGNUM has a known constant (computed) value which is stored
    inside BUF.  */
 
-struct value *frame_unwind_got_bytes (struct frame_info *frame, int regnum,
+struct value *frame_unwind_got_bytes (frame_info_ptr frame, int regnum,
 				      const gdb_byte *buf);
 
 /* Return a value which indicates that FRAME's saved version of REGNUM
    has a known constant (computed) value of ADDR.  Convert the
    CORE_ADDR to a target address if necessary.  */
 
-struct value *frame_unwind_got_address (struct frame_info *frame, int regnum,
+struct value *frame_unwind_got_address (frame_info_ptr frame, int regnum,
 					CORE_ADDR addr);
 
 #endif
diff --git a/gdb/frame.c b/gdb/frame.c
index 7c31da53729..1d13d319b83 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -51,7 +51,7 @@
    The current frame, which is the innermost frame, can be found at
    sentinel_frame->prev.  */
 
-static struct frame_info *sentinel_frame;
+static frame_info *sentinel_frame;
 
 /* Number of calls to reinit_frame_cache.  */
 static unsigned int frame_cache_generation = 0;
@@ -70,7 +70,7 @@ get_frame_cache_generation ()
 /* The values behind the global "set backtrace ..." settings.  */
 set_backtrace_options user_set_backtrace_options;
 
-static struct frame_info *get_prev_frame_raw (struct frame_info *this_frame);
+static frame_info_ptr get_prev_frame_raw (frame_info_ptr this_frame);
 static const char *frame_stop_reason_symbol_string (enum unwind_stop_reason reason);
 
 /* Status of some values cached in the frame_info object.  */
@@ -195,7 +195,7 @@ struct frame_info
 /* See frame.h.  */
 
 void
-set_frame_previous_pc_masked (struct frame_info *frame)
+set_frame_previous_pc_masked (frame_info_ptr frame)
 {
   frame->prev_pc.masked = true;
 }
@@ -203,7 +203,7 @@ set_frame_previous_pc_masked (struct frame_info *frame)
 /* See frame.h.  */
 
 bool
-get_frame_pc_masked (const struct frame_info *frame)
+get_frame_pc_masked (frame_info_ptr frame)
 {
   gdb_assert (frame->next != nullptr);
   gdb_assert (frame->next->prev_pc.status == CC_VALUE);
@@ -225,7 +225,7 @@ static htab_t frame_stash;
 static hashval_t
 frame_addr_hash (const void *ap)
 {
-  const struct frame_info *frame = (const struct frame_info *) ap;
+  const frame_info *frame = (const frame_info *) ap;
   const struct frame_id f_id = frame->this_id.value;
   hashval_t hash = 0;
 
@@ -252,8 +252,8 @@ frame_addr_hash (const void *ap)
 static int
 frame_addr_hash_eq (const void *a, const void *b)
 {
-  const struct frame_info *f_entry = (const struct frame_info *) a;
-  const struct frame_info *f_element = (const struct frame_info *) b;
+  const frame_info *f_entry = (const frame_info *) a;
+  const frame_info *f_element = (const frame_info *) b;
 
   return f_entry->this_id.value == f_element->this_id.value;
 }
@@ -280,8 +280,8 @@ frame_stash_add (frame_info *frame)
   /* Do not try to stash the sentinel frame.  */
   gdb_assert (frame->level >= 0);
 
-  frame_info **slot = (struct frame_info **) htab_find_slot (frame_stash,
-							     frame, INSERT);
+  frame_info **slot = (frame_info **) htab_find_slot (frame_stash,
+						      frame, INSERT);
 
   /* If we already have a frame in the stack with the same id, we
      either have a stack cycle (corrupted stack?), or some bug
@@ -298,15 +298,15 @@ frame_stash_add (frame_info *frame)
    given frame ID.  If found, return that frame.  Otherwise return
    NULL.  */
 
-static struct frame_info *
+static frame_info_ptr 
 frame_stash_find (struct frame_id id)
 {
   struct frame_info dummy;
-  struct frame_info *frame;
+  frame_info *frame;
 
   dummy.this_id.value = id;
-  frame = (struct frame_info *) htab_find (frame_stash, &dummy);
-  return frame;
+  frame = (frame_info *) htab_find (frame_stash, &dummy);
+  return frame_info_ptr (frame);
 }
 
 /* Internal function to invalidate the frame stash by removing all
@@ -505,8 +505,8 @@ frame_info::to_string () const
    Return FRAME if FRAME is a non-artificial frame.
    Return NULL if FRAME is the start of an artificial-only chain.  */
 
-static struct frame_info *
-skip_artificial_frames (struct frame_info *frame)
+static frame_info_ptr 
+skip_artificial_frames (frame_info_ptr frame)
 {
   /* Note we use get_prev_frame_always, and not get_prev_frame.  The
      latter will truncate the frame chain, leading to this function
@@ -526,8 +526,8 @@ skip_artificial_frames (struct frame_info *frame)
   return frame;
 }
 
-struct frame_info *
-skip_unwritable_frames (struct frame_info *frame)
+frame_info_ptr 
+skip_unwritable_frames (frame_info_ptr frame)
 {
   while (gdbarch_code_of_frame_writable (get_frame_arch (frame), frame) == 0)
     {
@@ -541,8 +541,8 @@ skip_unwritable_frames (struct frame_info *frame)
 
 /* See frame.h.  */
 
-struct frame_info *
-skip_tailcall_frames (struct frame_info *frame)
+frame_info_ptr 
+skip_tailcall_frames (frame_info_ptr frame)
 {
   while (get_frame_type (frame) == TAILCALL_FRAME)
     {
@@ -560,7 +560,7 @@ skip_tailcall_frames (struct frame_info *frame)
    frame.  */
 
 static void
-compute_frame_id (struct frame_info *fi)
+compute_frame_id (frame_info_ptr fi)
 {
   FRAME_SCOPED_DEBUG_ENTER_EXIT;
 
@@ -606,7 +606,7 @@ compute_frame_id (struct frame_info *fi)
    frame.  */
 
 struct frame_id
-get_frame_id (struct frame_info *fi)
+get_frame_id (frame_info_ptr fi)
 {
   if (fi == NULL)
     return null_frame_id;
@@ -629,7 +629,7 @@ get_frame_id (struct frame_info *fi)
 
       /* Since this is the first frame in the chain, this should
 	 always succeed.  */
-      bool stashed = frame_stash_add (fi);
+      bool stashed = frame_stash_add (fi.get ());
       gdb_assert (stashed);
     }
 
@@ -637,15 +637,15 @@ get_frame_id (struct frame_info *fi)
 }
 
 struct frame_id
-get_stack_frame_id (struct frame_info *next_frame)
+get_stack_frame_id (frame_info_ptr next_frame)
 {
   return get_frame_id (skip_artificial_frames (next_frame));
 }
 
 struct frame_id
-frame_unwind_caller_id (struct frame_info *next_frame)
+frame_unwind_caller_id (frame_info_ptr next_frame)
 {
-  struct frame_info *this_frame;
+  frame_info_ptr this_frame;
 
   /* Use get_prev_frame_always, and not get_prev_frame.  The latter
      will truncate the frame chain, leading to this function
@@ -866,10 +866,10 @@ frame_id_inner (struct gdbarch *gdbarch, struct frame_id l, struct frame_id r)
   return inner;
 }
 
-struct frame_info *
+frame_info_ptr 
 frame_find_by_id (struct frame_id id)
 {
-  struct frame_info *frame, *prev_frame;
+  frame_info_ptr frame, prev_frame;
 
   /* ZERO denotes the null frame, let the caller decide what to do
      about it.  Should it instead return get_current_frame()?  */
@@ -878,7 +878,7 @@ frame_find_by_id (struct frame_id id)
 
   /* Check for the sentinel frame.  */
   if (id == sentinel_frame_id)
-    return sentinel_frame;
+    return frame_info_ptr (sentinel_frame);
 
   /* Try using the frame stash first.  Finding it there removes the need
      to perform the search by looping over all frames, which can be very
@@ -919,7 +919,7 @@ frame_find_by_id (struct frame_id id)
 }
 
 static CORE_ADDR
-frame_unwind_pc (struct frame_info *this_frame)
+frame_unwind_pc (frame_info_ptr this_frame)
 {
   if (this_frame->prev_pc.status == CC_UNKNOWN)
     {
@@ -994,7 +994,7 @@ frame_unwind_pc (struct frame_info *this_frame)
 }
 
 CORE_ADDR
-frame_unwind_caller_pc (struct frame_info *this_frame)
+frame_unwind_caller_pc (frame_info_ptr this_frame)
 {
   this_frame = skip_artificial_frames (this_frame);
 
@@ -1007,9 +1007,9 @@ frame_unwind_caller_pc (struct frame_info *this_frame)
 }
 
 bool
-get_frame_func_if_available (frame_info *this_frame, CORE_ADDR *pc)
+get_frame_func_if_available (frame_info_ptr this_frame, CORE_ADDR *pc)
 {
-  struct frame_info *next_frame = this_frame->next;
+  frame_info *next_frame = this_frame->next;
 
   if (next_frame->prev_func.status == CC_UNKNOWN)
     {
@@ -1050,7 +1050,7 @@ get_frame_func_if_available (frame_info *this_frame, CORE_ADDR *pc)
 }
 
 CORE_ADDR
-get_frame_func (struct frame_info *this_frame)
+get_frame_func (frame_info_ptr this_frame)
 {
   CORE_ADDR pc;
 
@@ -1061,7 +1061,7 @@ get_frame_func (struct frame_info *this_frame)
 }
 
 std::unique_ptr<readonly_detached_regcache>
-frame_save_as_regcache (struct frame_info *this_frame)
+frame_save_as_regcache (frame_info_ptr this_frame)
 {
   auto cooked_read = [this_frame] (int regnum, gdb_byte *buf)
     {
@@ -1078,9 +1078,9 @@ frame_save_as_regcache (struct frame_info *this_frame)
 }
 
 void
-frame_pop (struct frame_info *this_frame)
+frame_pop (frame_info_ptr this_frame)
 {
-  struct frame_info *prev_frame;
+  frame_info_ptr prev_frame;
 
   if (get_frame_type (this_frame) == DUMMY_FRAME)
     {
@@ -1127,7 +1127,7 @@ frame_pop (struct frame_info *this_frame)
 }
 
 void
-frame_register_unwind (frame_info *next_frame, int regnum,
+frame_register_unwind (frame_info_ptr next_frame, int regnum,
 		       int *optimizedp, int *unavailablep,
 		       enum lval_type *lvalp, CORE_ADDR *addrp,
 		       int *realnump, gdb_byte *bufferp)
@@ -1170,7 +1170,7 @@ frame_register_unwind (frame_info *next_frame, int regnum,
 }
 
 void
-frame_register (struct frame_info *frame, int regnum,
+frame_register (frame_info_ptr frame, int regnum,
 		int *optimizedp, int *unavailablep, enum lval_type *lvalp,
 		CORE_ADDR *addrp, int *realnump, gdb_byte *bufferp)
 {
@@ -1185,12 +1185,12 @@ frame_register (struct frame_info *frame, int regnum,
   /* Obtain the register value by unwinding the register from the next
      (more inner frame).  */
   gdb_assert (frame != NULL && frame->next != NULL);
-  frame_register_unwind (frame->next, regnum, optimizedp, unavailablep,
-			 lvalp, addrp, realnump, bufferp);
+  frame_register_unwind (frame_info_ptr (frame->next), regnum, optimizedp,
+			 unavailablep, lvalp, addrp, realnump, bufferp);
 }
 
 void
-frame_unwind_register (frame_info *next_frame, int regnum, gdb_byte *buf)
+frame_unwind_register (frame_info_ptr next_frame, int regnum, gdb_byte *buf)
 {
   int optimized;
   int unavailable;
@@ -1210,14 +1210,14 @@ frame_unwind_register (frame_info *next_frame, int regnum, gdb_byte *buf)
 }
 
 void
-get_frame_register (struct frame_info *frame,
+get_frame_register (frame_info_ptr frame,
 		    int regnum, gdb_byte *buf)
 {
-  frame_unwind_register (frame->next, regnum, buf);
+  frame_unwind_register (frame_info_ptr (frame->next), regnum, buf);
 }
 
 struct value *
-frame_unwind_register_value (frame_info *next_frame, int regnum)
+frame_unwind_register_value (frame_info_ptr next_frame, int regnum)
 {
   FRAME_SCOPED_DEBUG_ENTER_EXIT;
 
@@ -1280,13 +1280,13 @@ frame_unwind_register_value (frame_info *next_frame, int regnum)
 }
 
 struct value *
-get_frame_register_value (struct frame_info *frame, int regnum)
+get_frame_register_value (frame_info_ptr frame, int regnum)
 {
-  return frame_unwind_register_value (frame->next, regnum);
+  return frame_unwind_register_value (frame_info_ptr (frame->next), regnum);
 }
 
 LONGEST
-frame_unwind_register_signed (frame_info *next_frame, int regnum)
+frame_unwind_register_signed (frame_info_ptr next_frame, int regnum)
 {
   struct gdbarch *gdbarch = frame_unwind_arch (next_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
@@ -1312,13 +1312,13 @@ frame_unwind_register_signed (frame_info *next_frame, int regnum)
 }
 
 LONGEST
-get_frame_register_signed (struct frame_info *frame, int regnum)
+get_frame_register_signed (frame_info_ptr frame, int regnum)
 {
-  return frame_unwind_register_signed (frame->next, regnum);
+  return frame_unwind_register_signed (frame_info_ptr (frame->next), regnum);
 }
 
 ULONGEST
-frame_unwind_register_unsigned (frame_info *next_frame, int regnum)
+frame_unwind_register_unsigned (frame_info_ptr next_frame, int regnum)
 {
   struct gdbarch *gdbarch = frame_unwind_arch (next_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
@@ -1346,13 +1346,13 @@ frame_unwind_register_unsigned (frame_info *next_frame, int regnum)
 }
 
 ULONGEST
-get_frame_register_unsigned (struct frame_info *frame, int regnum)
+get_frame_register_unsigned (frame_info_ptr frame, int regnum)
 {
-  return frame_unwind_register_unsigned (frame->next, regnum);
+  return frame_unwind_register_unsigned (frame_info_ptr (frame->next), regnum);
 }
 
 bool
-read_frame_register_unsigned (frame_info *frame, int regnum,
+read_frame_register_unsigned (frame_info_ptr frame, int regnum,
 			      ULONGEST *val)
 {
   struct value *regval = get_frame_register_value (frame, regnum);
@@ -1373,7 +1373,7 @@ read_frame_register_unsigned (frame_info *frame, int regnum,
 }
 
 void
-put_frame_register (struct frame_info *frame, int regnum,
+put_frame_register (frame_info_ptr frame, int regnum,
 		    const gdb_byte *buf)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
@@ -1411,7 +1411,7 @@ put_frame_register (struct frame_info *frame, int regnum,
    Returns 0 if the register value could not be found.  */
 
 bool
-deprecated_frame_register_read (frame_info *frame, int regnum,
+deprecated_frame_register_read (frame_info_ptr frame, int regnum,
 				gdb_byte *myaddr)
 {
   int optimized;
@@ -1427,7 +1427,7 @@ deprecated_frame_register_read (frame_info *frame, int regnum,
 }
 
 bool
-get_frame_register_bytes (frame_info *frame, int regnum,
+get_frame_register_bytes (frame_info_ptr frame, int regnum,
 			  CORE_ADDR offset,
 			  gdb::array_view<gdb_byte> buffer,
 			  int *optimizedp, int *unavailablep)
@@ -1485,8 +1485,9 @@ get_frame_register_bytes (frame_info *frame, int regnum,
 	}
       else
 	{
-	  struct value *value = frame_unwind_register_value (frame->next,
-							     regnum);
+	  struct value *value
+	    = frame_unwind_register_value (frame_info_ptr (frame->next),
+					   regnum);
 	  gdb_assert (value != NULL);
 	  *optimizedp = value_optimized_out (value);
 	  *unavailablep = !value_entirely_available (value);
@@ -1515,7 +1516,7 @@ get_frame_register_bytes (frame_info *frame, int regnum,
 }
 
 void
-put_frame_register_bytes (struct frame_info *frame, int regnum,
+put_frame_register_bytes (frame_info_ptr frame, int regnum,
 			  CORE_ADDR offset,
 			  gdb::array_view<const gdb_byte> buffer)
 {
@@ -1544,8 +1545,9 @@ put_frame_register_bytes (struct frame_info *frame, int regnum,
 	}
       else
 	{
-	  struct value *value = frame_unwind_register_value (frame->next,
-							     regnum);
+	  struct value *value
+	    = frame_unwind_register_value (frame_info_ptr (frame->next),
+					   regnum);
 	  gdb_assert (value != NULL);
 
 	  memcpy ((char *) value_contents_writeable (value).data () + offset,
@@ -1564,10 +1566,10 @@ put_frame_register_bytes (struct frame_info *frame, int regnum,
 
 /* Create a sentinel frame.  */
 
-static struct frame_info *
+static frame_info *
 create_sentinel_frame (struct program_space *pspace, struct regcache *regcache)
 {
-  struct frame_info *frame = FRAME_OBSTACK_ZALLOC (struct frame_info);
+  frame_info *frame = FRAME_OBSTACK_ZALLOC (struct frame_info);
 
   frame->level = -1;
   frame->pspace = pspace;
@@ -1605,12 +1607,12 @@ frame_obstack_zalloc (unsigned long size)
   return data;
 }
 
-static struct frame_info *get_prev_frame_always_1 (struct frame_info *this_frame);
+static frame_info_ptr get_prev_frame_always_1 (frame_info_ptr this_frame);
 
-struct frame_info *
+frame_info_ptr 
 get_current_frame (void)
 {
-  struct frame_info *current_frame;
+  frame_info_ptr current_frame;
 
   /* First check, and report, the lack of registers.  Having GDB
      report "No stack!" or "No memory" when the target doesn't even
@@ -1642,7 +1644,7 @@ get_current_frame (void)
      want to leave with the current frame created and linked in --
      we should never end up with the sentinel frame as outermost
      frame.  */
-  current_frame = get_prev_frame_always_1 (sentinel_frame);
+  current_frame = get_prev_frame_always_1 (frame_info_ptr (sentinel_frame));
   gdb_assert (current_frame != NULL);
 
   return current_frame;
@@ -1673,7 +1675,7 @@ static int selected_frame_level = -1;
 
 /* The cached frame_info object pointing to the selected frame.
    Looked up on demand by get_selected_frame.  */
-static struct frame_info *selected_frame;
+static frame_info_ptr selected_frame;
 
 /* See frame.h.  */
 
@@ -1711,7 +1713,7 @@ restore_selected_frame (frame_id frame_id, int frame_level)
 void
 lookup_selected_frame (struct frame_id a_frame_id, int frame_level)
 {
-  struct frame_info *frame = NULL;
+  frame_info_ptr frame = NULL;
   int count;
 
   /* This either means there was no selected frame, or the selected
@@ -1801,7 +1803,7 @@ has_stack_frames ()
 
 /* See frame.h.  */
 
-struct frame_info *
+frame_info_ptr 
 get_selected_frame (const char *message)
 {
   if (selected_frame == NULL)
@@ -1820,7 +1822,7 @@ get_selected_frame (const char *message)
    the inferior does not have a frame; in that case it will return
    NULL instead of calling error().  */
 
-struct frame_info *
+frame_info_ptr 
 deprecated_safe_get_selected_frame (void)
 {
   if (!has_stack_frames ())
@@ -1831,7 +1833,7 @@ deprecated_safe_get_selected_frame (void)
 /* Select frame FI (or NULL - to invalidate the selected frame).  */
 
 void
-select_frame (struct frame_info *fi)
+select_frame (frame_info_ptr fi)
 {
   selected_frame = fi;
   selected_frame_level = frame_relative_level (fi);
@@ -1905,10 +1907,10 @@ select_frame (struct frame_info *fi)
 /* Create an arbitrary (i.e. address specified by user) or innermost frame.
    Always returns a non-NULL value.  */
 
-struct frame_info *
+frame_info_ptr 
 create_new_frame (CORE_ADDR addr, CORE_ADDR pc)
 {
-  struct frame_info *fi;
+  frame_info *fi;
 
   frame_debug_printf ("addr=%s, pc=%s", hex_string (addr), hex_string (pc));
 
@@ -1930,25 +1932,25 @@ create_new_frame (CORE_ADDR addr, CORE_ADDR pc)
 
   /* Select/initialize both the unwind function and the frame's type
      based on the PC.  */
-  frame_unwind_find_by_frame (fi, &fi->prologue_cache);
+  frame_unwind_find_by_frame (frame_info_ptr (fi), &fi->prologue_cache);
 
   fi->this_id.p = frame_id_status::COMPUTED;
   fi->this_id.value = frame_id_build (addr, pc);
 
   frame_debug_printf ("  -> %s", fi->to_string ().c_str ());
 
-  return fi;
+  return frame_info_ptr (fi);
 }
 
 /* Return the frame that THIS_FRAME calls (NULL if THIS_FRAME is the
    innermost frame).  Be careful to not fall off the bottom of the
    frame chain and onto the sentinel frame.  */
 
-struct frame_info *
-get_next_frame (struct frame_info *this_frame)
+frame_info_ptr 
+get_next_frame (frame_info_ptr this_frame)
 {
   if (this_frame->level > 0)
-    return this_frame->next;
+    return frame_info_ptr (this_frame->next);
   else
     return NULL;
 }
@@ -1957,8 +1959,8 @@ get_next_frame (struct frame_info *this_frame)
    innermost (i.e. current) frame, return the sentinel frame.  Thus,
    unlike get_next_frame(), NULL will never be returned.  */
 
-struct frame_info *
-get_next_frame_sentinel_okay (struct frame_info *this_frame)
+frame_info_ptr 
+get_next_frame_sentinel_okay (frame_info_ptr this_frame)
 {
   gdb_assert (this_frame != NULL);
 
@@ -1969,7 +1971,7 @@ get_next_frame_sentinel_okay (struct frame_info *this_frame)
      is likely a coding error.  */
   gdb_assert (this_frame != sentinel_frame);
 
-  return this_frame->next;
+  return frame_info_ptr (this_frame->next);
 }
 
 /* Observer for the target_changed event.  */
@@ -1985,12 +1987,10 @@ frame_observer_target_changed (struct target_ops *target)
 void
 reinit_frame_cache (void)
 {
-  struct frame_info *fi;
-
   ++frame_cache_generation;
 
   /* Tear down all frame caches.  */
-  for (fi = sentinel_frame; fi != NULL; fi = fi->prev)
+  for (frame_info *fi = sentinel_frame; fi != NULL; fi = fi->prev)
     {
       if (fi->prologue_cache && fi->unwind->dealloc_cache)
 	fi->unwind->dealloc_cache (fi, fi->prologue_cache);
@@ -2020,7 +2020,7 @@ reinit_frame_cache (void)
    relative to this particular frame.  */
 
 static void
-frame_register_unwind_location (struct frame_info *this_frame, int regnum,
+frame_register_unwind_location (frame_info_ptr this_frame, int regnum,
 				int *optimizedp, enum lval_type *lvalp,
 				CORE_ADDR *addrp, int *realnump)
 {
@@ -2063,10 +2063,10 @@ frame_register_unwind_location (struct frame_info *this_frame, int regnum,
    then the frame_id of the inline frame, calculated based off the frame_id
    of the previous frame, should also be a duplicate.  */
 
-static struct frame_info *
-get_prev_frame_maybe_check_cycle (struct frame_info *this_frame)
+static frame_info_ptr 
+get_prev_frame_maybe_check_cycle (frame_info_ptr this_frame)
 {
-  struct frame_info *prev_frame = get_prev_frame_raw (this_frame);
+  frame_info_ptr prev_frame = get_prev_frame_raw (this_frame);
 
   /* Don't compute the frame id of the current frame yet.  Unwinding
      the sentinel frame can fail (e.g., if the thread is gone and we
@@ -2120,7 +2120,7 @@ get_prev_frame_maybe_check_cycle (struct frame_info *this_frame)
 	 PREV_FRAME into the cache; if PREV_FRAME is unique then we do want
 	 it in the cache, but if it is a duplicate and CYCLE_DETECTION_P is
 	 false, then we don't want to unlink it.  */
-      if (!frame_stash_add (prev_frame) && cycle_detection_p)
+      if (!frame_stash_add (prev_frame.get ()) && cycle_detection_p)
 	{
 	  /* Another frame with the same id was already in the stash.  We just
 	     detected a cycle.  */
@@ -2151,8 +2151,8 @@ get_prev_frame_maybe_check_cycle (struct frame_info *this_frame)
    TRY_CATCH block.  Return the frame that called THIS_FRAME or NULL if
    there is no such frame.  This may throw an exception.  */
 
-static struct frame_info *
-get_prev_frame_always_1 (struct frame_info *this_frame)
+static frame_info_ptr 
+get_prev_frame_always_1 (frame_info_ptr this_frame)
 {
   FRAME_SCOPED_DEBUG_ENTER_EXIT;
 
@@ -2178,7 +2178,7 @@ get_prev_frame_always_1 (struct frame_info *this_frame)
 	frame_debug_printf
 	  ("  -> nullptr // %s // cached",
 	   frame_stop_reason_symbol_string (this_frame->stop_reason));
-      return this_frame->prev;
+      return frame_info_ptr (this_frame->prev);
     }
 
   /* If the frame unwinder hasn't been selected yet, we must do so
@@ -2236,9 +2236,9 @@ get_prev_frame_always_1 (struct frame_info *this_frame)
      See the comment at frame_id_inner for details.  */
   if (get_frame_type (this_frame) == NORMAL_FRAME
       && this_frame->next->unwind->type == NORMAL_FRAME
-      && frame_id_inner (get_frame_arch (this_frame->next),
+      && frame_id_inner (get_frame_arch (frame_info_ptr (this_frame->next)),
 			 get_frame_id (this_frame),
-			 get_frame_id (this_frame->next)))
+			 get_frame_id (frame_info_ptr (this_frame->next))))
     {
       CORE_ADDR this_pc_in_block;
       struct minimal_symbol *morestack_msym;
@@ -2274,8 +2274,8 @@ get_prev_frame_always_1 (struct frame_info *this_frame)
   if (this_frame->level > 0
       && gdbarch_pc_regnum (gdbarch) >= 0
       && get_frame_type (this_frame) == NORMAL_FRAME
-      && (get_frame_type (this_frame->next) == NORMAL_FRAME
-	  || get_frame_type (this_frame->next) == INLINE_FRAME))
+      && (get_frame_type (frame_info_ptr (this_frame->next)) == NORMAL_FRAME
+	  || get_frame_type (frame_info_ptr (this_frame->next)) == INLINE_FRAME))
     {
       int optimized, realnum, nrealnum;
       enum lval_type lval, nlval;
@@ -2307,10 +2307,10 @@ get_prev_frame_always_1 (struct frame_info *this_frame)
    Unlike get_prev_frame, this function always tries to unwind the
    frame.  */
 
-struct frame_info *
-get_prev_frame_always (struct frame_info *this_frame)
+frame_info_ptr 
+get_prev_frame_always (frame_info_ptr this_frame)
 {
-  struct frame_info *prev_frame = NULL;
+  frame_info_ptr prev_frame = NULL;
 
   try
     {
@@ -2347,10 +2347,10 @@ get_prev_frame_always (struct frame_info *this_frame)
 /* Construct a new "struct frame_info" and link it previous to
    this_frame.  */
 
-static struct frame_info *
-get_prev_frame_raw (struct frame_info *this_frame)
+static frame_info_ptr 
+get_prev_frame_raw (frame_info_ptr this_frame)
 {
-  struct frame_info *prev_frame;
+  frame_info *prev_frame;
 
   /* Allocate the new frame but do not wire it in to the frame chain.
      Some (bad) code in INIT_FRAME_EXTRA_INFO tries to look along
@@ -2391,17 +2391,17 @@ get_prev_frame_raw (struct frame_info *this_frame)
 
   /* Link it in.  */
   this_frame->prev = prev_frame;
-  prev_frame->next = this_frame;
+  prev_frame->next = this_frame.get ();
 
   frame_debug_printf ("  -> %s", prev_frame->to_string ().c_str ());
 
-  return prev_frame;
+  return frame_info_ptr (prev_frame);
 }
 
 /* Debug routine to print a NULL frame being returned.  */
 
 static void
-frame_debug_got_null_frame (struct frame_info *this_frame,
+frame_debug_got_null_frame (frame_info_ptr this_frame,
 			    const char *reason)
 {
   if (frame_debug)
@@ -2416,7 +2416,7 @@ frame_debug_got_null_frame (struct frame_info *this_frame,
 /* Is this (non-sentinel) frame in the "main"() function?  */
 
 static bool
-inside_main_func (frame_info *this_frame)
+inside_main_func (frame_info_ptr this_frame)
 {
   if (current_program_space->symfile_object_file == nullptr)
     return false;
@@ -2453,7 +2453,7 @@ inside_main_func (frame_info *this_frame)
 /* Test whether THIS_FRAME is inside the process entry point function.  */
 
 static bool
-inside_entry_func (frame_info *this_frame)
+inside_entry_func (frame_info_ptr this_frame)
 {
   CORE_ADDR entry_point;
 
@@ -2472,8 +2472,8 @@ inside_entry_func (frame_info *this_frame)
    This function should not contain target-dependent tests, such as
    checking whether the program-counter is zero.  */
 
-struct frame_info *
-get_prev_frame (struct frame_info *this_frame)
+frame_info_ptr 
+get_prev_frame (frame_info_ptr this_frame)
 {
   FRAME_SCOPED_DEBUG_ENTER_EXIT;
 
@@ -2571,21 +2571,21 @@ get_prev_frame (struct frame_info *this_frame)
 }
 
 CORE_ADDR
-get_frame_pc (struct frame_info *frame)
+get_frame_pc (frame_info_ptr frame)
 {
   gdb_assert (frame->next != NULL);
-  return frame_unwind_pc (frame->next);
+  return frame_unwind_pc (frame_info_ptr (frame->next));
 }
 
 bool
-get_frame_pc_if_available (frame_info *frame, CORE_ADDR *pc)
+get_frame_pc_if_available (frame_info_ptr frame, CORE_ADDR *pc)
 {
 
   gdb_assert (frame->next != NULL);
 
   try
     {
-      *pc = frame_unwind_pc (frame->next);
+      *pc = frame_unwind_pc (frame_info_ptr (frame->next));
     }
   catch (const gdb_exception_error &ex)
     {
@@ -2601,12 +2601,12 @@ get_frame_pc_if_available (frame_info *frame, CORE_ADDR *pc)
 /* Return an address that falls within THIS_FRAME's code block.  */
 
 CORE_ADDR
-get_frame_address_in_block (struct frame_info *this_frame)
+get_frame_address_in_block (frame_info_ptr this_frame)
 {
   /* A draft address.  */
   CORE_ADDR pc = get_frame_pc (this_frame);
 
-  struct frame_info *next_frame = this_frame->next;
+  frame_info_ptr next_frame (this_frame->next);
 
   /* Calling get_frame_pc returns the resume address for THIS_FRAME.
      Normally the resume address is inside the body of the function
@@ -2648,7 +2648,7 @@ get_frame_address_in_block (struct frame_info *this_frame)
      "calling" normal function should not be adjusted either.  */
 
   while (get_frame_type (next_frame) == INLINE_FRAME)
-    next_frame = next_frame->next;
+    next_frame = frame_info_ptr (next_frame->next);
 
   if ((get_frame_type (next_frame) == NORMAL_FRAME
        || get_frame_type (next_frame) == TAILCALL_FRAME)
@@ -2661,7 +2661,7 @@ get_frame_address_in_block (struct frame_info *this_frame)
 }
 
 bool
-get_frame_address_in_block_if_available (frame_info *this_frame,
+get_frame_address_in_block_if_available (frame_info_ptr this_frame,
 					 CORE_ADDR *pc)
 {
 
@@ -2680,9 +2680,9 @@ get_frame_address_in_block_if_available (frame_info *this_frame,
 }
 
 symtab_and_line
-find_frame_sal (frame_info *frame)
+find_frame_sal (frame_info_ptr frame)
 {
-  struct frame_info *next_frame;
+  frame_info_ptr next_frame;
   int notcurrent;
   CORE_ADDR pc;
 
@@ -2738,7 +2738,7 @@ find_frame_sal (frame_info *frame)
 /* Per "frame.h", return the ``address'' of the frame.  Code should
    really be using get_frame_id().  */
 CORE_ADDR
-get_frame_base (struct frame_info *fi)
+get_frame_base (frame_info_ptr fi)
 {
   return get_frame_id (fi).stack_addr;
 }
@@ -2746,7 +2746,7 @@ get_frame_base (struct frame_info *fi)
 /* High-level offsets into the frame.  Used by the debug info.  */
 
 CORE_ADDR
-get_frame_base_address (struct frame_info *fi)
+get_frame_base_address (frame_info_ptr fi)
 {
   if (get_frame_type (fi) != NORMAL_FRAME)
     return 0;
@@ -2760,7 +2760,7 @@ get_frame_base_address (struct frame_info *fi)
 }
 
 CORE_ADDR
-get_frame_locals_address (struct frame_info *fi)
+get_frame_locals_address (frame_info_ptr fi)
 {
   if (get_frame_type (fi) != NORMAL_FRAME)
     return 0;
@@ -2775,7 +2775,7 @@ get_frame_locals_address (struct frame_info *fi)
 }
 
 CORE_ADDR
-get_frame_args_address (struct frame_info *fi)
+get_frame_args_address (frame_info_ptr fi)
 {
   if (get_frame_type (fi) != NORMAL_FRAME)
     return 0;
@@ -2793,7 +2793,7 @@ get_frame_args_address (struct frame_info *fi)
    otherwise.  */
 
 bool
-frame_unwinder_is (frame_info *fi, const frame_unwind *unwinder)
+frame_unwinder_is (frame_info_ptr fi, const frame_unwind *unwinder)
 {
   if (fi->unwind == nullptr)
     frame_unwind_find_by_frame (fi, &fi->prologue_cache);
@@ -2805,7 +2805,7 @@ frame_unwinder_is (frame_info *fi, const frame_unwind *unwinder)
    or -1 for a NULL frame.  */
 
 int
-frame_relative_level (struct frame_info *fi)
+frame_relative_level (frame_info_ptr fi)
 {
   if (fi == NULL)
     return -1;
@@ -2814,7 +2814,7 @@ frame_relative_level (struct frame_info *fi)
 }
 
 enum frame_type
-get_frame_type (struct frame_info *frame)
+get_frame_type (frame_info_ptr frame)
 {
   if (frame->unwind == NULL)
     /* Initialize the frame's unwinder because that's what
@@ -2824,13 +2824,13 @@ get_frame_type (struct frame_info *frame)
 }
 
 struct program_space *
-get_frame_program_space (struct frame_info *frame)
+get_frame_program_space (frame_info_ptr frame)
 {
   return frame->pspace;
 }
 
 struct program_space *
-frame_unwind_program_space (struct frame_info *this_frame)
+frame_unwind_program_space (frame_info_ptr this_frame)
 {
   gdb_assert (this_frame);
 
@@ -2841,7 +2841,7 @@ frame_unwind_program_space (struct frame_info *this_frame)
 }
 
 const address_space *
-get_frame_address_space (struct frame_info *frame)
+get_frame_address_space (frame_info_ptr frame)
 {
   return frame->aspace;
 }
@@ -2849,14 +2849,14 @@ get_frame_address_space (struct frame_info *frame)
 /* Memory access methods.  */
 
 void
-get_frame_memory (struct frame_info *this_frame, CORE_ADDR addr,
+get_frame_memory (frame_info_ptr this_frame, CORE_ADDR addr,
 		  gdb::array_view<gdb_byte> buffer)
 {
   read_memory (addr, buffer.data (), buffer.size ());
 }
 
 LONGEST
-get_frame_memory_signed (struct frame_info *this_frame, CORE_ADDR addr,
+get_frame_memory_signed (frame_info_ptr this_frame, CORE_ADDR addr,
 			 int len)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
@@ -2866,7 +2866,7 @@ get_frame_memory_signed (struct frame_info *this_frame, CORE_ADDR addr,
 }
 
 ULONGEST
-get_frame_memory_unsigned (struct frame_info *this_frame, CORE_ADDR addr,
+get_frame_memory_unsigned (frame_info_ptr this_frame, CORE_ADDR addr,
 			   int len)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
@@ -2876,7 +2876,7 @@ get_frame_memory_unsigned (struct frame_info *this_frame, CORE_ADDR addr,
 }
 
 bool
-safe_frame_unwind_memory (struct frame_info *this_frame,
+safe_frame_unwind_memory (frame_info_ptr this_frame,
 			  CORE_ADDR addr, gdb::array_view<gdb_byte> buffer)
 {
   /* NOTE: target_read_memory returns zero on success!  */
@@ -2886,13 +2886,13 @@ safe_frame_unwind_memory (struct frame_info *this_frame,
 /* Architecture methods.  */
 
 struct gdbarch *
-get_frame_arch (struct frame_info *this_frame)
+get_frame_arch (frame_info_ptr this_frame)
 {
-  return frame_unwind_arch (this_frame->next);
+  return frame_unwind_arch (frame_info_ptr (this_frame->next));
 }
 
 struct gdbarch *
-frame_unwind_arch (struct frame_info *next_frame)
+frame_unwind_arch (frame_info_ptr next_frame)
 {
   if (!next_frame->prev_arch.p)
     {
@@ -2918,7 +2918,7 @@ frame_unwind_arch (struct frame_info *next_frame)
 }
 
 struct gdbarch *
-frame_unwind_caller_arch (struct frame_info *next_frame)
+frame_unwind_caller_arch (frame_info_ptr next_frame)
 {
   next_frame = skip_artificial_frames (next_frame);
 
@@ -2933,7 +2933,7 @@ frame_unwind_caller_arch (struct frame_info *next_frame)
 /* Gets the language of FRAME.  */
 
 enum language
-get_frame_language (struct frame_info *frame)
+get_frame_language (frame_info_ptr frame)
 {
   CORE_ADDR pc = 0;
   bool pc_p = false;
@@ -2974,19 +2974,19 @@ get_frame_language (struct frame_info *frame)
 /* Stack pointer methods.  */
 
 CORE_ADDR
-get_frame_sp (struct frame_info *this_frame)
+get_frame_sp (frame_info_ptr this_frame)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
 
   /* NOTE drow/2008-06-28: gdbarch_unwind_sp could be converted to
      operate on THIS_FRAME now.  */
-  return gdbarch_unwind_sp (gdbarch, this_frame->next);
+  return gdbarch_unwind_sp (gdbarch, frame_info_ptr (this_frame->next));
 }
 
 /* Return the reason why we can't unwind past FRAME.  */
 
 enum unwind_stop_reason
-get_frame_unwind_stop_reason (struct frame_info *frame)
+get_frame_unwind_stop_reason (frame_info_ptr frame)
 {
   /* Fill-in STOP_REASON.  */
   get_prev_frame_always (frame);
@@ -3014,7 +3014,7 @@ unwind_stop_reason_to_string (enum unwind_stop_reason reason)
 }
 
 const char *
-frame_stop_reason_string (struct frame_info *fi)
+frame_stop_reason_string (frame_info_ptr fi)
 {
   gdb_assert (fi->prev_p);
   gdb_assert (fi->prev == NULL);
@@ -3050,7 +3050,7 @@ frame_stop_reason_symbol_string (enum unwind_stop_reason reason)
    FRAME.  */
 
 void
-frame_cleanup_after_sniffer (struct frame_info *frame)
+frame_cleanup_after_sniffer (frame_info_ptr frame)
 {
   /* The sniffer should not allocate a prologue cache if it did not
      match this frame.  */
@@ -3080,7 +3080,7 @@ frame_cleanup_after_sniffer (struct frame_info *frame)
    frame_cleanup_after_sniffer.  */
 
 void
-frame_prepare_for_sniffer (struct frame_info *frame,
+frame_prepare_for_sniffer (frame_info_ptr frame,
 			   const struct frame_unwind *unwind)
 {
   gdb_assert (frame->unwind == NULL);
diff --git a/gdb/frame.h b/gdb/frame.h
index 9ad2599331f..759cd32c5e3 100644
--- a/gdb/frame.h
+++ b/gdb/frame.h
@@ -111,7 +111,7 @@ enum frame_id_stack_status
 
 /* The frame object.  */
 
-struct frame_info;
+class frame_info_ptr;
 
 /* The frame object's ID.  This provides a per-frame unique identifier
    that can be used to relocate a `struct frame_info' after a target
@@ -324,7 +324,7 @@ enum frame_type
 /* On demand, create the inner most frame using information found in
    the inferior.  If the inner most frame can't be created, throw an
    error.  */
-extern struct frame_info *get_current_frame (void);
+extern frame_info_ptr get_current_frame (void);
 
 /* Does the current target interface have enough state to be able to
    query the current inferior for frame info, and is the inferior in a
@@ -349,11 +349,11 @@ extern void reinit_frame_cache (void);
    It should instead, when a thread has previously had its frame
    selected (but not resumed) and the frame cache invalidated, find
    and then return that thread's previously selected frame.  */
-extern struct frame_info *get_selected_frame (const char *message = nullptr);
+extern frame_info_ptr get_selected_frame (const char *message = nullptr);
 
 /* Select a specific frame.  NULL implies re-select the inner most
    frame.  */
-extern void select_frame (struct frame_info *);
+extern void select_frame (frame_info_ptr );
 
 /* Save the frame ID and frame level of the selected frame in FRAME_ID
    and FRAME_LEVEL, to be restored later with restore_selected_frame.
@@ -385,23 +385,23 @@ extern void lookup_selected_frame (frame_id frame_id, int frame_level);
 
 /* Given a FRAME, return the next (more inner, younger) or previous
    (more outer, older) frame.  */
-extern struct frame_info *get_prev_frame (struct frame_info *);
-extern struct frame_info *get_next_frame (struct frame_info *);
+extern frame_info_ptr get_prev_frame (frame_info_ptr );
+extern frame_info_ptr get_next_frame (frame_info_ptr );
 
 /* Like get_next_frame(), but allows return of the sentinel frame.  NULL
    is never returned.  */
-extern struct frame_info *get_next_frame_sentinel_okay (struct frame_info *);
+extern frame_info_ptr get_next_frame_sentinel_okay (frame_info_ptr );
 
 /* Return a "struct frame_info" corresponding to the frame that called
    THIS_FRAME.  Returns NULL if there is no such frame.
 
    Unlike get_prev_frame, this function always tries to unwind the
    frame.  */
-extern struct frame_info *get_prev_frame_always (struct frame_info *);
+extern frame_info_ptr get_prev_frame_always (frame_info_ptr );
 
 /* Given a frame's ID, relocate the frame.  Returns NULL if the frame
    is not found.  */
-extern struct frame_info *frame_find_by_id (struct frame_id id);
+extern frame_info_ptr frame_find_by_id (struct frame_id id);
 
 /* Base attributes of a frame: */
 
@@ -409,12 +409,12 @@ extern struct frame_info *frame_find_by_id (struct frame_id id);
    this frame.
 
    This replaced: frame->pc; */
-extern CORE_ADDR get_frame_pc (struct frame_info *);
+extern CORE_ADDR get_frame_pc (frame_info_ptr );
 
 /* Same as get_frame_pc, but return a boolean indication of whether
    the PC is actually available, instead of throwing an error.  */
 
-extern bool get_frame_pc_if_available (frame_info *frame, CORE_ADDR *pc);
+extern bool get_frame_pc_if_available (frame_info_ptr frame, CORE_ADDR *pc);
 
 /* An address (not necessarily aligned to an instruction boundary)
    that falls within THIS frame's code block.
@@ -429,32 +429,32 @@ extern bool get_frame_pc_if_available (frame_info *frame, CORE_ADDR *pc);
    function returns the frame's PC-1 which "should" be an address in
    the frame's block.  */
 
-extern CORE_ADDR get_frame_address_in_block (struct frame_info *this_frame);
+extern CORE_ADDR get_frame_address_in_block (frame_info_ptr this_frame);
 
 /* Same as get_frame_address_in_block, but returns a boolean
    indication of whether the frame address is determinable (when the
    PC is unavailable, it will not be), instead of possibly throwing an
    error trying to read an unavailable PC.  */
 
-extern bool get_frame_address_in_block_if_available (frame_info *this_frame,
+extern bool get_frame_address_in_block_if_available (frame_info_ptr this_frame,
 						     CORE_ADDR *pc);
 
 /* The frame's inner-most bound.  AKA the stack-pointer.  Confusingly
    known as top-of-stack.  */
 
-extern CORE_ADDR get_frame_sp (struct frame_info *);
+extern CORE_ADDR get_frame_sp (frame_info_ptr );
 
 /* Following on from the `resume' address.  Return the entry point
    address of the function containing that resume address, or zero if
    that function isn't known.  */
-extern CORE_ADDR get_frame_func (struct frame_info *fi);
+extern CORE_ADDR get_frame_func (frame_info_ptr fi);
 
 /* Same as get_frame_func, but returns a boolean indication of whether
    the frame function is determinable (when the PC is unavailable, it
    will not be), instead of possibly throwing an error trying to read
    an unavailable PC.  */
 
-extern bool get_frame_func_if_available (frame_info *fi, CORE_ADDR *);
+extern bool get_frame_func_if_available (frame_info_ptr fi, CORE_ADDR *);
 
 /* Closely related to the resume address, various symbol table
    attributes that are determined by the PC.  Note that for a normal
@@ -474,12 +474,12 @@ extern bool get_frame_func_if_available (frame_info *fi, CORE_ADDR *);
    find_frame_symtab(), find_frame_function().  Each will need to be
    carefully considered to determine if the real intent was for it to
    apply to the PC or the adjusted PC.  */
-extern symtab_and_line find_frame_sal (frame_info *frame);
+extern symtab_and_line find_frame_sal (frame_info_ptr frame);
 
 /* Set the current source and line to the location given by frame
    FRAME, if possible.  */
 
-void set_current_sal_from_frame (struct frame_info *);
+void set_current_sal_from_frame (frame_info_ptr );
 
 /* Return the frame base (what ever that is) (DEPRECATED).
 
@@ -503,52 +503,52 @@ void set_current_sal_from_frame (struct frame_info *);
 
    This replaced: frame->frame; */
 
-extern CORE_ADDR get_frame_base (struct frame_info *);
+extern CORE_ADDR get_frame_base (frame_info_ptr );
 
 /* Return the per-frame unique identifer.  Can be used to relocate a
    frame after a frame cache flush (and other similar operations).  If
    FI is NULL, return the null_frame_id.  */
-extern struct frame_id get_frame_id (struct frame_info *fi);
-extern struct frame_id get_stack_frame_id (struct frame_info *fi);
-extern struct frame_id frame_unwind_caller_id (struct frame_info *next_frame);
+extern struct frame_id get_frame_id (frame_info_ptr fi);
+extern struct frame_id get_stack_frame_id (frame_info_ptr fi);
+extern struct frame_id frame_unwind_caller_id (frame_info_ptr next_frame);
 
 /* Assuming that a frame is `normal', return its base-address, or 0 if
    the information isn't available.  NOTE: This address is really only
    meaningful to the frame's high-level debug info.  */
-extern CORE_ADDR get_frame_base_address (struct frame_info *);
+extern CORE_ADDR get_frame_base_address (frame_info_ptr );
 
 /* Assuming that a frame is `normal', return the base-address of the
    local variables, or 0 if the information isn't available.  NOTE:
    This address is really only meaningful to the frame's high-level
    debug info.  Typically, the argument and locals share a single
    base-address.  */
-extern CORE_ADDR get_frame_locals_address (struct frame_info *);
+extern CORE_ADDR get_frame_locals_address (frame_info_ptr );
 
 /* Assuming that a frame is `normal', return the base-address of the
    parameter list, or 0 if that information isn't available.  NOTE:
    This address is really only meaningful to the frame's high-level
    debug info.  Typically, the argument and locals share a single
    base-address.  */
-extern CORE_ADDR get_frame_args_address (struct frame_info *);
+extern CORE_ADDR get_frame_args_address (frame_info_ptr );
 
 /* The frame's level: 0 for innermost, 1 for its caller, ...; or -1
    for an invalid frame).  */
-extern int frame_relative_level (struct frame_info *fi);
+extern int frame_relative_level (frame_info_ptr fi);
 
 /* Return the frame's type.  */
 
-extern enum frame_type get_frame_type (struct frame_info *);
+extern enum frame_type get_frame_type (frame_info_ptr );
 
 /* Return the frame's program space.  */
-extern struct program_space *get_frame_program_space (struct frame_info *);
+extern struct program_space *get_frame_program_space (frame_info_ptr );
 
 /* Unwind THIS frame's program space from the NEXT frame.  */
-extern struct program_space *frame_unwind_program_space (struct frame_info *);
+extern struct program_space *frame_unwind_program_space (frame_info_ptr );
 
 class address_space;
 
 /* Return the frame's address space.  */
-extern const address_space *get_frame_address_space (struct frame_info *);
+extern const address_space *get_frame_address_space (frame_info_ptr );
 
 /* For frames where we can not unwind further, describe why.  */
 
@@ -568,7 +568,7 @@ enum unwind_stop_reason
 
 /* Return the reason why we can't unwind past this frame.  */
 
-enum unwind_stop_reason get_frame_unwind_stop_reason (struct frame_info *);
+enum unwind_stop_reason get_frame_unwind_stop_reason (frame_info_ptr );
 
 /* Translate a reason code to an informative string.  This converts the
    generic stop reason codes into a generic string describing the code.
@@ -585,13 +585,13 @@ const char *unwind_stop_reason_to_string (enum unwind_stop_reason);
 
    Should only be called for frames that don't have a previous frame.  */
 
-const char *frame_stop_reason_string (struct frame_info *);
+const char *frame_stop_reason_string (frame_info_ptr );
 
 /* Unwind the stack frame so that the value of REGNUM, in the previous
    (up, older) frame is returned.  If VALUEP is NULL, don't
    fetch/compute the value.  Instead just return the location of the
    value.  */
-extern void frame_register_unwind (frame_info *frame, int regnum,
+extern void frame_register_unwind (frame_info_ptr frame, int regnum,
 				   int *optimizedp, int *unavailablep,
 				   enum lval_type *lvalp,
 				   CORE_ADDR *addrp, int *realnump,
@@ -603,23 +603,23 @@ extern void frame_register_unwind (frame_info *frame, int regnum,
    fetch fails.  The value methods never return NULL, but usually
    do return a lazy value.  */
 
-extern void frame_unwind_register (frame_info *next_frame,
+extern void frame_unwind_register (frame_info_ptr next_frame,
 				   int regnum, gdb_byte *buf);
-extern void get_frame_register (struct frame_info *frame,
+extern void get_frame_register (frame_info_ptr frame,
 				int regnum, gdb_byte *buf);
 
-struct value *frame_unwind_register_value (frame_info *next_frame,
+struct value *frame_unwind_register_value (frame_info_ptr next_frame,
 					   int regnum);
-struct value *get_frame_register_value (struct frame_info *frame,
+struct value *get_frame_register_value (frame_info_ptr frame,
 					int regnum);
 
-extern LONGEST frame_unwind_register_signed (frame_info *next_frame,
+extern LONGEST frame_unwind_register_signed (frame_info_ptr next_frame,
 					     int regnum);
-extern LONGEST get_frame_register_signed (struct frame_info *frame,
+extern LONGEST get_frame_register_signed (frame_info_ptr frame,
 					  int regnum);
-extern ULONGEST frame_unwind_register_unsigned (frame_info *frame,
+extern ULONGEST frame_unwind_register_unsigned (frame_info_ptr frame,
 						int regnum);
-extern ULONGEST get_frame_register_unsigned (struct frame_info *frame,
+extern ULONGEST get_frame_register_unsigned (frame_info_ptr frame,
 					     int regnum);
 
 /* Read a register from this, or unwind a register from the next
@@ -627,7 +627,7 @@ extern ULONGEST get_frame_register_unsigned (struct frame_info *frame,
    get_frame_register_value, that do not throw if the result is
    optimized out or unavailable.  */
 
-extern bool read_frame_register_unsigned (frame_info *frame,
+extern bool read_frame_register_unsigned (frame_info_ptr frame,
 					  int regnum, ULONGEST *val);
 
 /* Get the value of the register that belongs to this FRAME.  This
@@ -635,7 +635,7 @@ extern bool read_frame_register_unsigned (frame_info *frame,
    (get_next_frame (FRAME))''.  As per frame_register_unwind(), if
    VALUEP is NULL, the registers value is not fetched/computed.  */
 
-extern void frame_register (struct frame_info *frame, int regnum,
+extern void frame_register (frame_info_ptr frame, int regnum,
 			    int *optimizedp, int *unavailablep,
 			    enum lval_type *lvalp,
 			    CORE_ADDR *addrp, int *realnump,
@@ -644,21 +644,21 @@ extern void frame_register (struct frame_info *frame, int regnum,
 /* The reverse.  Store a register value relative to the specified
    frame.  Note: this call makes the frame's state undefined.  The
    register and frame caches must be flushed.  */
-extern void put_frame_register (struct frame_info *frame, int regnum,
+extern void put_frame_register (frame_info_ptr frame, int regnum,
 				const gdb_byte *buf);
 
 /* Read LEN bytes from one or multiple registers starting with REGNUM
    in frame FRAME, starting at OFFSET, into BUF.  If the register
    contents are optimized out or unavailable, set *OPTIMIZEDP,
    *UNAVAILABLEP accordingly.  */
-extern bool get_frame_register_bytes (frame_info *frame, int regnum,
+extern bool get_frame_register_bytes (frame_info_ptr frame, int regnum,
 				      CORE_ADDR offset,
 				      gdb::array_view<gdb_byte> buffer,
 				      int *optimizedp, int *unavailablep);
 
 /* Write bytes from BUFFER to one or multiple registers starting with REGNUM
    in frame FRAME, starting at OFFSET.  */
-extern void put_frame_register_bytes (struct frame_info *frame, int regnum,
+extern void put_frame_register_bytes (frame_info_ptr frame, int regnum,
 				      CORE_ADDR offset,
 				      gdb::array_view<const gdb_byte> buffer);
 
@@ -666,11 +666,11 @@ extern void put_frame_register_bytes (struct frame_info *frame, int regnum,
    calling frame.  For GDB, `pc' is the resume address and not a
    specific register.  */
 
-extern CORE_ADDR frame_unwind_caller_pc (struct frame_info *frame);
+extern CORE_ADDR frame_unwind_caller_pc (frame_info_ptr frame);
 
 /* Discard the specified frame.  Restoring the registers to the state
    of the caller.  */
-extern void frame_pop (struct frame_info *frame);
+extern void frame_pop (frame_info_ptr frame);
 
 /* Return memory from the specified frame.  A frame knows its thread /
    LWP and hence can find its way down to a target.  The assumption
@@ -685,26 +685,26 @@ extern void frame_pop (struct frame_info *frame);
    If architecture / memory changes are always separated by special
    adaptor frames this should be ok.  */
 
-extern void get_frame_memory (struct frame_info *this_frame, CORE_ADDR addr,
+extern void get_frame_memory (frame_info_ptr this_frame, CORE_ADDR addr,
 			      gdb::array_view<gdb_byte> buffer);
-extern LONGEST get_frame_memory_signed (struct frame_info *this_frame,
+extern LONGEST get_frame_memory_signed (frame_info_ptr this_frame,
 					CORE_ADDR memaddr, int len);
-extern ULONGEST get_frame_memory_unsigned (struct frame_info *this_frame,
+extern ULONGEST get_frame_memory_unsigned (frame_info_ptr this_frame,
 					   CORE_ADDR memaddr, int len);
 
 /* Same as above, but return true zero when the entire memory read
    succeeds, false otherwise.  */
-extern bool safe_frame_unwind_memory (frame_info *this_frame, CORE_ADDR addr,
+extern bool safe_frame_unwind_memory (frame_info_ptr this_frame, CORE_ADDR addr,
 				      gdb::array_view<gdb_byte> buffer);
 
 /* Return this frame's architecture.  */
-extern struct gdbarch *get_frame_arch (struct frame_info *this_frame);
+extern struct gdbarch *get_frame_arch (frame_info_ptr this_frame);
 
 /* Return the previous frame's architecture.  */
-extern struct gdbarch *frame_unwind_arch (frame_info *next_frame);
+extern struct gdbarch *frame_unwind_arch (frame_info_ptr next_frame);
 
 /* Return the previous frame's architecture, skipping inline functions.  */
-extern struct gdbarch *frame_unwind_caller_arch (struct frame_info *frame);
+extern struct gdbarch *frame_unwind_caller_arch (frame_info_ptr frame);
 
 
 /* Values for the source flag to be used in print_frame_info ().
@@ -744,9 +744,9 @@ extern void *frame_obstack_zalloc (unsigned long size);
 class readonly_detached_regcache;
 /* Create a regcache, and copy the frame's registers into it.  */
 std::unique_ptr<readonly_detached_regcache> frame_save_as_regcache
-    (struct frame_info *this_frame);
+    (frame_info_ptr this_frame);
 
-extern const struct block *get_frame_block (struct frame_info *,
+extern const struct block *get_frame_block (frame_info_ptr ,
 					    CORE_ADDR *addr_in_block);
 
 /* Return the `struct block' that belongs to the selected thread's
@@ -777,32 +777,32 @@ extern const struct block *get_frame_block (struct frame_info *,
 
 extern const struct block *get_selected_block (CORE_ADDR *addr_in_block);
 
-extern struct symbol *get_frame_function (struct frame_info *);
+extern struct symbol *get_frame_function (frame_info_ptr );
 
 extern CORE_ADDR get_pc_function_start (CORE_ADDR);
 
-extern struct frame_info *find_relative_frame (struct frame_info *, int *);
+extern frame_info_ptr find_relative_frame (frame_info_ptr , int *);
 
 /* Wrapper over print_stack_frame modifying current_uiout with UIOUT for
    the function call.  */
 
 extern void print_stack_frame_to_uiout (struct ui_out *uiout,
-					struct frame_info *, int print_level,
+					frame_info_ptr , int print_level,
 					enum print_what print_what,
 					int set_current_sal);
 
-extern void print_stack_frame (struct frame_info *, int print_level,
+extern void print_stack_frame (frame_info_ptr , int print_level,
 			       enum print_what print_what,
 			       int set_current_sal);
 
 extern void print_frame_info (const frame_print_options &fp_opts,
-			      struct frame_info *, int print_level,
+			      frame_info_ptr , int print_level,
 			      enum print_what print_what, int args,
 			      int set_current_sal);
 
-extern struct frame_info *block_innermost_frame (const struct block *);
+extern frame_info_ptr block_innermost_frame (const struct block *);
 
-extern bool deprecated_frame_register_read (frame_info *frame, int regnum,
+extern bool deprecated_frame_register_read (frame_info_ptr frame, int regnum,
 					    gdb_byte *buf);
 
 /* From stack.c.  */
@@ -874,10 +874,10 @@ struct frame_arg
 };
 
 extern void read_frame_arg (const frame_print_options &fp_opts,
-			    symbol *sym, frame_info *frame,
+			    symbol *sym, frame_info_ptr frame,
 			    struct frame_arg *argp,
 			    struct frame_arg *entryargp);
-extern void read_frame_local (struct symbol *sym, struct frame_info *frame,
+extern void read_frame_local (struct symbol *sym, frame_info_ptr frame,
 			      struct frame_arg *argp);
 
 extern void info_args_command (const char *, int);
@@ -890,13 +890,13 @@ extern void return_command (const char *, int);
    If sniffing fails, the caller should be sure to call
    frame_cleanup_after_sniffer.  */
 
-extern void frame_prepare_for_sniffer (struct frame_info *frame,
+extern void frame_prepare_for_sniffer (frame_info_ptr frame,
 				       const struct frame_unwind *unwind);
 
 /* Clean up after a failed (wrong unwinder) attempt to unwind past
    FRAME.  */
 
-extern void frame_cleanup_after_sniffer (struct frame_info *frame);
+extern void frame_cleanup_after_sniffer (frame_info_ptr frame);
 
 /* Notes (cagney/2002-11-27, drow/2003-09-06):
 
@@ -928,31 +928,31 @@ extern void frame_cleanup_after_sniffer (struct frame_info *frame);
    This function calls get_selected_frame if the inferior should have a
    frame, or returns NULL otherwise.  */
 
-extern struct frame_info *deprecated_safe_get_selected_frame (void);
+extern frame_info_ptr deprecated_safe_get_selected_frame (void);
 
 /* Create a frame using the specified BASE and PC.  */
 
-extern struct frame_info *create_new_frame (CORE_ADDR base, CORE_ADDR pc);
+extern frame_info_ptr create_new_frame (CORE_ADDR base, CORE_ADDR pc);
 
 /* Return true if the frame unwinder for frame FI is UNWINDER; false
    otherwise.  */
 
-extern bool frame_unwinder_is (frame_info *fi, const frame_unwind *unwinder);
+extern bool frame_unwinder_is (frame_info_ptr fi, const frame_unwind *unwinder);
 
 /* Return the language of FRAME.  */
 
-extern enum language get_frame_language (struct frame_info *frame);
+extern enum language get_frame_language (frame_info_ptr frame);
 
 /* Return the first non-tailcall frame above FRAME or FRAME if it is not a
    tailcall frame.  Return NULL if FRAME is the start of a tailcall-only
    chain.  */
 
-extern struct frame_info *skip_tailcall_frames (struct frame_info *frame);
+extern frame_info_ptr skip_tailcall_frames (frame_info_ptr frame);
 
 /* Return the first frame above FRAME or FRAME of which the code is
    writable.  */
 
-extern struct frame_info *skip_unwritable_frames (struct frame_info *frame);
+extern frame_info_ptr skip_unwritable_frames (frame_info_ptr frame);
 
 /* Data for the "set backtrace" settings.  */
 
@@ -984,11 +984,11 @@ unsigned int get_frame_cache_generation ();
 
 /* Mark that the PC value is masked for the previous frame.  */
 
-extern void set_frame_previous_pc_masked (struct frame_info *frame);
+extern void set_frame_previous_pc_masked (frame_info_ptr frame);
 
 /* Get whether the PC value is masked for the given frame.  */
 
-extern bool get_frame_pc_masked (const struct frame_info *frame);
+extern bool get_frame_pc_masked (frame_info_ptr frame);
 
 
 #endif /* !defined (FRAME_H)  */
diff --git a/gdb/frv-linux-tdep.c b/gdb/frv-linux-tdep.c
index b60af84e676..9a2593e10dc 100644
--- a/gdb/frv-linux-tdep.c
+++ b/gdb/frv-linux-tdep.c
@@ -168,7 +168,7 @@ frv_linux_pc_in_sigtramp (struct gdbarch *gdbarch, CORE_ADDR pc,
       } __attribute__((aligned(8)));  */
 
 static LONGEST
-frv_linux_sigcontext_reg_addr (struct frame_info *this_frame, int regno,
+frv_linux_sigcontext_reg_addr (frame_info_ptr this_frame, int regno,
 			       CORE_ADDR *sc_addr_cache_ptr)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
@@ -258,7 +258,7 @@ frv_linux_sigcontext_reg_addr (struct frame_info *this_frame, int regno,
 /* Signal trampolines.  */
 
 static struct trad_frame_cache *
-frv_linux_sigtramp_frame_cache (struct frame_info *this_frame,
+frv_linux_sigtramp_frame_cache (frame_info_ptr this_frame,
 				void **this_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
@@ -297,7 +297,7 @@ frv_linux_sigtramp_frame_cache (struct frame_info *this_frame,
 }
 
 static void
-frv_linux_sigtramp_frame_this_id (struct frame_info *this_frame,
+frv_linux_sigtramp_frame_this_id (frame_info_ptr this_frame,
 				  void **this_cache,
 				  struct frame_id *this_id)
 {
@@ -307,7 +307,7 @@ frv_linux_sigtramp_frame_this_id (struct frame_info *this_frame,
 }
 
 static struct value *
-frv_linux_sigtramp_frame_prev_register (struct frame_info *this_frame,
+frv_linux_sigtramp_frame_prev_register (frame_info_ptr this_frame,
 					void **this_cache, int regnum)
 {
   /* Make sure we've initialized the cache.  */
@@ -318,7 +318,7 @@ frv_linux_sigtramp_frame_prev_register (struct frame_info *this_frame,
 
 static int
 frv_linux_sigtramp_frame_sniffer (const struct frame_unwind *self,
-				  struct frame_info *this_frame,
+				  frame_info_ptr this_frame,
 				  void **this_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
diff --git a/gdb/frv-tdep.c b/gdb/frv-tdep.c
index 55a6cfd9618..d8b4ccfe243 100644
--- a/gdb/frv-tdep.c
+++ b/gdb/frv-tdep.c
@@ -510,7 +510,7 @@ is_argument_reg (int reg)
    prologue analysis.  */
 static CORE_ADDR
 frv_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
-		      struct frame_info *this_frame,
+		      frame_info_ptr this_frame,
 		      struct frv_unwind_cache *info)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
@@ -1084,7 +1084,7 @@ frv_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
 
 
 static struct frv_unwind_cache *
-frv_frame_unwind_cache (struct frame_info *this_frame,
+frv_frame_unwind_cache (frame_info_ptr this_frame,
 			 void **this_prologue_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
@@ -1369,7 +1369,7 @@ frv_return_value (struct gdbarch *gdbarch, struct value *function,
    frame.  This will be used to create a new GDB frame struct.  */
 
 static void
-frv_frame_this_id (struct frame_info *this_frame,
+frv_frame_this_id (frame_info_ptr this_frame,
 		    void **this_prologue_cache, struct frame_id *this_id)
 {
   struct frv_unwind_cache *info
@@ -1399,7 +1399,7 @@ frv_frame_this_id (struct frame_info *this_frame,
 }
 
 static struct value *
-frv_frame_prev_register (struct frame_info *this_frame,
+frv_frame_prev_register (frame_info_ptr this_frame,
 			 void **this_prologue_cache, int regnum)
 {
   struct frv_unwind_cache *info
@@ -1418,7 +1418,7 @@ static const struct frame_unwind frv_frame_unwind = {
 };
 
 static CORE_ADDR
-frv_frame_base_address (struct frame_info *this_frame, void **this_cache)
+frv_frame_base_address (frame_info_ptr this_frame, void **this_cache)
 {
   struct frv_unwind_cache *info
     = frv_frame_unwind_cache (this_frame, this_cache);
diff --git a/gdb/ft32-tdep.c b/gdb/ft32-tdep.c
index 024ca47ce4d..d5b9379d77a 100644
--- a/gdb/ft32-tdep.c
+++ b/gdb/ft32-tdep.c
@@ -452,7 +452,7 @@ ft32_alloc_frame_cache (void)
 /* Populate a ft32_frame_cache object for this_frame.  */
 
 static struct ft32_frame_cache *
-ft32_frame_cache (struct frame_info *this_frame, void **this_cache)
+ft32_frame_cache (frame_info_ptr this_frame, void **this_cache)
 {
   struct ft32_frame_cache *cache;
   CORE_ADDR current_pc;
@@ -492,7 +492,7 @@ ft32_frame_cache (struct frame_info *this_frame, void **this_cache)
    frame.  This will be used to create a new GDB frame struct.  */
 
 static void
-ft32_frame_this_id (struct frame_info *this_frame,
+ft32_frame_this_id (frame_info_ptr this_frame,
 		    void **this_prologue_cache, struct frame_id *this_id)
 {
   struct ft32_frame_cache *cache = ft32_frame_cache (this_frame,
@@ -508,7 +508,7 @@ ft32_frame_this_id (struct frame_info *this_frame,
 /* Get the value of register regnum in the previous stack frame.  */
 
 static struct value *
-ft32_frame_prev_register (struct frame_info *this_frame,
+ft32_frame_prev_register (frame_info_ptr this_frame,
 			  void **this_prologue_cache, int regnum)
 {
   struct ft32_frame_cache *cache = ft32_frame_cache (this_frame,
@@ -540,7 +540,7 @@ static const struct frame_unwind ft32_frame_unwind =
 /* Return the base address of this_frame.  */
 
 static CORE_ADDR
-ft32_frame_base_address (struct frame_info *this_frame, void **this_cache)
+ft32_frame_base_address (frame_info_ptr this_frame, void **this_cache)
 {
   struct ft32_frame_cache *cache = ft32_frame_cache (this_frame,
 						     this_cache);
diff --git a/gdb/guile/scm-frame.c b/gdb/guile/scm-frame.c
index 77764944208..159603b8008 100644
--- a/gdb/guile/scm-frame.c
+++ b/gdb/guile/scm-frame.c
@@ -134,7 +134,7 @@ frscm_eq_frame_smob (const void *ap, const void *bp)
   const frame_smob *a = (const frame_smob *) ap;
   const frame_smob *b = (const frame_smob *) bp;
 
-  return (a->frame_id == b->frame_id
+  return (frame_id_eq (a->frame_id, b->frame_id)
 	  && a->inferior == b->inferior
 	  && a->inferior != NULL);
 }
diff --git a/gdb/i386-bsd-tdep.c b/gdb/i386-bsd-tdep.c
index dbbd3c786c3..dd91e302128 100644
--- a/gdb/i386-bsd-tdep.c
+++ b/gdb/i386-bsd-tdep.c
@@ -32,7 +32,7 @@
    address of the associated sigcontext structure.  */
 
 static CORE_ADDR
-i386bsd_sigcontext_addr (struct frame_info *this_frame)
+i386bsd_sigcontext_addr (frame_info_ptr this_frame)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
diff --git a/gdb/i386-darwin-tdep.c b/gdb/i386-darwin-tdep.c
index 2a9198aceb3..615dbaedf52 100644
--- a/gdb/i386-darwin-tdep.c
+++ b/gdb/i386-darwin-tdep.c
@@ -66,7 +66,7 @@ const int i386_darwin_thread_state_num_regs =
    address of the associated sigcontext structure.  */
 
 static CORE_ADDR
-i386_darwin_sigcontext_addr (struct frame_info *this_frame)
+i386_darwin_sigcontext_addr (frame_info_ptr this_frame)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
@@ -99,7 +99,7 @@ i386_darwin_sigcontext_addr (struct frame_info *this_frame)
 
 int
 darwin_dwarf_signal_frame_p (struct gdbarch *gdbarch,
-			     struct frame_info *this_frame)
+			     frame_info_ptr this_frame)
 {
   return i386_sigtramp_p (this_frame);
 }
diff --git a/gdb/i386-darwin-tdep.h b/gdb/i386-darwin-tdep.h
index 4c1660b9bc6..2628ef49bc4 100644
--- a/gdb/i386-darwin-tdep.h
+++ b/gdb/i386-darwin-tdep.h
@@ -27,6 +27,6 @@
 extern int i386_darwin_thread_state_reg_offset[];
 extern const int i386_darwin_thread_state_num_regs;
 
-int darwin_dwarf_signal_frame_p (struct gdbarch *, struct frame_info *);
+int darwin_dwarf_signal_frame_p (struct gdbarch *, frame_info_ptr );
 
 #endif /* I386_DARWIN_TDEP_H */
diff --git a/gdb/i386-fbsd-tdep.c b/gdb/i386-fbsd-tdep.c
index b7a524db68c..eef124fca0c 100644
--- a/gdb/i386-fbsd-tdep.c
+++ b/gdb/i386-fbsd-tdep.c
@@ -156,7 +156,7 @@ const struct regset i386_fbsd_segbases_regset =
 
 static void
 i386_fbsd_sigframe_init (const struct tramp_frame *self,
-			 struct frame_info *this_frame,
+			 frame_info_ptr this_frame,
 			 struct trad_frame_cache *this_cache,
 			 CORE_ADDR func)
 {
diff --git a/gdb/i386-gnu-tdep.c b/gdb/i386-gnu-tdep.c
index 3d97fe36a85..1ce4a2137e9 100644
--- a/gdb/i386-gnu-tdep.c
+++ b/gdb/i386-gnu-tdep.c
@@ -56,7 +56,7 @@ static const gdb_byte gnu_sigtramp_code[] =
    start of the routine.  Otherwise, return 0.  */
 
 static CORE_ADDR
-i386_gnu_sigtramp_start (struct frame_info *this_frame)
+i386_gnu_sigtramp_start (frame_info_ptr this_frame)
 {
   CORE_ADDR pc = get_frame_pc (this_frame);
   gdb_byte buf[GNU_SIGTRAMP_LEN];
@@ -76,7 +76,7 @@ i386_gnu_sigtramp_start (struct frame_info *this_frame)
    routine.  */
 
 static int
-i386_gnu_sigtramp_p (struct frame_info *this_frame)
+i386_gnu_sigtramp_p (frame_info_ptr this_frame)
 {
   CORE_ADDR pc = get_frame_pc (this_frame);
   const char *name;
@@ -97,7 +97,7 @@ i386_gnu_sigtramp_p (struct frame_info *this_frame)
    address of the associated sigcontext structure.  */
 
 static CORE_ADDR
-i386_gnu_sigcontext_addr (struct frame_info *this_frame)
+i386_gnu_sigcontext_addr (frame_info_ptr this_frame)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
diff --git a/gdb/i386-linux-tdep.c b/gdb/i386-linux-tdep.c
index 6033104230f..5c2fed39868 100644
--- a/gdb/i386-linux-tdep.c
+++ b/gdb/i386-linux-tdep.c
@@ -122,7 +122,7 @@ static const gdb_byte linux_sigtramp_code[] =
    start of the routine.  Otherwise, return 0.  */
 
 static CORE_ADDR
-i386_linux_sigtramp_start (struct frame_info *this_frame)
+i386_linux_sigtramp_start (frame_info_ptr this_frame)
 {
   CORE_ADDR pc = get_frame_pc (this_frame);
   gdb_byte buf[LINUX_SIGTRAMP_LEN];
@@ -190,7 +190,7 @@ static const gdb_byte linux_rt_sigtramp_code[] =
    start of the routine.  Otherwise, return 0.  */
 
 static CORE_ADDR
-i386_linux_rt_sigtramp_start (struct frame_info *this_frame)
+i386_linux_rt_sigtramp_start (frame_info_ptr this_frame)
 {
   CORE_ADDR pc = get_frame_pc (this_frame);
   gdb_byte buf[LINUX_RT_SIGTRAMP_LEN];
@@ -227,7 +227,7 @@ i386_linux_rt_sigtramp_start (struct frame_info *this_frame)
    routine.  */
 
 static int
-i386_linux_sigtramp_p (struct frame_info *this_frame)
+i386_linux_sigtramp_p (frame_info_ptr this_frame)
 {
   CORE_ADDR pc = get_frame_pc (this_frame);
   const char *name;
@@ -252,7 +252,7 @@ i386_linux_sigtramp_p (struct frame_info *this_frame)
 
 static int
 i386_linux_dwarf_signal_frame_p (struct gdbarch *gdbarch,
-				 struct frame_info *this_frame)
+				 frame_info_ptr this_frame)
 {
   CORE_ADDR pc = get_frame_pc (this_frame);
   const char *name;
@@ -275,7 +275,7 @@ i386_linux_dwarf_signal_frame_p (struct gdbarch *gdbarch,
    address of the associated sigcontext structure.  */
 
 static CORE_ADDR
-i386_linux_sigcontext_addr (struct frame_info *this_frame)
+i386_linux_sigcontext_addr (frame_info_ptr this_frame)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
diff --git a/gdb/i386-netbsd-tdep.c b/gdb/i386-netbsd-tdep.c
index a9ebc3dd827..e0fc00e8b94 100644
--- a/gdb/i386-netbsd-tdep.c
+++ b/gdb/i386-netbsd-tdep.c
@@ -97,7 +97,7 @@ static int i386nbsd_mc_reg_offset[] =
 };
 
 static void i386nbsd_sigtramp_cache_init (const struct tramp_frame *,
-					  struct frame_info *,
+					  frame_info_ptr ,
 					  struct trad_frame_cache *,
 					  CORE_ADDR);
 
@@ -329,7 +329,7 @@ static const struct tramp_frame i386nbsd_sigtramp_si4 =
 
 static void
 i386nbsd_sigtramp_cache_init (const struct tramp_frame *self,
-			      struct frame_info *this_frame,
+			      frame_info_ptr this_frame,
 			      struct trad_frame_cache *this_cache,
 			      CORE_ADDR func)
 {
diff --git a/gdb/i386-nto-tdep.c b/gdb/i386-nto-tdep.c
index 259867f262b..013e5a64e76 100644
--- a/gdb/i386-nto-tdep.c
+++ b/gdb/i386-nto-tdep.c
@@ -270,7 +270,7 @@ i386nto_regset_fill (const struct regcache *regcache, int regset, char *data)
    routine.  */
 
 static int
-i386nto_sigtramp_p (struct frame_info *this_frame)
+i386nto_sigtramp_p (frame_info_ptr this_frame)
 {
   CORE_ADDR pc = get_frame_pc (this_frame);
   const char *name;
@@ -283,7 +283,7 @@ i386nto_sigtramp_p (struct frame_info *this_frame)
    address of the associated sigcontext structure.  */
 
 static CORE_ADDR
-i386nto_sigcontext_addr (struct frame_info *this_frame)
+i386nto_sigcontext_addr (frame_info_ptr this_frame)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
diff --git a/gdb/i386-obsd-tdep.c b/gdb/i386-obsd-tdep.c
index 798094509c6..b1b0a83ed21 100644
--- a/gdb/i386-obsd-tdep.c
+++ b/gdb/i386-obsd-tdep.c
@@ -64,7 +64,7 @@ static const int i386obsd_sigreturn_offset[] = {
    routine.  */
 
 static int
-i386obsd_sigtramp_p (struct frame_info *this_frame)
+i386obsd_sigtramp_p (frame_info_ptr this_frame)
 {
   CORE_ADDR pc = get_frame_pc (this_frame);
   CORE_ADDR start_pc = (pc & ~(i386obsd_page_size - 1));
@@ -303,7 +303,7 @@ static int i386obsd_tf_reg_offset[] =
 };
 
 static struct trad_frame_cache *
-i386obsd_trapframe_cache (struct frame_info *this_frame, void **this_cache)
+i386obsd_trapframe_cache (frame_info_ptr this_frame, void **this_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
@@ -350,7 +350,7 @@ i386obsd_trapframe_cache (struct frame_info *this_frame, void **this_cache)
 }
 
 static void
-i386obsd_trapframe_this_id (struct frame_info *this_frame,
+i386obsd_trapframe_this_id (frame_info_ptr this_frame,
 			    void **this_cache, struct frame_id *this_id)
 {
   struct trad_frame_cache *cache =
@@ -360,7 +360,7 @@ i386obsd_trapframe_this_id (struct frame_info *this_frame,
 }
 
 static struct value *
-i386obsd_trapframe_prev_register (struct frame_info *this_frame,
+i386obsd_trapframe_prev_register (frame_info_ptr this_frame,
 				  void **this_cache, int regnum)
 {
   struct trad_frame_cache *cache =
@@ -371,7 +371,7 @@ i386obsd_trapframe_prev_register (struct frame_info *this_frame,
 
 static int
 i386obsd_trapframe_sniffer (const struct frame_unwind *self,
-			    struct frame_info *this_frame,
+			    frame_info_ptr this_frame,
 			    void **this_prologue_cache)
 {
   ULONGEST cs;
diff --git a/gdb/i386-sol2-tdep.c b/gdb/i386-sol2-tdep.c
index 5ee108d3578..f9df0f3d500 100644
--- a/gdb/i386-sol2-tdep.c
+++ b/gdb/i386-sol2-tdep.c
@@ -50,7 +50,7 @@ static int i386_sol2_gregset_reg_offset[] =
    `mcontext_t' that contains the saved set of machine registers.  */
 
 static CORE_ADDR
-i386_sol2_mcontext_addr (struct frame_info *this_frame)
+i386_sol2_mcontext_addr (frame_info_ptr this_frame)
 {
   CORE_ADDR sp, ucontext_addr;
 
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index d8e910bb407..06bf88d8eda 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -1965,7 +1965,7 @@ i386_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
 /* This function is 64-bit safe.  */
 
 static CORE_ADDR
-i386_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
+i386_unwind_pc (struct gdbarch *gdbarch, frame_info_ptr next_frame)
 {
   gdb_byte buf[8];
 
@@ -1977,7 +1977,7 @@ i386_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
 /* Normal frames.  */
 
 static void
-i386_frame_cache_1 (struct frame_info *this_frame,
+i386_frame_cache_1 (frame_info_ptr this_frame,
 		    struct i386_frame_cache *cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
@@ -2078,7 +2078,7 @@ i386_frame_cache_1 (struct frame_info *this_frame,
 }
 
 static struct i386_frame_cache *
-i386_frame_cache (struct frame_info *this_frame, void **this_cache)
+i386_frame_cache (frame_info_ptr this_frame, void **this_cache)
 {
   struct i386_frame_cache *cache;
 
@@ -2102,7 +2102,7 @@ i386_frame_cache (struct frame_info *this_frame, void **this_cache)
 }
 
 static void
-i386_frame_this_id (struct frame_info *this_frame, void **this_cache,
+i386_frame_this_id (frame_info_ptr this_frame, void **this_cache,
 		    struct frame_id *this_id)
 {
   struct i386_frame_cache *cache = i386_frame_cache (this_frame, this_cache);
@@ -2121,7 +2121,7 @@ i386_frame_this_id (struct frame_info *this_frame, void **this_cache,
 }
 
 static enum unwind_stop_reason
-i386_frame_unwind_stop_reason (struct frame_info *this_frame,
+i386_frame_unwind_stop_reason (frame_info_ptr this_frame,
 			       void **this_cache)
 {
   struct i386_frame_cache *cache = i386_frame_cache (this_frame, this_cache);
@@ -2137,7 +2137,7 @@ i386_frame_unwind_stop_reason (struct frame_info *this_frame,
 }
 
 static struct value *
-i386_frame_prev_register (struct frame_info *this_frame, void **this_cache,
+i386_frame_prev_register (frame_info_ptr this_frame, void **this_cache,
 			  int regnum)
 {
   struct i386_frame_cache *cache = i386_frame_cache (this_frame, this_cache);
@@ -2236,7 +2236,7 @@ i386_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
 
 static int
 i386_epilogue_frame_sniffer (const struct frame_unwind *self,
-			     struct frame_info *this_frame,
+			     frame_info_ptr this_frame,
 			     void **this_prologue_cache)
 {
   if (frame_relative_level (this_frame) == 0)
@@ -2247,7 +2247,7 @@ i386_epilogue_frame_sniffer (const struct frame_unwind *self,
 }
 
 static struct i386_frame_cache *
-i386_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache)
+i386_epilogue_frame_cache (frame_info_ptr this_frame, void **this_cache)
 {
   struct i386_frame_cache *cache;
   CORE_ADDR sp;
@@ -2282,7 +2282,7 @@ i386_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache)
 }
 
 static enum unwind_stop_reason
-i386_epilogue_frame_unwind_stop_reason (struct frame_info *this_frame,
+i386_epilogue_frame_unwind_stop_reason (frame_info_ptr this_frame,
 					void **this_cache)
 {
   struct i386_frame_cache *cache =
@@ -2295,7 +2295,7 @@ i386_epilogue_frame_unwind_stop_reason (struct frame_info *this_frame,
 }
 
 static void
-i386_epilogue_frame_this_id (struct frame_info *this_frame,
+i386_epilogue_frame_this_id (frame_info_ptr this_frame,
 			     void **this_cache,
 			     struct frame_id *this_id)
 {
@@ -2309,7 +2309,7 @@ i386_epilogue_frame_this_id (struct frame_info *this_frame,
 }
 
 static struct value *
-i386_epilogue_frame_prev_register (struct frame_info *this_frame,
+i386_epilogue_frame_prev_register (frame_info_ptr this_frame,
 				   void **this_cache, int regnum)
 {
   /* Make sure we've initialized the cache.  */
@@ -2391,7 +2391,7 @@ i386_in_stack_tramp_p (CORE_ADDR pc)
 
 static int
 i386_stack_tramp_frame_sniffer (const struct frame_unwind *self,
-				struct frame_info *this_frame,
+				frame_info_ptr this_frame,
 				void **this_cache)
 {
   if (frame_relative_level (this_frame) == 0)
@@ -2431,7 +2431,7 @@ i386_gen_return_address (struct gdbarch *gdbarch,
 /* Signal trampolines.  */
 
 static struct i386_frame_cache *
-i386_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
+i386_sigtramp_frame_cache (frame_info_ptr this_frame, void **this_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
@@ -2480,7 +2480,7 @@ i386_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
 }
 
 static enum unwind_stop_reason
-i386_sigtramp_frame_unwind_stop_reason (struct frame_info *this_frame,
+i386_sigtramp_frame_unwind_stop_reason (frame_info_ptr this_frame,
 					void **this_cache)
 {
   struct i386_frame_cache *cache =
@@ -2493,7 +2493,7 @@ i386_sigtramp_frame_unwind_stop_reason (struct frame_info *this_frame,
 }
 
 static void
-i386_sigtramp_frame_this_id (struct frame_info *this_frame, void **this_cache,
+i386_sigtramp_frame_this_id (frame_info_ptr this_frame, void **this_cache,
 			     struct frame_id *this_id)
 {
   struct i386_frame_cache *cache =
@@ -2509,7 +2509,7 @@ i386_sigtramp_frame_this_id (struct frame_info *this_frame, void **this_cache,
 }
 
 static struct value *
-i386_sigtramp_frame_prev_register (struct frame_info *this_frame,
+i386_sigtramp_frame_prev_register (frame_info_ptr this_frame,
 				   void **this_cache, int regnum)
 {
   /* Make sure we've initialized the cache.  */
@@ -2520,7 +2520,7 @@ i386_sigtramp_frame_prev_register (struct frame_info *this_frame,
 
 static int
 i386_sigtramp_frame_sniffer (const struct frame_unwind *self,
-			     struct frame_info *this_frame,
+			     frame_info_ptr this_frame,
 			     void **this_prologue_cache)
 {
   gdbarch *arch = get_frame_arch (this_frame);
@@ -2562,7 +2562,7 @@ static const struct frame_unwind i386_sigtramp_frame_unwind =
 \f
 
 static CORE_ADDR
-i386_frame_base_address (struct frame_info *this_frame, void **this_cache)
+i386_frame_base_address (frame_info_ptr this_frame, void **this_cache)
 {
   struct i386_frame_cache *cache = i386_frame_cache (this_frame, this_cache);
 
@@ -2578,7 +2578,7 @@ static const struct frame_base i386_frame_base =
 };
 
 static struct frame_id
-i386_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
+i386_dummy_id (struct gdbarch *gdbarch, frame_info_ptr this_frame)
 {
   CORE_ADDR fp;
 
@@ -2605,7 +2605,7 @@ i386_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
    success.  */
 
 static int
-i386_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
+i386_get_longjmp_target (frame_info_ptr frame, CORE_ADDR *pc)
 {
   gdb_byte buf[4];
   CORE_ADDR sp, jb_addr;
@@ -3827,7 +3827,7 @@ i386_convert_register_p (struct gdbarch *gdbarch,
    return its contents in TO.  */
 
 static int
-i386_register_to_value (struct frame_info *frame, int regnum,
+i386_register_to_value (frame_info_ptr frame, int regnum,
 			struct type *type, gdb_byte *to,
 			int *optimizedp, int *unavailablep)
 {
@@ -3867,7 +3867,7 @@ i386_register_to_value (struct frame_info *frame, int regnum,
    REGNUM in frame FRAME.  */
 
 static void
-i386_value_to_register (struct frame_info *frame, int regnum,
+i386_value_to_register (frame_info_ptr frame, int regnum,
 			struct type *type, const gdb_byte *from)
 {
   int len = TYPE_LENGTH (type);
@@ -4019,7 +4019,7 @@ i386_iterate_over_regset_sections (struct gdbarch *gdbarch,
 /* Stuff for WIN32 PE style DLL's but is pretty generic really.  */
 
 CORE_ADDR
-i386_pe_skip_trampoline_code (struct frame_info *frame,
+i386_pe_skip_trampoline_code (frame_info_ptr frame,
 			      CORE_ADDR pc, char *name)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
@@ -4050,7 +4050,7 @@ i386_pe_skip_trampoline_code (struct frame_info *frame,
    routine.  */
 
 int
-i386_sigtramp_p (struct frame_info *this_frame)
+i386_sigtramp_p (frame_info_ptr this_frame)
 {
   CORE_ADDR pc = get_frame_pc (this_frame);
   const char *name;
@@ -4086,7 +4086,7 @@ i386_print_insn (bfd_vma pc, struct disassemble_info *info)
    routine.  */
 
 static int
-i386_svr4_sigtramp_p (struct frame_info *this_frame)
+i386_svr4_sigtramp_p (frame_info_ptr this_frame)
 {
   CORE_ADDR pc = get_frame_pc (this_frame);
   const char *name;
@@ -4101,7 +4101,7 @@ i386_svr4_sigtramp_p (struct frame_info *this_frame)
    address of the associated sigcontext (ucontext) structure.  */
 
 static CORE_ADDR
-i386_svr4_sigcontext_addr (struct frame_info *this_frame)
+i386_svr4_sigcontext_addr (frame_info_ptr this_frame)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
@@ -4657,7 +4657,7 @@ i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
 /* Get the ARGIth function argument for the current function.  */
 
 static CORE_ADDR
-i386_fetch_pointer_argument (struct frame_info *frame, int argi, 
+i386_fetch_pointer_argument (frame_info_ptr frame, int argi, 
 			     struct type *type)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
diff --git a/gdb/i386-tdep.h b/gdb/i386-tdep.h
index cd77e0308e0..72e10457b2a 100644
--- a/gdb/i386-tdep.h
+++ b/gdb/i386-tdep.h
@@ -24,7 +24,7 @@
 #include "infrun.h"
 #include "expression.h"
 
-struct frame_info;
+class frame_info_ptr;
 struct gdbarch;
 struct reggroup;
 struct regset;
@@ -223,10 +223,10 @@ struct i386_gdbarch_tdep : gdbarch_tdep_base
   CORE_ADDR sigtramp_end = 0;
 
   /* Detect sigtramp.  */
-  int (*sigtramp_p) (struct frame_info *) = nullptr;
+  int (*sigtramp_p) (frame_info_ptr ) = nullptr;
 
   /* Get address of sigcontext for sigtramp.  */
-  CORE_ADDR (*sigcontext_addr) (struct frame_info *) = nullptr;
+  CORE_ADDR (*sigcontext_addr) (frame_info_ptr ) = nullptr;
 
   /* Offset of registers in `struct sigcontext'.  */
   int *sc_reg_offset = 0;
@@ -395,7 +395,7 @@ extern int i386_ax_pseudo_register_collect (struct gdbarch *gdbarch,
 #define I386_MAX_INSN_LEN (16)
 
 /* Functions exported from i386-tdep.c.  */
-extern CORE_ADDR i386_pe_skip_trampoline_code (struct frame_info *frame,
+extern CORE_ADDR i386_pe_skip_trampoline_code (frame_info_ptr frame,
 					       CORE_ADDR pc, char *name);
 extern CORE_ADDR i386_skip_main_prologue (struct gdbarch *gdbarch,
 					  CORE_ADDR pc);
@@ -414,7 +414,7 @@ extern CORE_ADDR i386_thiscall_push_dummy_call (struct gdbarch *gdbarch,
 						bool thiscall);
 
 /* Return whether the THIS_FRAME corresponds to a sigtramp routine.  */
-extern int i386_sigtramp_p (struct frame_info *this_frame);
+extern int i386_sigtramp_p (frame_info_ptr this_frame);
 
 /* Return non-zero if REGNUM is a member of the specified group.  */
 extern int i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
diff --git a/gdb/i386-windows-tdep.c b/gdb/i386-windows-tdep.c
index 9eec6e28109..478e6ec6207 100644
--- a/gdb/i386-windows-tdep.c
+++ b/gdb/i386-windows-tdep.c
@@ -90,7 +90,7 @@ static int i386_windows_gregset_reg_offset[] =
 #define I386_WINDOWS_SIZEOF_GREGSET 716
 
 static CORE_ADDR
-i386_windows_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
+i386_windows_skip_trampoline_code (frame_info_ptr frame, CORE_ADDR pc)
 {
   return i386_pe_skip_trampoline_code (frame, pc, NULL);
 }
diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c
index 42ed4eebc2c..a3c642b2643 100644
--- a/gdb/i387-tdep.c
+++ b/gdb/i387-tdep.c
@@ -202,7 +202,7 @@ print_i387_control_word (int control_p,
 
 void
 i387_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
-		       struct frame_info *frame, const char *args)
+		       frame_info_ptr frame, const char *args)
 {
   i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
   ULONGEST fctrl;
@@ -345,7 +345,7 @@ i387_convert_register_p (struct gdbarch *gdbarch, int regnum,
    return its contents in TO.  */
 
 int
-i387_register_to_value (struct frame_info *frame, int regnum,
+i387_register_to_value (frame_info_ptr frame, int regnum,
 			struct type *type, gdb_byte *to,
 			int *optimizedp, int *unavailablep)
 {
@@ -380,7 +380,7 @@ i387_register_to_value (struct frame_info *frame, int regnum,
    REGNUM in frame FRAME.  */
 
 void
-i387_value_to_register (struct frame_info *frame, int regnum,
+i387_value_to_register (frame_info_ptr frame, int regnum,
 			struct type *type, const gdb_byte *from)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
diff --git a/gdb/i387-tdep.h b/gdb/i387-tdep.h
index 698ff2ee206..3b223067c5d 100644
--- a/gdb/i387-tdep.h
+++ b/gdb/i387-tdep.h
@@ -21,7 +21,7 @@
 #define I387_TDEP_H
 
 struct gdbarch;
-struct frame_info;
+class frame_info_ptr;
 struct regcache;
 struct type;
 struct ui_file;
@@ -88,7 +88,7 @@ struct ui_file;
 
 extern void i387_print_float_info (struct gdbarch *gdbarch,
 				   struct ui_file *file,
-				   struct frame_info *frame,
+				   frame_info_ptr frame,
 				   const char *args);
 
 /* Return nonzero if a value of type TYPE stored in register REGNUM
@@ -100,14 +100,14 @@ extern int i387_convert_register_p (struct gdbarch *gdbarch, int regnum,
 /* Read a value of type TYPE from register REGNUM in frame FRAME, and
    return its contents in TO.  */
 
-extern int i387_register_to_value (struct frame_info *frame, int regnum,
+extern int i387_register_to_value (frame_info_ptr frame, int regnum,
 				   struct type *type, gdb_byte *to,
 				   int *optimizedp, int *unavailablep);
 
 /* Write the contents FROM of a value of type TYPE into register
    REGNUM in frame FRAME.  */
 
-extern void i387_value_to_register (struct frame_info *frame, int regnum,
+extern void i387_value_to_register (frame_info_ptr frame, int regnum,
 				    struct type *type, const gdb_byte *from);
 \f
 
diff --git a/gdb/ia64-libunwind-tdep.c b/gdb/ia64-libunwind-tdep.c
index 4c788f20956..6fc75629631 100644
--- a/gdb/ia64-libunwind-tdep.c
+++ b/gdb/ia64-libunwind-tdep.c
@@ -153,7 +153,7 @@ libunwind_frame_set_descr (struct gdbarch *gdbarch,
 }
 
 static struct libunwind_frame_cache *
-libunwind_frame_cache (struct frame_info *this_frame, void **this_cache)
+libunwind_frame_cache (frame_info_ptr this_frame, void **this_cache)
 {
   unw_accessors_t *acc;
   unw_addr_space_t as;
@@ -228,7 +228,7 @@ libunwind_frame_cache (struct frame_info *this_frame, void **this_cache)
 }
 
 void
-libunwind_frame_dealloc_cache (struct frame_info *self, void *this_cache)
+libunwind_frame_dealloc_cache (frame_info_ptr self, void *this_cache)
 {
   struct libunwind_frame_cache *cache
     = (struct libunwind_frame_cache *) this_cache;
@@ -247,7 +247,7 @@ libunwind_find_dyn_list (unw_addr_space_t as, unw_dyn_info_t *di, void *arg)
    libunwind frame unwinding.  */
 int
 libunwind_frame_sniffer (const struct frame_unwind *self,
-			 struct frame_info *this_frame, void **this_cache)
+			 frame_info_ptr this_frame, void **this_cache)
 {
   unw_cursor_t cursor;
   unw_accessors_t *acc;
@@ -292,7 +292,7 @@ libunwind_frame_sniffer (const struct frame_unwind *self,
 }
 
 void
-libunwind_frame_this_id (struct frame_info *this_frame, void **this_cache,
+libunwind_frame_this_id (frame_info_ptr this_frame, void **this_cache,
 			 struct frame_id *this_id)
 {
   struct libunwind_frame_cache *cache =
@@ -303,7 +303,7 @@ libunwind_frame_this_id (struct frame_info *this_frame, void **this_cache,
 }
 
 struct value *
-libunwind_frame_prev_register (struct frame_info *this_frame,
+libunwind_frame_prev_register (frame_info_ptr this_frame,
 			       void **this_cache, int regnum)
 {
   struct libunwind_frame_cache *cache =
@@ -387,7 +387,7 @@ libunwind_search_unwind_table (void *as, long ip, void *di,
 /* Verify if we are in a sigtramp frame and we can use libunwind to unwind.  */
 int
 libunwind_sigtramp_frame_sniffer (const struct frame_unwind *self,
-				  struct frame_info *this_frame,
+				  frame_info_ptr this_frame,
 				  void **this_cache)
 {
   unw_cursor_t cursor;
diff --git a/gdb/ia64-libunwind-tdep.h b/gdb/ia64-libunwind-tdep.h
index 56425d0d754..a4e20f6eb3d 100644
--- a/gdb/ia64-libunwind-tdep.h
+++ b/gdb/ia64-libunwind-tdep.h
@@ -22,7 +22,7 @@
 #ifndef IA64_LIBUNWIND_TDEP_H
 #define IA64_LIBUNWIND_TDEP_H 1
 
-struct frame_info;
+class frame_info_ptr;
 struct frame_id;
 struct regcache;
 struct gdbarch;
@@ -48,21 +48,21 @@ struct libunwind_descr
 };
 
 int libunwind_frame_sniffer (const struct frame_unwind *self,
-			     struct frame_info *this_frame,
+			     frame_info_ptr this_frame,
 			     void **this_cache);
 			  
 int libunwind_sigtramp_frame_sniffer (const struct frame_unwind *self,
-				      struct frame_info *this_frame,
+				      frame_info_ptr this_frame,
 				      void **this_cache);
 
 void libunwind_frame_set_descr (struct gdbarch *arch,
 				struct libunwind_descr *descr);
 
-void libunwind_frame_this_id (struct frame_info *this_frame, void **this_cache,
+void libunwind_frame_this_id (frame_info_ptr this_frame, void **this_cache,
 			      struct frame_id *this_id);
-struct value *libunwind_frame_prev_register (struct frame_info *this_frame,
+struct value *libunwind_frame_prev_register (frame_info_ptr this_frame,
 					     void **this_cache, int regnum);
-void libunwind_frame_dealloc_cache (struct frame_info *self, void *cache);
+void libunwind_frame_dealloc_cache (frame_info_ptr self, void *cache);
 
 int libunwind_is_initialized (void);
 
diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
index 1e24debf17f..c6595a3592c 100644
--- a/gdb/ia64-tdep.c
+++ b/gdb/ia64-tdep.c
@@ -1217,7 +1217,7 @@ ia64_convert_register_p (struct gdbarch *gdbarch, int regno, struct type *type)
 }
 
 static int
-ia64_register_to_value (struct frame_info *frame, int regnum,
+ia64_register_to_value (frame_info_ptr frame, int regnum,
 			struct type *valtype, gdb_byte *out,
 			int *optimizedp, int *unavailablep)
 {
@@ -1238,7 +1238,7 @@ ia64_register_to_value (struct frame_info *frame, int regnum,
 }
 
 static void
-ia64_value_to_register (struct frame_info *frame, int regnum,
+ia64_value_to_register (frame_info_ptr frame, int regnum,
 			 struct type *valtype, const gdb_byte *in)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
@@ -1358,7 +1358,7 @@ ia64_alloc_frame_cache (void)
 
 static CORE_ADDR
 examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
-		  struct frame_info *this_frame,
+		  frame_info_ptr this_frame,
 		  struct ia64_frame_cache *cache)
 {
   CORE_ADDR next_pc;
@@ -1839,7 +1839,7 @@ ia64_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
 /* Normal frames.  */
 
 static struct ia64_frame_cache *
-ia64_frame_cache (struct frame_info *this_frame, void **this_cache)
+ia64_frame_cache (frame_info_ptr this_frame, void **this_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
@@ -1884,7 +1884,7 @@ ia64_frame_cache (struct frame_info *this_frame, void **this_cache)
 }
 
 static void
-ia64_frame_this_id (struct frame_info *this_frame, void **this_cache,
+ia64_frame_this_id (frame_info_ptr this_frame, void **this_cache,
 		    struct frame_id *this_id)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
@@ -1901,11 +1901,11 @@ ia64_frame_this_id (struct frame_info *this_frame, void **this_cache,
 		paddress (gdbarch, this_id->code_addr),
 		paddress (gdbarch, this_id->stack_addr),
 		paddress (gdbarch, cache->bsp),
-		host_address_to_string (this_frame));
+		host_address_to_string (this_frame.get ()));
 }
 
 static struct value *
-ia64_frame_prev_register (struct frame_info *this_frame, void **this_cache,
+ia64_frame_prev_register (frame_info_ptr this_frame, void **this_cache,
 			  int regnum)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
@@ -2173,7 +2173,7 @@ static const struct frame_unwind ia64_frame_unwind =
 /* Signal trampolines.  */
 
 static void
-ia64_sigtramp_frame_init_saved_regs (struct frame_info *this_frame,
+ia64_sigtramp_frame_init_saved_regs (frame_info_ptr this_frame,
 				     struct ia64_frame_cache *cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
@@ -2227,7 +2227,7 @@ ia64_sigtramp_frame_init_saved_regs (struct frame_info *this_frame,
 }
 
 static struct ia64_frame_cache *
-ia64_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
+ia64_sigtramp_frame_cache (frame_info_ptr this_frame, void **this_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
@@ -2258,7 +2258,7 @@ ia64_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
 }
 
 static void
-ia64_sigtramp_frame_this_id (struct frame_info *this_frame,
+ia64_sigtramp_frame_this_id (frame_info_ptr this_frame,
 			     void **this_cache, struct frame_id *this_id)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
@@ -2275,11 +2275,11 @@ ia64_sigtramp_frame_this_id (struct frame_info *this_frame,
 		paddress (gdbarch, this_id->code_addr),
 		paddress (gdbarch, this_id->stack_addr),
 		paddress (gdbarch, cache->bsp),
-		host_address_to_string (this_frame));
+		host_address_to_string (this_frame.get ()));
 }
 
 static struct value *
-ia64_sigtramp_frame_prev_register (struct frame_info *this_frame,
+ia64_sigtramp_frame_prev_register (frame_info_ptr this_frame,
 				   void **this_cache, int regnum)
 {
   struct ia64_frame_cache *cache =
@@ -2332,7 +2332,7 @@ ia64_sigtramp_frame_prev_register (struct frame_info *this_frame,
 
 static int
 ia64_sigtramp_frame_sniffer (const struct frame_unwind *self,
-			     struct frame_info *this_frame,
+			     frame_info_ptr this_frame,
 			     void **this_cache)
 {
   gdbarch *arch = get_frame_arch (this_frame);
@@ -2362,7 +2362,7 @@ static const struct frame_unwind ia64_sigtramp_frame_unwind =
 \f
 
 static CORE_ADDR
-ia64_frame_base_address (struct frame_info *this_frame, void **this_cache)
+ia64_frame_base_address (frame_info_ptr this_frame, void **this_cache)
 {
   struct ia64_frame_cache *cache = ia64_frame_cache (this_frame, this_cache);
 
@@ -2483,7 +2483,7 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
 {
   int regnum = ia64_uw2gdb_regnum (uw_regnum);
   unw_word_t bsp, sof, cfm, psr, ip;
-  struct frame_info *this_frame = (struct frame_info *) arg;
+  struct frame_info *this_frame = (frame_info *) arg;
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   ia64_gdbarch_tdep *tdep = gdbarch_tdep<ia64_gdbarch_tdep> (gdbarch);
   
@@ -2538,7 +2538,7 @@ ia64_access_fpreg (unw_addr_space_t as, unw_regnum_t uw_regnum,
 		   unw_fpreg_t *val, int write, void *arg)
 {
   int regnum = ia64_uw2gdb_regnum (uw_regnum);
-  struct frame_info *this_frame = (struct frame_info *) arg;
+  frame_info_ptr this_frame = (frame_info_ptr ) arg;
   
   /* We never call any libunwind routines that need to write registers.  */
   gdb_assert (!write);
@@ -2891,7 +2891,7 @@ ia64_get_dyn_info_list (unw_addr_space_t as,
 /* Frame interface functions for libunwind.  */
 
 static void
-ia64_libunwind_frame_this_id (struct frame_info *this_frame, void **this_cache,
+ia64_libunwind_frame_this_id (frame_info_ptr this_frame, void **this_cache,
 			      struct frame_id *this_id)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
@@ -2925,7 +2925,7 @@ ia64_libunwind_frame_this_id (struct frame_info *this_frame, void **this_cache,
 }
 
 static struct value *
-ia64_libunwind_frame_prev_register (struct frame_info *this_frame,
+ia64_libunwind_frame_prev_register (frame_info_ptr this_frame,
 				    void **this_cache, int regnum)
 {
   int reg = regnum;
@@ -2998,7 +2998,7 @@ ia64_libunwind_frame_prev_register (struct frame_info *this_frame,
 
 static int
 ia64_libunwind_frame_sniffer (const struct frame_unwind *self,
-			      struct frame_info *this_frame,
+			      frame_info_ptr this_frame,
 			      void **this_cache)
 {
   if (libunwind_is_initialized ()
@@ -3021,7 +3021,7 @@ static const struct frame_unwind ia64_libunwind_frame_unwind =
 };
 
 static void
-ia64_libunwind_sigtramp_frame_this_id (struct frame_info *this_frame,
+ia64_libunwind_sigtramp_frame_this_id (frame_info_ptr this_frame,
 				       void **this_cache,
 				       struct frame_id *this_id)
 {
@@ -3057,7 +3057,7 @@ ia64_libunwind_sigtramp_frame_this_id (struct frame_info *this_frame,
 }
 
 static struct value *
-ia64_libunwind_sigtramp_frame_prev_register (struct frame_info *this_frame,
+ia64_libunwind_sigtramp_frame_prev_register (frame_info_ptr this_frame,
 					     void **this_cache, int regnum)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
@@ -3084,7 +3084,7 @@ ia64_libunwind_sigtramp_frame_prev_register (struct frame_info *this_frame,
 
 static int
 ia64_libunwind_sigtramp_frame_sniffer (const struct frame_unwind *self,
-				       struct frame_info *this_frame,
+				       frame_info_ptr this_frame,
 				       void **this_cache)
 {
   if (libunwind_is_initialized ())
@@ -3864,7 +3864,7 @@ static const struct ia64_infcall_ops ia64_infcall_ops =
 };
 
 static struct frame_id
-ia64_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
+ia64_dummy_id (struct gdbarch *gdbarch, frame_info_ptr this_frame)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   gdb_byte buf[8];
@@ -3886,7 +3886,7 @@ ia64_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
 }
 
 static CORE_ADDR 
-ia64_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
+ia64_unwind_pc (struct gdbarch *gdbarch, frame_info_ptr next_frame)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   gdb_byte buf[8];
@@ -3911,7 +3911,7 @@ ia64_print_insn (bfd_vma memaddr, struct disassemble_info *info)
 /* The default "size_of_register_frame" gdbarch_tdep routine for ia64.  */
 
 static int
-ia64_size_of_register_frame (struct frame_info *this_frame, ULONGEST cfm)
+ia64_size_of_register_frame (frame_info_ptr this_frame, ULONGEST cfm)
 {
   return (cfm & 0x7f);
 }
diff --git a/gdb/ia64-tdep.h b/gdb/ia64-tdep.h
index f06974fd296..fed879a2907 100644
--- a/gdb/ia64-tdep.h
+++ b/gdb/ia64-tdep.h
@@ -201,7 +201,7 @@
 #define IA64_NAT32_REGNUM	(IA64_NAT0_REGNUM + 32)
 #define IA64_NAT127_REGNUM	(IA64_NAT0_REGNUM + 127)
 
-struct frame_info;
+class frame_info_ptr;
 struct regcache;
 
 /* A struction containing pointers to all the target-dependent operations
@@ -240,7 +240,7 @@ struct ia64_gdbarch_tdep : gdbarch_tdep_base
 
      Normally, the size of the register frame is always obtained by
      extracting the lowest 7 bits ("cfm & 0x7f").  */
-  int (*size_of_register_frame) (struct frame_info *this_frame, ULONGEST cfm)
+  int (*size_of_register_frame) (frame_info_ptr this_frame, ULONGEST cfm)
     = nullptr;
 
   /* Determine the function address FADDR belongs to a shared library.
diff --git a/gdb/infcall.c b/gdb/infcall.c
index 2acceed4b07..197d649b7e0 100644
--- a/gdb/infcall.c
+++ b/gdb/infcall.c
@@ -673,7 +673,7 @@ run_inferior_call (std::unique_ptr<call_thread_fsm> sm,
 static CORE_ADDR
 reserve_stack_space (const type *values_type, CORE_ADDR &sp)
 {
-  struct frame_info *frame = get_current_frame ();
+  frame_info_ptr frame = get_current_frame ();
   struct gdbarch *gdbarch = get_frame_arch (frame);
   CORE_ADDR addr = 0;
 
@@ -771,7 +771,7 @@ call_function_by_hand_dummy (struct value *function,
   CORE_ADDR real_pc;
   CORE_ADDR bp_addr;
   struct frame_id dummy_id;
-  struct frame_info *frame;
+  frame_info_ptr frame;
   struct gdbarch *gdbarch;
   ptid_t call_thread_ptid;
   struct gdb_exception e;
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index 69a7896b560..d292a0e55bf 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -749,7 +749,7 @@ set_step_frame (thread_info *tp)
      inferior_ptid value.  */
   gdb_assert (inferior_ptid == tp->ptid);
 
-  frame_info *frame = get_current_frame ();
+  frame_info_ptr frame = get_current_frame ();
 
   symtab_and_line sal = find_frame_sal (frame);
   set_step_info (tp, frame, sal);
@@ -939,7 +939,7 @@ prepare_one_step (thread_info *tp, struct step_command_fsm *sm)
 
   if (sm->count > 0)
     {
-      struct frame_info *frame = get_current_frame ();
+      frame_info_ptr frame = get_current_frame ();
 
       set_step_frame (tp);
 
@@ -1320,7 +1320,7 @@ until_next_fsm::do_async_reply_reason ()
 static void
 until_next_command (int from_tty)
 {
-  struct frame_info *frame;
+  frame_info_ptr frame;
   CORE_ADDR pc;
   struct symbol *func;
   struct symtab_and_line sal;
@@ -1711,7 +1711,7 @@ finish_backward (struct finish_command_fsm *sm)
 
   if (sal.pc != pc)
     {
-      struct frame_info *frame = get_selected_frame (NULL);
+      frame_info_ptr frame = get_selected_frame (NULL);
       struct gdbarch *gdbarch = get_frame_arch (frame);
 
       /* Set a step-resume at the function's entry point.  Once that's
@@ -1737,7 +1737,7 @@ finish_backward (struct finish_command_fsm *sm)
    frame that called the function we're about to step out of.  */
 
 static void
-finish_forward (struct finish_command_fsm *sm, struct frame_info *frame)
+finish_forward (struct finish_command_fsm *sm, frame_info_ptr frame)
 {
   struct frame_id frame_id = get_frame_id (frame);
   struct gdbarch *gdbarch = get_frame_arch (frame);
@@ -1764,10 +1764,10 @@ finish_forward (struct finish_command_fsm *sm, struct frame_info *frame)
 
 /* Skip frames for "finish".  */
 
-static struct frame_info *
-skip_finish_frames (struct frame_info *frame)
+static frame_info_ptr
+skip_finish_frames (frame_info_ptr frame)
 {
-  struct frame_info *start;
+  frame_info_ptr start;
 
   do
     {
@@ -1792,7 +1792,7 @@ skip_finish_frames (struct frame_info *frame)
 static void
 finish_command (const char *arg, int from_tty)
 {
-  struct frame_info *frame;
+  frame_info_ptr frame;
   int async_exec;
   struct finish_command_fsm *sm;
   struct thread_info *tp;
@@ -2193,7 +2193,7 @@ default_print_one_register_info (struct ui_file *file,
 void
 default_print_registers_info (struct gdbarch *gdbarch,
 			      struct ui_file *file,
-			      struct frame_info *frame,
+			      frame_info_ptr frame,
 			      int regnum, int print_all)
 {
   int i;
@@ -2237,7 +2237,7 @@ default_print_registers_info (struct gdbarch *gdbarch,
 void
 registers_info (const char *addr_exp, int fpregs)
 {
-  struct frame_info *frame;
+  frame_info_ptr frame;
   struct gdbarch *gdbarch;
 
   if (!target_has_registers ())
@@ -2354,7 +2354,7 @@ info_registers_command (const char *addr_exp, int from_tty)
 
 static void
 print_vector_info (struct ui_file *file,
-		   struct frame_info *frame, const char *args)
+		   frame_info_ptr frame, const char *args)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
 
@@ -2887,7 +2887,7 @@ interrupt_command (const char *args, int from_tty)
 
 void
 default_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
-			  struct frame_info *frame, const char *args)
+			  frame_info_ptr frame, const char *args)
 {
   int regnum;
   int printed_something = 0;
@@ -2908,7 +2908,7 @@ default_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
 static void
 info_float_command (const char *args, int from_tty)
 {
-  struct frame_info *frame;
+  frame_info_ptr frame;
 
   if (!target_has_registers ())
     error (_("The program has no registers now."));
diff --git a/gdb/inferior.h b/gdb/inferior.h
index 017800165b4..4d6fdd89e34 100644
--- a/gdb/inferior.h
+++ b/gdb/inferior.h
@@ -25,7 +25,7 @@
 #include <list>
 
 struct target_waitstatus;
-struct frame_info;
+class frame_info_ptr;
 struct ui_file;
 struct type;
 struct gdbarch;
@@ -156,7 +156,7 @@ extern void reopen_exec_file (void);
 
 extern void default_print_registers_info (struct gdbarch *gdbarch,
 					  struct ui_file *file,
-					  struct frame_info *frame,
+					  frame_info_ptr frame,
 					  int regnum, int all);
 
 /* Default implementation of gdbarch_print_float_info.  Print
@@ -164,7 +164,7 @@ extern void default_print_registers_info (struct gdbarch *gdbarch,
 
 extern void default_print_float_info (struct gdbarch *gdbarch,
 				      struct ui_file *file,
-				      struct frame_info *frame,
+				      frame_info_ptr frame,
 				      const char *args);
 
 extern void child_terminal_info (struct target_ops *self, const char *, int);
diff --git a/gdb/infrun.c b/gdb/infrun.c
index f846eb050a5..a21731481e1 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -84,9 +84,9 @@ static void follow_inferior_reset_breakpoints (void);
 
 static bool currently_stepping (struct thread_info *tp);
 
-static void insert_hp_step_resume_breakpoint_at_frame (struct frame_info *);
+static void insert_hp_step_resume_breakpoint_at_frame (frame_info_ptr );
 
-static void insert_step_resume_breakpoint_at_caller (struct frame_info *);
+static void insert_step_resume_breakpoint_at_caller (frame_info_ptr );
 
 static void insert_longjmp_resume_breakpoint (struct gdbarch *, CORE_ADDR);
 
@@ -3475,7 +3475,7 @@ static void handle_step_into_function_backward (struct gdbarch *gdbarch,
 						struct execution_control_state *ecs);
 static void handle_signal_stop (struct execution_control_state *ecs);
 static void check_exception_resume (struct execution_control_state *,
-				    struct frame_info *);
+				    frame_info_ptr );
 
 static void end_stepping_range (struct execution_control_state *ecs);
 static void stop_waiting (struct execution_control_state *ecs);
@@ -4327,7 +4327,7 @@ fetch_inferior_event ()
 /* See infrun.h.  */
 
 void
-set_step_info (thread_info *tp, struct frame_info *frame,
+set_step_info (thread_info *tp, frame_info_ptr frame,
 	       struct symtab_and_line sal)
 {
   /* This can be removed once this function no longer implicitly relies on the
@@ -4559,7 +4559,7 @@ adjust_pc_after_break (struct thread_info *thread,
 }
 
 static bool
-stepped_in_from (struct frame_info *frame, struct frame_id step_frame_id)
+stepped_in_from (frame_info_ptr frame, struct frame_id step_frame_id)
 {
   for (frame = get_prev_frame (frame);
        frame != NULL;
@@ -4584,7 +4584,7 @@ stepped_in_from (struct frame_info *frame, struct frame_id step_frame_id)
 static bool
 inline_frame_is_marked_for_skip (bool prev_frame, struct thread_info *tp)
 {
-  struct frame_info *frame = get_current_frame ();
+  frame_info_ptr frame = get_current_frame ();
 
   if (prev_frame)
     frame = get_prev_frame (frame);
@@ -6118,7 +6118,7 @@ finish_step_over (struct execution_control_state *ecs)
 static void
 handle_signal_stop (struct execution_control_state *ecs)
 {
-  struct frame_info *frame;
+  frame_info_ptr frame;
   struct gdbarch *gdbarch;
   int stopped_by_watchpoint;
   enum stop_kind stop_soon;
@@ -6629,7 +6629,7 @@ static void
 process_event_stop_test (struct execution_control_state *ecs)
 {
   struct symtab_and_line stop_pc_sal;
-  struct frame_info *frame;
+  frame_info_ptr frame;
   struct gdbarch *gdbarch;
   CORE_ADDR jmp_buf_pc;
   struct bpstat_what what;
@@ -6700,7 +6700,7 @@ process_event_stop_test (struct execution_control_state *ecs)
 
     case BPSTAT_WHAT_CLEAR_LONGJMP_RESUME:
       {
-	struct frame_info *init_frame;
+	frame_info_ptr init_frame;
 
 	/* There are several cases to consider.
 
@@ -7675,7 +7675,7 @@ restart_after_all_stop_detach (process_stratum_target *proc_target)
 static bool
 keep_going_stepped_thread (struct thread_info *tp)
 {
-  struct frame_info *frame;
+  frame_info_ptr frame;
   struct execution_control_state ecss;
   struct execution_control_state *ecs = &ecss;
 
@@ -7932,7 +7932,7 @@ insert_step_resume_breakpoint_at_sal (struct gdbarch *gdbarch,
    RETURN_FRAME.pc.  */
 
 static void
-insert_hp_step_resume_breakpoint_at_frame (struct frame_info *return_frame)
+insert_hp_step_resume_breakpoint_at_frame (frame_info_ptr return_frame)
 {
   gdb_assert (return_frame != NULL);
 
@@ -7963,7 +7963,7 @@ insert_hp_step_resume_breakpoint_at_frame (struct frame_info *return_frame)
    of frame_unwind_caller_id for an example).  */
 
 static void
-insert_step_resume_breakpoint_at_caller (struct frame_info *next_frame)
+insert_step_resume_breakpoint_at_caller (frame_info_ptr next_frame)
 {
   /* We shouldn't have gotten here if we don't know where the call site
      is.  */
@@ -8010,7 +8010,7 @@ insert_longjmp_resume_breakpoint (struct gdbarch *gdbarch, CORE_ADDR pc)
 static void
 insert_exception_resume_breakpoint (struct thread_info *tp,
 				    const struct block *b,
-				    struct frame_info *frame,
+				    frame_info_ptr frame,
 				    struct symbol *sym)
 {
   try
@@ -8054,7 +8054,7 @@ insert_exception_resume_breakpoint (struct thread_info *tp,
 static void
 insert_exception_resume_from_probe (struct thread_info *tp,
 				    const struct bound_probe *probe,
-				    struct frame_info *frame)
+				    frame_info_ptr frame)
 {
   struct value *arg_value;
   CORE_ADDR handler;
@@ -8081,7 +8081,7 @@ insert_exception_resume_from_probe (struct thread_info *tp,
 
 static void
 check_exception_resume (struct execution_control_state *ecs,
-			struct frame_info *frame)
+			frame_info_ptr frame)
 {
   struct bound_probe probe;
   struct symbol *func;
@@ -8740,7 +8740,7 @@ normal_stop (void)
 	  /* Pop the empty frame that contains the stack dummy.  This
 	     also restores inferior state prior to the call (struct
 	     infcall_suspend_state).  */
-	  struct frame_info *frame = get_current_frame ();
+	  frame_info_ptr frame = get_current_frame ();
 
 	  gdb_assert (get_frame_type (frame) == DUMMY_FRAME);
 	  frame_pop (frame);
diff --git a/gdb/infrun.h b/gdb/infrun.h
index 0c7c55eabec..d1209a94a22 100644
--- a/gdb/infrun.h
+++ b/gdb/infrun.h
@@ -24,7 +24,7 @@
 #include "gdbsupport/intrusive_list.h"
 
 struct target_waitstatus;
-struct frame_info;
+class frame_info_ptr;
 struct address_space;
 struct return_value_info;
 struct process_stratum_target;
@@ -198,7 +198,7 @@ extern int stepping_past_nonsteppable_watchpoint (void);
 
 /* Record in TP the frame and location we're currently stepping through.  */
 extern void set_step_info (thread_info *tp,
-			   struct frame_info *frame,
+			   frame_info_ptr frame,
 			   struct symtab_and_line sal);
 
 /* Several print_*_reason helper functions to print why the inferior
diff --git a/gdb/inline-frame.c b/gdb/inline-frame.c
index 5cb6776aaff..5f4ab66609a 100644
--- a/gdb/inline-frame.c
+++ b/gdb/inline-frame.c
@@ -150,7 +150,7 @@ clear_inline_frame_state (thread_info *thread)
 }
 
 static void
-inline_frame_this_id (struct frame_info *this_frame,
+inline_frame_this_id (frame_info_ptr this_frame,
 		      void **this_cache,
 		      struct frame_id *this_id)
 {
@@ -163,7 +163,7 @@ inline_frame_this_id (struct frame_info *this_frame,
      function, there must be previous frames, so this is safe - as
      long as we're careful not to create any cycles.  See related
      comments in get_prev_frame_always_1.  */
-  frame_info *prev_frame = get_prev_frame_always (this_frame);
+  frame_info_ptr prev_frame = get_prev_frame_always (this_frame);
   if (prev_frame == nullptr)
     error (_("failed to find previous frame when computing inline frame id"));
   *this_id = get_frame_id (prev_frame);
@@ -186,7 +186,7 @@ inline_frame_this_id (struct frame_info *this_frame,
 }
 
 static struct value *
-inline_frame_prev_register (struct frame_info *this_frame, void **this_cache,
+inline_frame_prev_register (frame_info_ptr this_frame, void **this_cache,
 			    int regnum)
 {
   /* Use get_frame_register_value instead of
@@ -208,13 +208,13 @@ inline_frame_prev_register (struct frame_info *this_frame, void **this_cache,
 
 static int
 inline_frame_sniffer (const struct frame_unwind *self,
-		      struct frame_info *this_frame,
+		      frame_info_ptr this_frame,
 		      void **this_cache)
 {
   CORE_ADDR this_pc;
   const struct block *frame_block, *cur_block;
   int depth;
-  struct frame_info *next_frame;
+  frame_info_ptr next_frame;
   struct inline_state *state = find_inline_frame_state (inferior_thread ());
 
   this_pc = get_frame_address_in_block (this_frame);
@@ -441,9 +441,9 @@ inline_skipped_symbol (thread_info *thread)
    skip_inline_frames).  */
 
 int
-frame_inlined_callees (struct frame_info *this_frame)
+frame_inlined_callees (frame_info_ptr this_frame)
 {
-  struct frame_info *next_frame;
+  frame_info_ptr next_frame;
   int inline_count = 0;
 
   /* First count how many inlined functions at this PC have frames
diff --git a/gdb/inline-frame.h b/gdb/inline-frame.h
index d4822d49dbd..211a9eca956 100644
--- a/gdb/inline-frame.h
+++ b/gdb/inline-frame.h
@@ -20,7 +20,7 @@
 #if !defined (INLINE_FRAME_H)
 #define INLINE_FRAME_H 1
 
-struct frame_info;
+class frame_info_ptr;
 struct frame_unwind;
 struct bpstat;
 struct process_stratum_target;
@@ -68,6 +68,6 @@ struct symbol *inline_skipped_symbol (thread_info *thread);
    the callees may not have associated frames (see
    skip_inline_frames).  */
 
-int frame_inlined_callees (struct frame_info *this_frame);
+int frame_inlined_callees (frame_info_ptr this_frame);
 
 #endif /* !defined (INLINE_FRAME_H) */
diff --git a/gdb/iq2000-tdep.c b/gdb/iq2000-tdep.c
index 42fcc46ac85..241aa2155c0 100644
--- a/gdb/iq2000-tdep.c
+++ b/gdb/iq2000-tdep.c
@@ -199,7 +199,7 @@ static CORE_ADDR
 iq2000_scan_prologue (struct gdbarch *gdbarch,
 		      CORE_ADDR scan_start,
 		      CORE_ADDR scan_end,
-		      struct frame_info *fi,
+		      frame_info_ptr fi,
 		      struct iq2000_frame_cache *cache)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
@@ -359,7 +359,7 @@ iq2000_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
 }
 
 static struct iq2000_frame_cache *
-iq2000_frame_cache (struct frame_info *this_frame, void **this_cache)
+iq2000_frame_cache (frame_info_ptr this_frame, void **this_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   struct iq2000_frame_cache *cache;
@@ -392,7 +392,7 @@ iq2000_frame_cache (struct frame_info *this_frame, void **this_cache)
 }
 
 static struct value *
-iq2000_frame_prev_register (struct frame_info *this_frame, void **this_cache,
+iq2000_frame_prev_register (frame_info_ptr this_frame, void **this_cache,
 			    int regnum)
 {
   struct iq2000_frame_cache *cache = iq2000_frame_cache (this_frame,
@@ -412,7 +412,7 @@ iq2000_frame_prev_register (struct frame_info *this_frame, void **this_cache,
 }
 
 static void
-iq2000_frame_this_id (struct frame_info *this_frame, void **this_cache,
+iq2000_frame_this_id (frame_info_ptr this_frame, void **this_cache,
 		      struct frame_id *this_id)
 {
   struct iq2000_frame_cache *cache = iq2000_frame_cache (this_frame,
@@ -436,7 +436,7 @@ static const struct frame_unwind iq2000_frame_unwind = {
 };
 
 static CORE_ADDR
-iq2000_frame_base_address (struct frame_info *this_frame, void **this_cache)
+iq2000_frame_base_address (frame_info_ptr this_frame, void **this_cache)
 {
   struct iq2000_frame_cache *cache = iq2000_frame_cache (this_frame,
 							 this_cache);
diff --git a/gdb/mi/mi-cmd-stack.c b/gdb/mi/mi-cmd-stack.c
index 40c1345404d..f23559f886c 100644
--- a/gdb/mi/mi-cmd-stack.c
+++ b/gdb/mi/mi-cmd-stack.c
@@ -44,7 +44,7 @@ enum what_to_list { locals, arguments, all };
 static void list_args_or_locals (const frame_print_options &fp_opts,
 				 enum what_to_list what,
 				 enum print_values values,
-				 struct frame_info *fi,
+				 frame_info_ptr fi,
 				 int skip_unavailable);
 
 /* True if we want to allow Python-based frame filters.  */
@@ -61,7 +61,7 @@ mi_cmd_enable_frame_filters (const char *command, char **argv, int argc)
 /* Like apply_ext_lang_frame_filter, but take a print_values */
 
 static enum ext_lang_bt_status
-mi_apply_ext_lang_frame_filter (struct frame_info *frame,
+mi_apply_ext_lang_frame_filter (frame_info_ptr frame,
 				frame_filter_flags flags,
 				enum print_values print_values,
 				struct ui_out *out,
@@ -87,7 +87,7 @@ mi_cmd_stack_list_frames (const char *command, char **argv, int argc)
   int frame_low;
   int frame_high;
   int i;
-  struct frame_info *fi;
+  frame_info_ptr fi;
   enum ext_lang_bt_status result = EXT_LANG_BT_ERROR;
   int raw_arg = 0;
   int oind = 0;
@@ -189,7 +189,7 @@ mi_cmd_stack_info_depth (const char *command, char **argv, int argc)
 {
   int frame_high;
   int i;
-  struct frame_info *fi;
+  frame_info_ptr fi;
 
   if (argc > 1)
     error (_("-stack-info-depth: Usage: [MAX_DEPTH]"));
@@ -216,7 +216,7 @@ mi_cmd_stack_info_depth (const char *command, char **argv, int argc)
 void
 mi_cmd_stack_list_locals (const char *command, char **argv, int argc)
 {
-  struct frame_info *frame;
+  frame_info_ptr frame;
   int raw_arg = 0;
   enum ext_lang_bt_status result = EXT_LANG_BT_ERROR;
   enum print_values print_value;
@@ -295,7 +295,7 @@ mi_cmd_stack_list_args (const char *command, char **argv, int argc)
   int frame_low;
   int frame_high;
   int i;
-  struct frame_info *fi;
+  frame_info_ptr fi;
   enum print_values print_values;
   struct ui_out *uiout = current_uiout;
   int raw_arg = 0;
@@ -408,7 +408,7 @@ mi_cmd_stack_list_args (const char *command, char **argv, int argc)
 void
 mi_cmd_stack_list_variables (const char *command, char **argv, int argc)
 {
-  struct frame_info *frame;
+  frame_info_ptr frame;
   int raw_arg = 0;
   enum ext_lang_bt_status result = EXT_LANG_BT_ERROR;
   enum print_values print_value;
@@ -566,7 +566,7 @@ list_arg_or_local (const struct frame_arg *arg, enum what_to_list what,
 static void
 list_args_or_locals (const frame_print_options &fp_opts,
 		     enum what_to_list what, enum print_values values,
-		     struct frame_info *fi, int skip_unavailable)
+		     frame_info_ptr fi, int skip_unavailable)
 {
   const struct block *block;
   struct symbol *sym;
@@ -692,7 +692,7 @@ list_args_or_locals (const frame_print_options &fp_opts,
    manual, this feature is supported here purely for backward
    compatibility.  */
 
-static struct frame_info *
+static frame_info_ptr
 parse_frame_specification (const char *frame_exp)
 {
   gdb_assert (frame_exp != NULL);
@@ -706,7 +706,7 @@ parse_frame_specification (const char *frame_exp)
   struct value *arg = parse_and_eval (frame_exp);
 
   /* Assume ARG is an integer, and try using that to select a frame.  */
-  struct frame_info *fid;
+  frame_info_ptr fid;
   int level = value_as_long (arg);
 
   fid = find_relative_frame (get_current_frame (), &level);
@@ -731,7 +731,7 @@ parse_frame_specification (const char *frame_exp)
     {
       if (id == get_frame_id (fid))
 	{
-	  struct frame_info *prev_frame;
+	  frame_info_ptr prev_frame;
 
 	  while (1)
 	    {
diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
index ee2e9acf634..5f3b707bb9b 100644
--- a/gdb/mi/mi-main.c
+++ b/gdb/mi/mi-main.c
@@ -95,7 +95,7 @@ static void mi_execute_async_cli_command (const char *cli_command,
 					  char **argv, int argc);
 static bool register_changed_p (int regnum, readonly_detached_regcache *,
 			       readonly_detached_regcache *);
-static void output_register (struct frame_info *, int regnum, int format,
+static void output_register (frame_info_ptr , int regnum, int format,
 			     int skip_unavailable);
 
 /* Controls whether the frontend wants MI in async mode.  */
@@ -1008,7 +1008,7 @@ void
 mi_cmd_data_list_register_values (const char *command, char **argv, int argc)
 {
   struct ui_out *uiout = current_uiout;
-  struct frame_info *frame;
+  frame_info_ptr frame;
   struct gdbarch *gdbarch;
   int regnum, numregs, format;
   int i;
@@ -1095,7 +1095,7 @@ mi_cmd_data_list_register_values (const char *command, char **argv, int argc)
    unavailable.  */
 
 static void
-output_register (struct frame_info *frame, int regnum, int format,
+output_register (frame_info_ptr frame, int regnum, int format,
 		 int skip_unavailable)
 {
   struct ui_out *uiout = current_uiout;
@@ -2083,7 +2083,7 @@ mi_cmd_execute (struct mi_parse *parse)
   gdb::optional<scoped_restore_selected_frame> frame_saver;
   if (parse->frame != -1)
     {
-      struct frame_info *fid;
+      frame_info_ptr fid;
       int frame = parse->frame;
 
       fid = find_relative_frame (get_current_frame (), &frame);
@@ -2618,7 +2618,7 @@ mi_cmd_trace_frame_collected (const char *command, char **argv, int argc)
      the trace frame info, but instead consult the register cache for
      register availability.  */
   {
-    struct frame_info *frame;
+    frame_info_ptr frame;
     struct gdbarch *gdbarch;
     int regnum;
     int numregs;
diff --git a/gdb/python/py-event.h b/gdb/python/py-event.h
index 220af1f7b12..1aa888f081a 100644
--- a/gdb/python/py-event.h
+++ b/gdb/python/py-event.h
@@ -55,7 +55,7 @@ enum inferior_call_kind
 
 extern int emit_inferior_call_event (inferior_call_kind kind,
 				     ptid_t thread, CORE_ADDR addr);
-extern int emit_register_changed_event (struct frame_info *frame,
+extern int emit_register_changed_event (frame_info_ptr frame,
 					int regnum);
 extern int emit_memory_changed_event (CORE_ADDR addr, ssize_t len);
 extern int evpy_emit_event (PyObject *event,
diff --git a/gdb/python/py-finishbreakpoint.c b/gdb/python/py-finishbreakpoint.c
index 2d476114b35..5d9b14b19c3 100644
--- a/gdb/python/py-finishbreakpoint.c
+++ b/gdb/python/py-finishbreakpoint.c
@@ -164,8 +164,8 @@ bpfinishpy_init (PyObject *self, PyObject *args, PyObject *kwargs)
       (struct finish_breakpoint_object *) self;
   PyObject *frame_obj = NULL;
   int thread;
-  struct frame_info *frame = NULL; /* init for gcc -Wall */
-  struct frame_info *prev_frame = NULL;
+  frame_info_ptr frame = NULL; /* init for gcc -Wall */
+  frame_info_ptr prev_frame = NULL;
   struct frame_id frame_id;
   PyObject *internal = NULL;
   int internal_bp = 0;
diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c
index 9b3a0ac142b..85256a8807d 100644
--- a/gdb/python/py-frame.c
+++ b/gdb/python/py-frame.c
@@ -57,11 +57,11 @@ struct frame_object {
    object.  If the frame doesn't exist anymore (the frame id doesn't
    correspond to any frame in the inferior), returns NULL.  */
 
-struct frame_info *
+frame_info_ptr
 frame_object_to_frame_info (PyObject *obj)
 {
   frame_object *frame_obj = (frame_object *) obj;
-  struct frame_info *frame;
+  frame_info_ptr frame;
 
   frame = frame_find_by_id (frame_obj->frame_id);
   if (frame == NULL)
@@ -90,7 +90,7 @@ frapy_str (PyObject *self)
 static PyObject *
 frapy_is_valid (PyObject *self, PyObject *args)
 {
-  struct frame_info *frame = NULL;
+  frame_info_ptr frame = NULL;
 
   try
     {
@@ -113,7 +113,7 @@ frapy_is_valid (PyObject *self, PyObject *args)
 static PyObject *
 frapy_name (PyObject *self, PyObject *args)
 {
-  struct frame_info *frame;
+  frame_info_ptr frame;
   gdb::unique_xmalloc_ptr<char> name;
   enum language lang;
   PyObject *result;
@@ -149,7 +149,7 @@ frapy_name (PyObject *self, PyObject *args)
 static PyObject *
 frapy_type (PyObject *self, PyObject *args)
 {
-  struct frame_info *frame;
+  frame_info_ptr frame;
   enum frame_type type = NORMAL_FRAME;/* Initialize to appease gcc warning.  */
 
   try
@@ -172,7 +172,7 @@ frapy_type (PyObject *self, PyObject *args)
 static PyObject *
 frapy_arch (PyObject *self, PyObject *args)
 {
-  struct frame_info *frame = NULL;    /* Initialize to appease gcc warning.  */
+  frame_info_ptr frame = NULL;    /* Initialize to appease gcc warning.  */
   frame_object *obj = (frame_object *) self;
 
   try
@@ -193,7 +193,7 @@ frapy_arch (PyObject *self, PyObject *args)
 static PyObject *
 frapy_unwind_stop_reason (PyObject *self, PyObject *args)
 {
-  struct frame_info *frame = NULL;    /* Initialize to appease gcc warning.  */
+  frame_info_ptr frame = NULL;    /* Initialize to appease gcc warning.  */
   enum unwind_stop_reason stop_reason;
 
   try
@@ -217,7 +217,7 @@ static PyObject *
 frapy_pc (PyObject *self, PyObject *args)
 {
   CORE_ADDR pc = 0;	      /* Initialize to appease gcc warning.  */
-  struct frame_info *frame;
+  frame_info_ptr frame;
 
   try
     {
@@ -246,7 +246,7 @@ frapy_read_register (PyObject *self, PyObject *args)
     return NULL;
   try
     {
-      struct frame_info *frame;
+      frame_info_ptr frame;
       int regnum;
 
       FRAPY_REQUIRE_VALID (self, frame);
@@ -278,7 +278,7 @@ frapy_read_register (PyObject *self, PyObject *args)
 static PyObject *
 frapy_block (PyObject *self, PyObject *args)
 {
-  struct frame_info *frame;
+  frame_info_ptr frame;
   const struct block *block = NULL, *fn_block;
 
   try
@@ -320,7 +320,7 @@ static PyObject *
 frapy_function (PyObject *self, PyObject *args)
 {
   struct symbol *sym = NULL;
-  struct frame_info *frame;
+  frame_info_ptr frame;
 
   try
     {
@@ -346,7 +346,7 @@ frapy_function (PyObject *self, PyObject *args)
    Sets a Python exception and returns NULL on error.  */
 
 PyObject *
-frame_info_to_frame_object (struct frame_info *frame)
+frame_info_to_frame_object (frame_info_ptr frame)
 {
   gdbpy_ref<frame_object> frame_obj (PyObject_New (frame_object,
 						   &frame_object_type));
@@ -389,7 +389,7 @@ frame_info_to_frame_object (struct frame_info *frame)
 static PyObject *
 frapy_older (PyObject *self, PyObject *args)
 {
-  struct frame_info *frame, *prev = NULL;
+  frame_info_ptr frame, prev = NULL;
   PyObject *prev_obj = NULL;   /* Initialize to appease gcc warning.  */
 
   try
@@ -421,7 +421,7 @@ frapy_older (PyObject *self, PyObject *args)
 static PyObject *
 frapy_newer (PyObject *self, PyObject *args)
 {
-  struct frame_info *frame, *next = NULL;
+  frame_info_ptr frame, next = NULL;
   PyObject *next_obj = NULL;   /* Initialize to appease gcc warning.  */
 
   try
@@ -452,7 +452,7 @@ frapy_newer (PyObject *self, PyObject *args)
 static PyObject *
 frapy_find_sal (PyObject *self, PyObject *args)
 {
-  struct frame_info *frame;
+  frame_info_ptr frame;
   PyObject *sal_obj = NULL;   /* Initialize to appease gcc warning.  */
 
   try
@@ -480,7 +480,7 @@ frapy_find_sal (PyObject *self, PyObject *args)
 static PyObject *
 frapy_read_var (PyObject *self, PyObject *args)
 {
-  struct frame_info *frame;
+  frame_info_ptr frame;
   PyObject *sym_obj, *block_obj = NULL;
   struct symbol *var = NULL;	/* gcc-4.3.2 false warning.  */
   const struct block *block = NULL;
@@ -561,7 +561,7 @@ frapy_read_var (PyObject *self, PyObject *args)
 static PyObject *
 frapy_select (PyObject *self, PyObject *args)
 {
-  struct frame_info *fi;
+  frame_info_ptr fi;
 
   try
     {
@@ -582,7 +582,7 @@ frapy_select (PyObject *self, PyObject *args)
 static PyObject *
 frapy_level (PyObject *self, PyObject *args)
 {
-  struct frame_info *fi;
+  frame_info_ptr fi;
 
   try
     {
@@ -605,7 +605,7 @@ frapy_language (PyObject *self, PyObject *args)
 {
   try
     {
-      struct frame_info *fi;
+      frame_info_ptr fi;
       FRAPY_REQUIRE_VALID (self, fi);
 
       enum language lang = get_frame_language (fi);
@@ -627,7 +627,7 @@ frapy_language (PyObject *self, PyObject *args)
 PyObject *
 gdbpy_newest_frame (PyObject *self, PyObject *args)
 {
-  struct frame_info *frame = NULL;
+  frame_info_ptr frame = NULL;
 
   try
     {
@@ -647,7 +647,7 @@ gdbpy_newest_frame (PyObject *self, PyObject *args)
 PyObject *
 gdbpy_selected_frame (PyObject *self, PyObject *args)
 {
-  struct frame_info *frame = NULL;
+  frame_info_ptr frame = NULL;
 
   try
     {
diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c
index 366f3745b9d..0d7dc48c5a0 100644
--- a/gdb/python/py-framefilter.c
+++ b/gdb/python/py-framefilter.c
@@ -419,7 +419,7 @@ enumerate_args (PyObject *iter,
 		struct ui_out *out,
 		enum ext_lang_frame_args args_type,
 		int print_args_field,
-		struct frame_info *frame)
+		frame_info_ptr frame)
 {
   struct value_print_options opts;
 
@@ -550,7 +550,7 @@ enumerate_locals (PyObject *iter,
 		  int indent,
 		  enum ext_lang_frame_args args_type,
 		  int print_args_field,
-		  struct frame_info *frame)
+		  frame_info_ptr frame)
 {
   struct value_print_options opts;
 
@@ -638,7 +638,7 @@ static enum ext_lang_bt_status
 py_mi_print_variables (PyObject *filter, struct ui_out *out,
 		       struct value_print_options *opts,
 		       enum ext_lang_frame_args args_type,
-		       struct frame_info *frame)
+		       frame_info_ptr frame)
 {
   gdbpy_ref<> args_iter (get_py_iter_from_func (filter, "frame_args"));
   if (args_iter == NULL)
@@ -672,7 +672,7 @@ py_print_locals (PyObject *filter,
 		 struct ui_out *out,
 		 enum ext_lang_frame_args args_type,
 		 int indent,
-		 struct frame_info *frame)
+		 frame_info_ptr frame)
 {
   gdbpy_ref<> locals_iter (get_py_iter_from_func (filter, "frame_locals"));
   if (locals_iter == NULL)
@@ -697,7 +697,7 @@ static enum ext_lang_bt_status
 py_print_args (PyObject *filter,
 	       struct ui_out *out,
 	       enum ext_lang_frame_args args_type,
-	       struct frame_info *frame)
+	       frame_info_ptr frame)
 {
   gdbpy_ref<> args_iter (get_py_iter_from_func (filter, "frame_args"));
   if (args_iter == NULL)
@@ -754,7 +754,7 @@ py_print_frame (PyObject *filter, frame_filter_flags flags,
   int has_addr = 0;
   CORE_ADDR address = 0;
   struct gdbarch *gdbarch = NULL;
-  struct frame_info *frame = NULL;
+  frame_info_ptr frame = NULL;
   struct value_print_options opts;
 
   int print_level, print_frame_info, print_args, print_locals;
@@ -862,8 +862,8 @@ py_print_frame (PyObject *filter, frame_filter_flags flags,
       struct frame_info **slot;
       int level;
 
-      slot = (struct frame_info **) htab_find_slot (levels_printed,
-						    frame, INSERT);
+      slot = (frame_info **) htab_find_slot (levels_printed,
+						   frame.get(), INSERT);
 
       level = frame_relative_level (frame);
 
@@ -875,7 +875,7 @@ py_print_frame (PyObject *filter, frame_filter_flags flags,
 	out->field_skip ("level");
       else
 	{
-	  *slot = frame;
+	  *slot = frame.get ();
 	  annotate_frame_begin (print_level ? level : 0,
 				gdbarch, address);
 	  out->text ("#");
@@ -1078,7 +1078,7 @@ py_print_frame (PyObject *filter, frame_filter_flags flags,
    frame FRAME.  */
 
 static PyObject *
-bootstrap_python_frame_filters (struct frame_info *frame,
+bootstrap_python_frame_filters (frame_info_ptr frame,
 				int frame_low, int frame_high)
 {
   gdbpy_ref<> frame_obj (frame_info_to_frame_object (frame));
@@ -1133,7 +1133,7 @@ bootstrap_python_frame_filters (struct frame_info *frame,
 
 enum ext_lang_bt_status
 gdbpy_apply_frame_filter (const struct extension_language_defn *extlang,
-			  struct frame_info *frame, frame_filter_flags flags,
+			  frame_info_ptr frame, frame_filter_flags flags,
 			  enum ext_lang_frame_args args_type,
 			  struct ui_out *out, int frame_low, int frame_high)
 {
diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c
index 6ea384e26a0..f188f376c58 100644
--- a/gdb/python/py-inferior.c
+++ b/gdb/python/py-inferior.c
@@ -174,7 +174,7 @@ python_on_memory_change (struct inferior *inferior, CORE_ADDR addr, ssize_t len,
    command). */
 
 static void
-python_on_register_change (struct frame_info *frame, int regnum)
+python_on_register_change (frame_info_ptr frame, int regnum)
 {
   gdbpy_enter enter_py (target_gdbarch ());
 
diff --git a/gdb/python/py-infevents.c b/gdb/python/py-infevents.c
index 0a0ca998134..9920bed98c5 100644
--- a/gdb/python/py-infevents.c
+++ b/gdb/python/py-infevents.c
@@ -62,7 +62,7 @@ create_inferior_call_event_object (inferior_call_kind flag, ptid_t ptid,
    register number. */
 
 static gdbpy_ref<>
-create_register_changed_event_object (struct frame_info *frame, 
+create_register_changed_event_object (frame_info_ptr frame, 
 				      int regnum)
 {
   gdbpy_ref<> event = create_event_object (&register_changed_event_object_type);
@@ -151,7 +151,7 @@ emit_memory_changed_event (CORE_ADDR addr, ssize_t len)
    will create a new Python register changed event object. */
 
 int
-emit_register_changed_event (struct frame_info* frame, int regnum)
+emit_register_changed_event (frame_info_ptr frame, int regnum)
 {
   if (evregpy_no_listeners_p (gdb_py_events.register_changed))
     return 0;
diff --git a/gdb/python/py-symbol.c b/gdb/python/py-symbol.c
index e5fe5cf8c92..93c86964f3e 100644
--- a/gdb/python/py-symbol.c
+++ b/gdb/python/py-symbol.c
@@ -265,7 +265,7 @@ static PyObject *
 sympy_value (PyObject *self, PyObject *args)
 {
   struct symbol *symbol = NULL;
-  struct frame_info *frame_info = NULL;
+  frame_info_ptr frame_info = NULL;
   PyObject *frame_obj = NULL;
   struct value *value = NULL;
 
@@ -401,7 +401,7 @@ gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw)
     block = block_object_to_block (block_obj);
   else
     {
-      struct frame_info *selected_frame;
+      frame_info_ptr selected_frame;
 
       try
 	{
@@ -511,7 +511,7 @@ gdbpy_lookup_static_symbol (PyObject *self, PyObject *args, PyObject *kw)
   const struct block *block = NULL;
   try
     {
-      struct frame_info *selected_frame
+      frame_info_ptr selected_frame
 	= get_selected_frame (_("No frame selected."));
       block = get_frame_block (selected_frame, NULL);
     }
diff --git a/gdb/python/py-unwind.c b/gdb/python/py-unwind.c
index fb9466102c4..fa8f128a32e 100644
--- a/gdb/python/py-unwind.c
+++ b/gdb/python/py-unwind.c
@@ -57,7 +57,7 @@ struct pending_frame_object
   PyObject_HEAD
 
   /* Frame we are unwinding.  */
-  struct frame_info *frame_info;
+  frame_info_ptr frame_info;
 
   /* Its architecture, passed by the sniffer caller.  */
   struct gdbarch *gdbarch;
@@ -342,7 +342,7 @@ unwind_infopy_dealloc (PyObject *self)
 static PyObject *
 pending_framepy_str (PyObject *self)
 {
-  struct frame_info *frame = ((pending_frame_object *) self)->frame_info;
+  frame_info_ptr frame = ((pending_frame_object *) self)->frame_info;
   const char *sp_str = NULL;
   const char *pc_str = NULL;
 
@@ -481,7 +481,7 @@ pending_framepy_level (PyObject *self, PyObject *args)
 /* frame_unwind.this_id method.  */
 
 static void
-pyuw_this_id (struct frame_info *this_frame, void **cache_ptr,
+pyuw_this_id (frame_info_ptr this_frame, void **cache_ptr,
 	      struct frame_id *this_id)
 {
   *this_id = ((cached_frame_info *) *cache_ptr)->frame_id;
@@ -491,7 +491,7 @@ pyuw_this_id (struct frame_info *this_frame, void **cache_ptr,
 /* frame_unwind.prev_register.  */
 
 static struct value *
-pyuw_prev_register (struct frame_info *this_frame, void **cache_ptr,
+pyuw_prev_register (frame_info_ptr this_frame, void **cache_ptr,
 		    int regnum)
 {
   PYUW_SCOPED_DEBUG_ENTER_EXIT;
@@ -514,7 +514,7 @@ pyuw_prev_register (struct frame_info *this_frame, void **cache_ptr,
 /* Frame sniffer dispatch.  */
 
 static int
-pyuw_sniffer (const struct frame_unwind *self, struct frame_info *this_frame,
+pyuw_sniffer (const struct frame_unwind *self, frame_info_ptr this_frame,
 	      void **cache_ptr)
 {
   PYUW_SCOPED_DEBUG_ENTER_EXIT;
@@ -641,7 +641,7 @@ pyuw_sniffer (const struct frame_unwind *self, struct frame_info *this_frame,
 /* Frame cache release shim.  */
 
 static void
-pyuw_dealloc_cache (struct frame_info *this_frame, void *cache)
+pyuw_dealloc_cache (frame_info *this_frame, void *cache)
 {
   PYUW_SCOPED_DEBUG_ENTER_EXIT;
   cached_frame_info *cached_frame = (cached_frame_info *) cache;
diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h
index 800b03a105c..df6eeb5dfe7 100644
--- a/gdb/python/python-internal.h
+++ b/gdb/python/python-internal.h
@@ -366,7 +366,7 @@ extern enum ext_lang_rc gdbpy_apply_val_pretty_printer
    const struct language_defn *language);
 extern enum ext_lang_bt_status gdbpy_apply_frame_filter
   (const struct extension_language_defn *,
-   struct frame_info *frame, frame_filter_flags flags,
+   frame_info_ptr frame, frame_filter_flags flags,
    enum ext_lang_frame_args args_type,
    struct ui_out *out, int frame_low, int frame_high);
 extern void gdbpy_preserve_values (const struct extension_language_defn *,
@@ -427,7 +427,7 @@ PyObject *block_to_block_object (const struct block *block,
 PyObject *value_to_value_object (struct value *v);
 PyObject *value_to_value_object_no_release (struct value *v);
 PyObject *type_to_type_object (struct type *);
-PyObject *frame_info_to_frame_object (struct frame_info *frame);
+PyObject *frame_info_to_frame_object (frame_info_ptr frame);
 PyObject *symtab_to_linetable_object (PyObject *symtab);
 gdbpy_ref<> pspace_to_pspace_object (struct program_space *);
 PyObject *pspy_get_printers (PyObject *, void *);
@@ -467,7 +467,7 @@ struct value *convert_value_from_python (PyObject *obj);
 struct type *type_object_to_type (PyObject *obj);
 struct symtab *symtab_object_to_symtab (PyObject *obj);
 struct symtab_and_line *sal_object_to_symtab_and_line (PyObject *obj);
-struct frame_info *frame_object_to_frame_info (PyObject *frame_obj);
+frame_info_ptr frame_object_to_frame_info (PyObject *frame_obj);
 struct gdbarch *arch_object_to_gdbarch (PyObject *obj);
 
 /* Convert Python object OBJ to a program_space pointer.  OBJ must be a
diff --git a/gdb/s12z-tdep.c b/gdb/s12z-tdep.c
index 5e49c615f1b..f6eda88da6a 100644
--- a/gdb/s12z-tdep.c
+++ b/gdb/s12z-tdep.c
@@ -241,7 +241,7 @@ push_pull_get_stack_adjustment (int n_operands,
 /* Initialize a prologue cache.  */
 
 static struct trad_frame_cache *
-s12z_frame_cache (struct frame_info *this_frame, void **prologue_cache)
+s12z_frame_cache (frame_info_ptr this_frame, void **prologue_cache)
 {
   struct trad_frame_cache *info;
 
@@ -420,7 +420,7 @@ s12z_frame_cache (struct frame_info *this_frame, void **prologue_cache)
 
 /* Implement the this_id function for the stub unwinder.  */
 static void
-s12z_frame_this_id (struct frame_info *this_frame,
+s12z_frame_this_id (frame_info_ptr this_frame,
 		    void **prologue_cache, struct frame_id *this_id)
 {
   struct trad_frame_cache *info = s12z_frame_cache (this_frame,
@@ -432,7 +432,7 @@ s12z_frame_this_id (struct frame_info *this_frame,
 
 /* Implement the prev_register function for the stub unwinder.  */
 static struct value *
-s12z_frame_prev_register (struct frame_info *this_frame,
+s12z_frame_prev_register (frame_info_ptr this_frame,
 			  void **prologue_cache, int regnum)
 {
   struct trad_frame_cache *info = s12z_frame_cache (this_frame,
@@ -491,7 +491,7 @@ static const char ccw_bits[] =
 static void
 s12z_print_ccw_info (struct gdbarch *gdbarch,
 		     struct ui_file *file,
-		     struct frame_info *frame,
+		     frame_info_ptr frame,
 		     int reg)
 {
   struct value *v = value_of_register (reg, frame);
@@ -524,7 +524,7 @@ s12z_print_ccw_info (struct gdbarch *gdbarch,
 static void
 s12z_print_registers_info (struct gdbarch *gdbarch,
 			    struct ui_file *file,
-			    struct frame_info *frame,
+			    frame_info_ptr frame,
 			    int regnum, int print_all)
 {
   const int numregs = (gdbarch_num_regs (gdbarch)
diff --git a/gdb/s390-linux-tdep.c b/gdb/s390-linux-tdep.c
index 05bf03973fc..1ead5403ff1 100644
--- a/gdb/s390-linux-tdep.c
+++ b/gdb/s390-linux-tdep.c
@@ -386,7 +386,7 @@ struct s390_sigtramp_unwind_cache {
    s390_sigtramp_frame_unwind.  */
 
 static struct s390_sigtramp_unwind_cache *
-s390_sigtramp_frame_unwind_cache (struct frame_info *this_frame,
+s390_sigtramp_frame_unwind_cache (frame_info_ptr this_frame,
 				  void **this_prologue_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
@@ -496,7 +496,7 @@ s390_sigtramp_frame_unwind_cache (struct frame_info *this_frame,
 /* Implement this_id frame_unwind method for s390_sigtramp_frame_unwind.  */
 
 static void
-s390_sigtramp_frame_this_id (struct frame_info *this_frame,
+s390_sigtramp_frame_this_id (frame_info_ptr this_frame,
 			     void **this_prologue_cache,
 			     struct frame_id *this_id)
 {
@@ -508,7 +508,7 @@ s390_sigtramp_frame_this_id (struct frame_info *this_frame,
 /* Implement prev_register frame_unwind method for sigtramp frames.  */
 
 static struct value *
-s390_sigtramp_frame_prev_register (struct frame_info *this_frame,
+s390_sigtramp_frame_prev_register (frame_info_ptr this_frame,
 				   void **this_prologue_cache, int regnum)
 {
   struct s390_sigtramp_unwind_cache *info
@@ -520,7 +520,7 @@ s390_sigtramp_frame_prev_register (struct frame_info *this_frame,
 
 static int
 s390_sigtramp_frame_sniffer (const struct frame_unwind *self,
-			     struct frame_info *this_frame,
+			     frame_info_ptr this_frame,
 			     void **this_prologue_cache)
 {
   CORE_ADDR pc = get_frame_pc (this_frame);
diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c
index 2aeb3a14637..37c5df21c6d 100644
--- a/gdb/s390-tdep.c
+++ b/gdb/s390-tdep.c
@@ -1982,7 +1982,7 @@ s390_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
    breakpoint.  */
 
 static struct frame_id
-s390_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
+s390_dummy_id (struct gdbarch *gdbarch, frame_info_ptr this_frame)
 {
   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
   CORE_ADDR sp = get_frame_register_unsigned (this_frame, S390_SP_REGNUM);
@@ -2166,7 +2166,7 @@ s390_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
 /* Implement unwind_pc gdbarch method.  */
 
 static CORE_ADDR
-s390_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
+s390_unwind_pc (struct gdbarch *gdbarch, frame_info_ptr next_frame)
 {
   s390_gdbarch_tdep *tdep = gdbarch_tdep<s390_gdbarch_tdep> (gdbarch);
   ULONGEST pc;
@@ -2177,7 +2177,7 @@ s390_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
 /* Implement unwind_sp gdbarch method.  */
 
 static CORE_ADDR
-s390_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
+s390_unwind_sp (struct gdbarch *gdbarch, frame_info_ptr next_frame)
 {
   ULONGEST sp;
   sp = frame_unwind_register_unsigned (next_frame, S390_SP_REGNUM);
@@ -2187,7 +2187,7 @@ s390_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
 /* Helper routine to unwind pseudo registers.  */
 
 static struct value *
-s390_unwind_pseudo_register (struct frame_info *this_frame, int regnum)
+s390_unwind_pseudo_register (frame_info_ptr this_frame, int regnum)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   s390_gdbarch_tdep *tdep = gdbarch_tdep<s390_gdbarch_tdep> (gdbarch);
@@ -2258,7 +2258,7 @@ s390_adjust_frame_regnum (struct gdbarch *gdbarch, int num, int eh_frame_p)
    s390_dwarf2_frame_init_reg.  */
 
 static struct value *
-s390_dwarf2_prev_register (struct frame_info *this_frame, void **this_cache,
+s390_dwarf2_prev_register (frame_info_ptr this_frame, void **this_cache,
 			   int regnum)
 {
   return s390_unwind_pseudo_register (this_frame, regnum);
@@ -2269,7 +2269,7 @@ s390_dwarf2_prev_register (struct frame_info *this_frame, void **this_cache,
 static void
 s390_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
 			    struct dwarf2_frame_state_reg *reg,
-			    struct frame_info *this_frame)
+			    frame_info_ptr this_frame)
 {
   /* The condition code (and thus PSW mask) is call-clobbered.  */
   if (regnum == S390_PSWM_REGNUM)
@@ -2303,7 +2303,7 @@ s390_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
    register translation.  */
 
 struct value *
-s390_trad_frame_prev_register (struct frame_info *this_frame,
+s390_trad_frame_prev_register (frame_info_ptr this_frame,
 			       trad_frame_saved_reg saved_regs[],
 			       int regnum)
 {
@@ -2328,7 +2328,7 @@ struct s390_unwind_cache {
    prologue analysis.  Helper for s390_frame_unwind_cache.  */
 
 static int
-s390_prologue_frame_unwind_cache (struct frame_info *this_frame,
+s390_prologue_frame_unwind_cache (frame_info_ptr this_frame,
 				  struct s390_unwind_cache *info)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
@@ -2344,7 +2344,7 @@ s390_prologue_frame_unwind_cache (struct frame_info *this_frame,
   CORE_ADDR prev_sp;
   int frame_pointer;
   int size;
-  struct frame_info *next_frame;
+  frame_info_ptr next_frame;
 
   /* Try to find the function start address.  If we can't find it, we don't
      bother searching for it -- with modern compilers this would be mostly
@@ -2515,7 +2515,7 @@ s390_prologue_frame_unwind_cache (struct frame_info *this_frame,
    back chain unwinding.  Helper for s390_frame_unwind_cache.  */
 
 static void
-s390_backchain_frame_unwind_cache (struct frame_info *this_frame,
+s390_backchain_frame_unwind_cache (frame_info_ptr this_frame,
 				   struct s390_unwind_cache *info)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
@@ -2572,7 +2572,7 @@ s390_backchain_frame_unwind_cache (struct frame_info *this_frame,
    s390_frame_unwind and s390_frame_base.  */
 
 static struct s390_unwind_cache *
-s390_frame_unwind_cache (struct frame_info *this_frame,
+s390_frame_unwind_cache (frame_info_ptr this_frame,
 			 void **this_prologue_cache)
 {
   struct s390_unwind_cache *info;
@@ -2606,7 +2606,7 @@ s390_frame_unwind_cache (struct frame_info *this_frame,
 /* Implement this_id frame_unwind method for s390_frame_unwind.  */
 
 static void
-s390_frame_this_id (struct frame_info *this_frame,
+s390_frame_this_id (frame_info_ptr this_frame,
 		    void **this_prologue_cache,
 		    struct frame_id *this_id)
 {
@@ -2626,7 +2626,7 @@ s390_frame_this_id (struct frame_info *this_frame,
 /* Implement prev_register frame_unwind method for s390_frame_unwind.  */
 
 static struct value *
-s390_frame_prev_register (struct frame_info *this_frame,
+s390_frame_prev_register (frame_info_ptr this_frame,
 			  void **this_prologue_cache, int regnum)
 {
   struct s390_unwind_cache *info
@@ -2661,7 +2661,7 @@ struct s390_stub_unwind_cache
    s390_stub_frame_unwind.  */
 
 static struct s390_stub_unwind_cache *
-s390_stub_frame_unwind_cache (struct frame_info *this_frame,
+s390_stub_frame_unwind_cache (frame_info_ptr this_frame,
 			      void **this_prologue_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
@@ -2689,7 +2689,7 @@ s390_stub_frame_unwind_cache (struct frame_info *this_frame,
 /* Implement this_id frame_unwind method for s390_stub_frame_unwind.  */
 
 static void
-s390_stub_frame_this_id (struct frame_info *this_frame,
+s390_stub_frame_this_id (frame_info_ptr this_frame,
 			 void **this_prologue_cache,
 			 struct frame_id *this_id)
 {
@@ -2701,7 +2701,7 @@ s390_stub_frame_this_id (struct frame_info *this_frame,
 /* Implement prev_register frame_unwind method for s390_stub_frame_unwind.  */
 
 static struct value *
-s390_stub_frame_prev_register (struct frame_info *this_frame,
+s390_stub_frame_prev_register (frame_info_ptr this_frame,
 			       void **this_prologue_cache, int regnum)
 {
   struct s390_stub_unwind_cache *info
@@ -2713,7 +2713,7 @@ s390_stub_frame_prev_register (struct frame_info *this_frame,
 
 static int
 s390_stub_frame_sniffer (const struct frame_unwind *self,
-			 struct frame_info *this_frame,
+			 frame_info_ptr this_frame,
 			 void **this_prologue_cache)
 {
   CORE_ADDR addr_in_block;
@@ -2744,7 +2744,7 @@ static const struct frame_unwind s390_stub_frame_unwind = {
 /* Frame base handling.  */
 
 static CORE_ADDR
-s390_frame_base_address (struct frame_info *this_frame, void **this_cache)
+s390_frame_base_address (frame_info_ptr this_frame, void **this_cache)
 {
   struct s390_unwind_cache *info
     = s390_frame_unwind_cache (this_frame, this_cache);
@@ -2752,7 +2752,7 @@ s390_frame_base_address (struct frame_info *this_frame, void **this_cache)
 }
 
 static CORE_ADDR
-s390_local_base_address (struct frame_info *this_frame, void **this_cache)
+s390_local_base_address (frame_info_ptr this_frame, void **this_cache)
 {
   struct s390_unwind_cache *info
     = s390_frame_unwind_cache (this_frame, this_cache);
diff --git a/gdb/s390-tdep.h b/gdb/s390-tdep.h
index f51423cb018..a7b16c2066e 100644
--- a/gdb/s390-tdep.h
+++ b/gdb/s390-tdep.h
@@ -314,7 +314,7 @@ enum
 /* Frame unwinding.  */
 
 extern struct value *s390_trad_frame_prev_register
-    (struct frame_info *this_frame, struct trad_frame_saved_reg saved_regs[],
+    (frame_info_ptr this_frame, struct trad_frame_saved_reg saved_regs[],
      int regnum);
 
 extern struct target_desc *tdesc_s390_linux32;
diff --git a/gdb/sentinel-frame.c b/gdb/sentinel-frame.c
index 2e02ad3ca56..a948ddd10b0 100644
--- a/gdb/sentinel-frame.c
+++ b/gdb/sentinel-frame.c
@@ -42,7 +42,7 @@ sentinel_frame_cache (struct regcache *regcache)
 /* Here the register value is taken direct from the register cache.  */
 
 static struct value *
-sentinel_frame_prev_register (struct frame_info *this_frame,
+sentinel_frame_prev_register (frame_info_ptr this_frame,
 			      void **this_prologue_cache,
 			      int regnum)
 {
@@ -57,7 +57,7 @@ sentinel_frame_prev_register (struct frame_info *this_frame,
 }
 
 static void
-sentinel_frame_this_id (struct frame_info *this_frame,
+sentinel_frame_this_id (frame_info_ptr this_frame,
 			void **this_prologue_cache,
 			struct frame_id *this_id)
 {
@@ -68,7 +68,7 @@ sentinel_frame_this_id (struct frame_info *this_frame,
 }
 
 static struct gdbarch *
-sentinel_frame_prev_arch (struct frame_info *this_frame,
+sentinel_frame_prev_arch (frame_info_ptr this_frame,
 			  void **this_prologue_cache)
 {
   struct frame_unwind_cache *cache
diff --git a/gdb/sh-linux-tdep.c b/gdb/sh-linux-tdep.c
index f146f023add..9802fd44a20 100644
--- a/gdb/sh-linux-tdep.c
+++ b/gdb/sh-linux-tdep.c
@@ -77,7 +77,7 @@ static const struct sh_corefile_regmap fpregs_table[] =
 /* SH signal handler frame support.  */
 
 static void
-sh_linux_sigtramp_cache (struct frame_info *this_frame,
+sh_linux_sigtramp_cache (frame_info_ptr this_frame,
 			 struct trad_frame_cache *this_cache,
 			 CORE_ADDR func, int regs_offset)
 {
@@ -114,7 +114,7 @@ sh_linux_sigtramp_cache (struct frame_info *this_frame,
 
 static void
 sh_linux_sigreturn_init (const struct tramp_frame *self,
-			 struct frame_info *this_frame,
+			 frame_info_ptr this_frame,
 			 struct trad_frame_cache *this_cache,
 			 CORE_ADDR func)
 {
@@ -125,7 +125,7 @@ sh_linux_sigreturn_init (const struct tramp_frame *self,
 
 static void
 sh_linux_rt_sigreturn_init (const struct tramp_frame *self,
-			    struct frame_info *this_frame,
+			    frame_info_ptr this_frame,
 			    struct trad_frame_cache *this_cache,
 			    CORE_ADDR func)
 {
diff --git a/gdb/sh-tdep.c b/gdb/sh-tdep.c
index 062df860c81..493ffe89375 100644
--- a/gdb/sh-tdep.c
+++ b/gdb/sh-tdep.c
@@ -1793,7 +1793,7 @@ sh_sh2a_register_sim_regno (struct gdbarch *gdbarch, int nr)
 static void
 sh_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
 			  struct dwarf2_frame_state_reg *reg,
-			  struct frame_info *this_frame)
+			  frame_info_ptr this_frame)
 {
   /* Mark the PC as the destination for the return address.  */
   if (regnum == gdbarch_pc_regnum (gdbarch))
@@ -1863,7 +1863,7 @@ sh_alloc_frame_cache (void)
 }
 
 static struct sh_frame_cache *
-sh_frame_cache (struct frame_info *this_frame, void **this_cache)
+sh_frame_cache (frame_info_ptr this_frame, void **this_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   struct sh_frame_cache *cache;
@@ -1930,7 +1930,7 @@ sh_frame_cache (struct frame_info *this_frame, void **this_cache)
 }
 
 static struct value *
-sh_frame_prev_register (struct frame_info *this_frame,
+sh_frame_prev_register (frame_info_ptr this_frame,
 			void **this_cache, int regnum)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
@@ -1955,7 +1955,7 @@ sh_frame_prev_register (struct frame_info *this_frame,
 }
 
 static void
-sh_frame_this_id (struct frame_info *this_frame, void **this_cache,
+sh_frame_this_id (frame_info_ptr this_frame, void **this_cache,
 		  struct frame_id *this_id)
 {
   struct sh_frame_cache *cache = sh_frame_cache (this_frame, this_cache);
@@ -1978,7 +1978,7 @@ static const struct frame_unwind sh_frame_unwind = {
 };
 
 static CORE_ADDR
-sh_frame_base_address (struct frame_info *this_frame, void **this_cache)
+sh_frame_base_address (frame_info_ptr this_frame, void **this_cache)
 {
   struct sh_frame_cache *cache = sh_frame_cache (this_frame, this_cache);
 
@@ -1993,7 +1993,7 @@ static const struct frame_base sh_frame_base = {
 };
 
 static struct sh_frame_cache *
-sh_make_stub_cache (struct frame_info *this_frame)
+sh_make_stub_cache (frame_info_ptr this_frame)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   struct sh_frame_cache *cache;
@@ -2007,7 +2007,7 @@ sh_make_stub_cache (struct frame_info *this_frame)
 }
 
 static void
-sh_stub_this_id (struct frame_info *this_frame, void **this_cache,
+sh_stub_this_id (frame_info_ptr this_frame, void **this_cache,
 		 struct frame_id *this_id)
 {
   struct sh_frame_cache *cache;
@@ -2021,7 +2021,7 @@ sh_stub_this_id (struct frame_info *this_frame, void **this_cache,
 
 static int
 sh_stub_unwind_sniffer (const struct frame_unwind *self,
-			struct frame_info *this_frame,
+			frame_info_ptr this_frame,
 			void **this_prologue_cache)
 {
   CORE_ADDR addr_in_block;
diff --git a/gdb/skip.c b/gdb/skip.c
index 3a3734a296d..c040f87c928 100644
--- a/gdb/skip.c
+++ b/gdb/skip.c
@@ -204,7 +204,7 @@ skip_function_command (const char *arg, int from_tty)
   /* Default to the current function if no argument is given.  */
   if (arg == NULL)
     {
-      frame_info *fi = get_selected_frame (_("No default function now."));
+      frame_info_ptr fi = get_selected_frame (_("No default function now."));
       struct symbol *sym = get_frame_function (fi);
       const char *name = NULL;
 
diff --git a/gdb/sol2-tdep.c b/gdb/sol2-tdep.c
index a7bf8836269..2cc2407656d 100644
--- a/gdb/sol2-tdep.c
+++ b/gdb/sol2-tdep.c
@@ -52,7 +52,7 @@ sol2_pc_in_sigtramp (CORE_ADDR pc, const char *name)
 /* Return whether THIS_FRAME corresponds to a Solaris sigtramp routine.  */
 
 int
-sol2_sigtramp_p (struct frame_info *this_frame)
+sol2_sigtramp_p (frame_info_ptr this_frame)
 {
   CORE_ADDR pc = get_frame_pc (this_frame);
   const char *name;
diff --git a/gdb/sol2-tdep.h b/gdb/sol2-tdep.h
index 14ee5e64c69..cd3bdc1f343 100644
--- a/gdb/sol2-tdep.h
+++ b/gdb/sol2-tdep.h
@@ -22,7 +22,7 @@
 
 struct gdbarch;
 
-int sol2_sigtramp_p (struct frame_info *this_frame);
+int sol2_sigtramp_p (frame_info_ptr this_frame);
 
 void sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch);
 
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index 95a1e1eb722..a4873c5dc69 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -1645,7 +1645,7 @@ solib_event_probe_action (struct probe_and_action *pa)
 {
   enum probe_action action;
   unsigned probe_argc = 0;
-  struct frame_info *frame = get_current_frame ();
+  frame_info_ptr frame = get_current_frame ();
 
   action = pa->action;
   if (action == DO_NOTHING || action == PROBES_INTERFACE_FAILED)
@@ -1780,7 +1780,7 @@ svr4_handle_solib_event (void)
   enum probe_action action;
   struct value *val = NULL;
   CORE_ADDR pc, debug_base, lm = 0;
-  struct frame_info *frame = get_current_frame ();
+  frame_info_ptr frame = get_current_frame ();
 
   /* Do nothing if not using the probes interface.  */
   if (info->probes_table == NULL)
diff --git a/gdb/sparc-linux-tdep.c b/gdb/sparc-linux-tdep.c
index 66481ea7b8a..cd8c35ed5da 100644
--- a/gdb/sparc-linux-tdep.c
+++ b/gdb/sparc-linux-tdep.c
@@ -42,7 +42,7 @@
 /* Signal trampoline support.  */
 
 static void sparc32_linux_sigframe_init (const struct tramp_frame *self,
-					 struct frame_info *this_frame,
+					 frame_info_ptr this_frame,
 					 struct trad_frame_cache *this_cache,
 					 CORE_ADDR func);
 
@@ -117,7 +117,7 @@ enum
 
 static void
 sparc32_linux_sigframe_init (const struct tramp_frame *self,
-			     struct frame_info *this_frame,
+			     frame_info_ptr this_frame,
 			     struct trad_frame_cache *this_cache,
 			     CORE_ADDR func)
 {
@@ -159,7 +159,7 @@ sparc32_linux_sigframe_init (const struct tramp_frame *self,
    address.  */
 
 static CORE_ADDR
-sparc32_linux_step_trap (struct frame_info *frame, unsigned long insn)
+sparc32_linux_step_trap (frame_info_ptr frame, unsigned long insn)
 {
   if (insn == 0x91d02010)
     {
diff --git a/gdb/sparc-netbsd-tdep.c b/gdb/sparc-netbsd-tdep.c
index 57c178511fa..479ec13aeda 100644
--- a/gdb/sparc-netbsd-tdep.c
+++ b/gdb/sparc-netbsd-tdep.c
@@ -95,7 +95,7 @@ sparc32nbsd_pc_in_sigtramp (CORE_ADDR pc, const char *name)
 }
 
 trad_frame_saved_reg *
-sparc32nbsd_sigcontext_saved_regs (struct frame_info *this_frame)
+sparc32nbsd_sigcontext_saved_regs (frame_info_ptr this_frame)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   trad_frame_saved_reg *saved_regs;
@@ -180,7 +180,7 @@ sparc32nbsd_sigcontext_saved_regs (struct frame_info *this_frame)
 }
 
 static struct sparc_frame_cache *
-sparc32nbsd_sigcontext_frame_cache (struct frame_info *this_frame,
+sparc32nbsd_sigcontext_frame_cache (frame_info_ptr this_frame,
 				    void **this_cache)
 {
   struct sparc_frame_cache *cache;
@@ -211,7 +211,7 @@ sparc32nbsd_sigcontext_frame_cache (struct frame_info *this_frame,
 }
 
 static void
-sparc32nbsd_sigcontext_frame_this_id (struct frame_info *this_frame,
+sparc32nbsd_sigcontext_frame_this_id (frame_info_ptr this_frame,
 				      void **this_cache,
 				      struct frame_id *this_id)
 {
@@ -222,7 +222,7 @@ sparc32nbsd_sigcontext_frame_this_id (struct frame_info *this_frame,
 }
 
 static struct value *
-sparc32nbsd_sigcontext_frame_prev_register (struct frame_info *this_frame,
+sparc32nbsd_sigcontext_frame_prev_register (frame_info_ptr this_frame,
 					    void **this_cache, int regnum)
 {
   struct sparc_frame_cache *cache =
@@ -233,7 +233,7 @@ sparc32nbsd_sigcontext_frame_prev_register (struct frame_info *this_frame,
 
 static int
 sparc32nbsd_sigcontext_frame_sniffer (const struct frame_unwind *self,
-				      struct frame_info *this_frame,
+				      frame_info_ptr this_frame,
 				      void **this_cache)
 {
   CORE_ADDR pc = get_frame_pc (this_frame);
@@ -264,7 +264,7 @@ static const struct frame_unwind sparc32nbsd_sigcontext_frame_unwind =
    address.  */
 
 CORE_ADDR
-sparcnbsd_step_trap (struct frame_info *frame, unsigned long insn)
+sparcnbsd_step_trap (frame_info_ptr frame, unsigned long insn)
 {
   if ((X_I (insn) == 0 && X_RS1 (insn) == 0 && X_RS2 (insn) == 0)
       || (X_I (insn) == 1 && X_RS1 (insn) == 0 && (insn & 0x7f) == 0))
diff --git a/gdb/sparc-obsd-tdep.c b/gdb/sparc-obsd-tdep.c
index e4253c11aff..57457dfa115 100644
--- a/gdb/sparc-obsd-tdep.c
+++ b/gdb/sparc-obsd-tdep.c
@@ -68,7 +68,7 @@ sparc32obsd_pc_in_sigtramp (CORE_ADDR pc, const char *name)
 }
 
 static struct sparc_frame_cache *
-sparc32obsd_sigtramp_frame_cache (struct frame_info *this_frame,
+sparc32obsd_sigtramp_frame_cache (frame_info_ptr this_frame,
 				  void **this_cache)
 {
   struct sparc_frame_cache *cache;
@@ -100,7 +100,7 @@ sparc32obsd_sigtramp_frame_cache (struct frame_info *this_frame,
 }
 
 static void
-sparc32obsd_sigtramp_frame_this_id (struct frame_info *this_frame,
+sparc32obsd_sigtramp_frame_this_id (frame_info_ptr this_frame,
 				    void **this_cache,
 				    struct frame_id *this_id)
 {
@@ -111,7 +111,7 @@ sparc32obsd_sigtramp_frame_this_id (struct frame_info *this_frame,
 }
 
 static struct value *
-sparc32obsd_sigtramp_frame_prev_register (struct frame_info *this_frame,
+sparc32obsd_sigtramp_frame_prev_register (frame_info_ptr this_frame,
 					  void **this_cache, int regnum)
 {
   struct sparc_frame_cache *cache =
@@ -122,7 +122,7 @@ sparc32obsd_sigtramp_frame_prev_register (struct frame_info *this_frame,
 
 static int
 sparc32obsd_sigtramp_frame_sniffer (const struct frame_unwind *self,
-				    struct frame_info *this_frame,
+				    frame_info_ptr this_frame,
 				    void **this_cache)
 {
   CORE_ADDR pc = get_frame_pc (this_frame);
diff --git a/gdb/sparc-sol2-tdep.c b/gdb/sparc-sol2-tdep.c
index a92e95ce71b..8b862c4dea4 100644
--- a/gdb/sparc-sol2-tdep.c
+++ b/gdb/sparc-sol2-tdep.c
@@ -100,7 +100,7 @@ static const struct regset sparc32_sol2_fpregset =
 \f
 
 static struct sparc_frame_cache *
-sparc32_sol2_sigtramp_frame_cache (struct frame_info *this_frame,
+sparc32_sol2_sigtramp_frame_cache (frame_info_ptr this_frame,
 				   void **this_cache)
 {
   struct sparc_frame_cache *cache;
@@ -151,7 +151,7 @@ sparc32_sol2_sigtramp_frame_cache (struct frame_info *this_frame,
 }
 
 static void
-sparc32_sol2_sigtramp_frame_this_id (struct frame_info *this_frame,
+sparc32_sol2_sigtramp_frame_this_id (frame_info_ptr this_frame,
 				     void **this_cache,
 				     struct frame_id *this_id)
 {
@@ -162,7 +162,7 @@ sparc32_sol2_sigtramp_frame_this_id (struct frame_info *this_frame,
 }
 
 static struct value *
-sparc32_sol2_sigtramp_frame_prev_register (struct frame_info *this_frame,
+sparc32_sol2_sigtramp_frame_prev_register (frame_info_ptr this_frame,
 					   void **this_cache,
 					   int regnum)
 {
@@ -174,7 +174,7 @@ sparc32_sol2_sigtramp_frame_prev_register (struct frame_info *this_frame,
 
 static int
 sparc32_sol2_sigtramp_frame_sniffer (const struct frame_unwind *self,
-				     struct frame_info *this_frame,
+				     frame_info_ptr this_frame,
 				     void **this_cache)
 {
   return sol2_sigtramp_p (this_frame);
diff --git a/gdb/sparc-tdep.c b/gdb/sparc-tdep.c
index 397f5489550..7bdeaf5f9e3 100644
--- a/gdb/sparc-tdep.c
+++ b/gdb/sparc-tdep.c
@@ -1187,7 +1187,7 @@ sparc32_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
 /* Normal frames.  */
 
 struct sparc_frame_cache *
-sparc_frame_cache (struct frame_info *this_frame, void **this_cache)
+sparc_frame_cache (frame_info_ptr this_frame, void **this_cache)
 {
   struct sparc_frame_cache *cache;
 
@@ -1244,7 +1244,7 @@ sparc32_struct_return_from_sym (struct symbol *sym)
 }
 
 struct sparc_frame_cache *
-sparc32_frame_cache (struct frame_info *this_frame, void **this_cache)
+sparc32_frame_cache (frame_info_ptr this_frame, void **this_cache)
 {
   struct sparc_frame_cache *cache;
   struct symbol *sym;
@@ -1280,7 +1280,7 @@ sparc32_frame_cache (struct frame_info *this_frame, void **this_cache)
 }
 
 static void
-sparc32_frame_this_id (struct frame_info *this_frame, void **this_cache,
+sparc32_frame_this_id (frame_info_ptr this_frame, void **this_cache,
 		       struct frame_id *this_id)
 {
   struct sparc_frame_cache *cache =
@@ -1294,7 +1294,7 @@ sparc32_frame_this_id (struct frame_info *this_frame, void **this_cache,
 }
 
 static struct value *
-sparc32_frame_prev_register (struct frame_info *this_frame,
+sparc32_frame_prev_register (frame_info_ptr this_frame,
 			     void **this_cache, int regnum)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
@@ -1364,7 +1364,7 @@ static const struct frame_unwind sparc32_frame_unwind =
 \f
 
 static CORE_ADDR
-sparc32_frame_base_address (struct frame_info *this_frame, void **this_cache)
+sparc32_frame_base_address (frame_info_ptr this_frame, void **this_cache)
 {
   struct sparc_frame_cache *cache =
     sparc32_frame_cache (this_frame, this_cache);
@@ -1381,7 +1381,7 @@ static const struct frame_base sparc32_frame_base =
 };
 
 static struct frame_id
-sparc_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
+sparc_dummy_id (struct gdbarch *gdbarch, frame_info_ptr this_frame)
 {
   CORE_ADDR sp;
 
@@ -1550,7 +1550,7 @@ sparc32_stabs_argument_has_addr (struct gdbarch *gdbarch, struct type *type)
 }
 
 static int
-sparc32_dwarf2_struct_return_p (struct frame_info *this_frame)
+sparc32_dwarf2_struct_return_p (frame_info_ptr this_frame)
 {
   CORE_ADDR pc = get_frame_address_in_block (this_frame);
   struct symbol *sym = find_pc_function (pc);
@@ -1563,7 +1563,7 @@ sparc32_dwarf2_struct_return_p (struct frame_info *this_frame)
 static void
 sparc32_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
 			       struct dwarf2_frame_state_reg *reg,
-			       struct frame_info *this_frame)
+			       frame_info_ptr this_frame)
 {
   int off;
 
@@ -1676,7 +1676,7 @@ sparc_analyze_control_transfer (struct regcache *regcache,
     }
   else if (X_OP (insn) == 2 && X_OP3 (insn) == 0x3a)
     {
-      struct frame_info *frame = get_current_frame ();
+      frame_info_ptr frame = get_current_frame ();
 
       /* Trap instruction (TRAP).  */
       gdbarch *arch = regcache->arch ();
@@ -1722,7 +1722,7 @@ sparc_analyze_control_transfer (struct regcache *regcache,
 }
 
 static CORE_ADDR
-sparc_step_trap (struct frame_info *frame, unsigned long insn)
+sparc_step_trap (frame_info_ptr frame, unsigned long insn)
 {
   return 0;
 }
diff --git a/gdb/sparc-tdep.h b/gdb/sparc-tdep.h
index f2070f10e12..ffdf0a46e17 100644
--- a/gdb/sparc-tdep.h
+++ b/gdb/sparc-tdep.h
@@ -28,7 +28,7 @@
   "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7", \
   "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7"
 
-struct frame_info;
+class frame_info_ptr;
 struct gdbarch;
 struct regcache;
 struct regset;
@@ -85,7 +85,7 @@ struct sparc_gdbarch_tdep : gdbarch_tdep_base
   size_t plt_entry_size = 0;
 
   /* Alternative location for trap return.  Used for single-stepping.  */
-  CORE_ADDR (*step_trap) (struct frame_info *frame, unsigned long insn)
+  CORE_ADDR (*step_trap) (frame_info_ptr frame, unsigned long insn)
     = nullptr;
 
   /* ISA-specific data types.  */
@@ -207,10 +207,10 @@ extern CORE_ADDR sparc_analyze_prologue (struct gdbarch *gdbarch,
 					 struct sparc_frame_cache *cache);
 
 extern struct sparc_frame_cache *
-  sparc_frame_cache (struct frame_info *this_frame, void **this_cache);
+  sparc_frame_cache (frame_info_ptr this_frame, void **this_cache);
 
 extern struct sparc_frame_cache *
-  sparc32_frame_cache (struct frame_info *this_frame, void **this_cache);
+  sparc32_frame_cache (frame_info_ptr this_frame, void **this_cache);
 
 extern int
   sparc_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc);
@@ -255,13 +255,13 @@ extern const struct sparc_gregmap sparc32nbsd_gregmap;
 
 /* Return the address of a system call's alternative return
    address.  */
-extern CORE_ADDR sparcnbsd_step_trap (struct frame_info *frame,
+extern CORE_ADDR sparcnbsd_step_trap (frame_info_ptr frame,
 				      unsigned long insn);
 
 extern void sparc32nbsd_init_abi (struct gdbarch_info info,
 				  struct gdbarch *gdbarch);
 
 extern struct trad_frame_saved_reg *
-  sparc32nbsd_sigcontext_saved_regs (struct frame_info *next_frame);
+  sparc32nbsd_sigcontext_saved_regs (frame_info_ptr next_frame);
 
 #endif /* sparc-tdep.h */
diff --git a/gdb/sparc64-fbsd-tdep.c b/gdb/sparc64-fbsd-tdep.c
index 76c682fd521..a13407a5e3b 100644
--- a/gdb/sparc64-fbsd-tdep.c
+++ b/gdb/sparc64-fbsd-tdep.c
@@ -89,7 +89,7 @@ sparc64fbsd_pc_in_sigtramp (CORE_ADDR pc, const char *name)
 }
 
 static struct sparc_frame_cache *
-sparc64fbsd_sigtramp_frame_cache (struct frame_info *this_frame,
+sparc64fbsd_sigtramp_frame_cache (frame_info_ptr this_frame,
 				   void **this_cache)
 {
   struct sparc_frame_cache *cache;
@@ -162,7 +162,7 @@ sparc64fbsd_sigtramp_frame_cache (struct frame_info *this_frame,
 }
 
 static void
-sparc64fbsd_sigtramp_frame_this_id (struct frame_info *this_frame,
+sparc64fbsd_sigtramp_frame_this_id (frame_info_ptr this_frame,
 				    void **this_cache,
 				    struct frame_id *this_id)
 {
@@ -173,7 +173,7 @@ sparc64fbsd_sigtramp_frame_this_id (struct frame_info *this_frame,
 }
 
 static struct value *
-sparc64fbsd_sigtramp_frame_prev_register (struct frame_info *this_frame,
+sparc64fbsd_sigtramp_frame_prev_register (frame_info_ptr this_frame,
 					  void **this_cache, int regnum)
 {
   struct sparc_frame_cache *cache =
@@ -184,7 +184,7 @@ sparc64fbsd_sigtramp_frame_prev_register (struct frame_info *this_frame,
 
 static int
 sparc64fbsd_sigtramp_frame_sniffer (const struct frame_unwind *self,
-				    struct frame_info *this_frame,
+				    frame_info_ptr this_frame,
 				    void **this_cache)
 {
   CORE_ADDR pc = get_frame_pc (this_frame);
diff --git a/gdb/sparc64-linux-tdep.c b/gdb/sparc64-linux-tdep.c
index f5940cfcdee..fc8bd065c4c 100644
--- a/gdb/sparc64-linux-tdep.c
+++ b/gdb/sparc64-linux-tdep.c
@@ -52,7 +52,7 @@
 /* Signal trampoline support.  */
 
 static void sparc64_linux_sigframe_init (const struct tramp_frame *self,
-					 struct frame_info *this_frame,
+					 frame_info_ptr this_frame,
 					 struct trad_frame_cache *this_cache,
 					 CORE_ADDR func);
 
@@ -73,7 +73,7 @@ static const struct tramp_frame sparc64_linux_rt_sigframe =
 
 static void
 sparc64_linux_sigframe_init (const struct tramp_frame *self,
-			     struct frame_info *this_frame,
+			     frame_info_ptr this_frame,
 			     struct trad_frame_cache *this_cache,
 			     CORE_ADDR func)
 {
@@ -176,7 +176,7 @@ sparc64_linux_report_signal_info (struct gdbarch *gdbarch, struct ui_out *uiout,
    address.  */
 
 static CORE_ADDR
-sparc64_linux_step_trap (struct frame_info *frame, unsigned long insn)
+sparc64_linux_step_trap (frame_info_ptr frame, unsigned long insn)
 {
   /* __NR_rt_sigreturn is 101  */
   if ((insn == 0x91d0206d)
@@ -306,7 +306,7 @@ sparc64_linux_get_syscall_number (struct gdbarch *gdbarch,
 /* Implement the "get_longjmp_target" gdbarch method.  */
 
 static int
-sparc64_linux_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
+sparc64_linux_get_longjmp_target (frame_info_ptr frame, CORE_ADDR *pc)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
   CORE_ADDR jb_addr;
diff --git a/gdb/sparc64-netbsd-tdep.c b/gdb/sparc64-netbsd-tdep.c
index db368118f23..fb15877ccf5 100644
--- a/gdb/sparc64-netbsd-tdep.c
+++ b/gdb/sparc64-netbsd-tdep.c
@@ -86,7 +86,7 @@ sparc64nbsd_pc_in_sigtramp (CORE_ADDR pc, const char *name)
 
 trad_frame_saved_reg *
 sparc64nbsd_sigcontext_saved_regs (CORE_ADDR sigcontext_addr,
-				   struct frame_info *this_frame)
+				   frame_info_ptr this_frame)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   trad_frame_saved_reg *saved_regs;
@@ -149,7 +149,7 @@ sparc64nbsd_sigcontext_saved_regs (CORE_ADDR sigcontext_addr,
 }
 
 static struct sparc_frame_cache *
-sparc64nbsd_sigcontext_frame_cache (struct frame_info *this_frame,
+sparc64nbsd_sigcontext_frame_cache (frame_info_ptr this_frame,
 				    void **this_cache)
 {
   struct sparc_frame_cache *cache;
@@ -185,7 +185,7 @@ sparc64nbsd_sigcontext_frame_cache (struct frame_info *this_frame,
 }
 
 static void
-sparc64nbsd_sigcontext_frame_this_id (struct frame_info *this_frame,
+sparc64nbsd_sigcontext_frame_this_id (frame_info_ptr this_frame,
 				      void **this_cache,
 				      struct frame_id *this_id)
 {
@@ -196,7 +196,7 @@ sparc64nbsd_sigcontext_frame_this_id (struct frame_info *this_frame,
 }
 
 static struct value *
-sparc64nbsd_sigcontext_frame_prev_register (struct frame_info *this_frame,
+sparc64nbsd_sigcontext_frame_prev_register (frame_info_ptr this_frame,
 					    void **this_cache, int regnum)
 {
   struct sparc_frame_cache *cache =
@@ -207,7 +207,7 @@ sparc64nbsd_sigcontext_frame_prev_register (struct frame_info *this_frame,
 
 static int
 sparc64nbsd_sigtramp_frame_sniffer (const struct frame_unwind *self,
-				    struct frame_info *this_frame,
+				    frame_info_ptr this_frame,
 				    void **this_cache)
 {
   CORE_ADDR pc = get_frame_pc (this_frame);
diff --git a/gdb/sparc64-obsd-tdep.c b/gdb/sparc64-obsd-tdep.c
index d6470a51b65..1b887df89b2 100644
--- a/gdb/sparc64-obsd-tdep.c
+++ b/gdb/sparc64-obsd-tdep.c
@@ -150,7 +150,7 @@ sparc64obsd_pc_in_sigtramp (CORE_ADDR pc, const char *name)
 }
 
 static struct sparc_frame_cache *
-sparc64obsd_frame_cache (struct frame_info *this_frame, void **this_cache)
+sparc64obsd_frame_cache (frame_info_ptr this_frame, void **this_cache)
 {
   struct sparc_frame_cache *cache;
   CORE_ADDR addr;
@@ -186,7 +186,7 @@ sparc64obsd_frame_cache (struct frame_info *this_frame, void **this_cache)
 }
 
 static void
-sparc64obsd_frame_this_id (struct frame_info *this_frame, void **this_cache,
+sparc64obsd_frame_this_id (frame_info_ptr this_frame, void **this_cache,
 			   struct frame_id *this_id)
 {
   struct sparc_frame_cache *cache =
@@ -196,7 +196,7 @@ sparc64obsd_frame_this_id (struct frame_info *this_frame, void **this_cache,
 }
 
 static struct value *
-sparc64obsd_frame_prev_register (struct frame_info *this_frame,
+sparc64obsd_frame_prev_register (frame_info_ptr this_frame,
 				 void **this_cache, int regnum)
 {
   struct sparc_frame_cache *cache =
@@ -207,7 +207,7 @@ sparc64obsd_frame_prev_register (struct frame_info *this_frame,
 
 static int
 sparc64obsd_sigtramp_frame_sniffer (const struct frame_unwind *self,
-				    struct frame_info *this_frame,
+				    frame_info_ptr this_frame,
 				    void **this_cache)
 {
   CORE_ADDR pc = get_frame_pc (this_frame);
@@ -234,7 +234,7 @@ static const struct frame_unwind sparc64obsd_frame_unwind =
 /* Kernel debugging support.  */
 
 static struct sparc_frame_cache *
-sparc64obsd_trapframe_cache (struct frame_info *this_frame, void **this_cache)
+sparc64obsd_trapframe_cache (frame_info_ptr this_frame, void **this_cache)
 {
   struct sparc_frame_cache *cache;
   CORE_ADDR sp, trapframe_addr;
@@ -263,7 +263,7 @@ sparc64obsd_trapframe_cache (struct frame_info *this_frame, void **this_cache)
 }
 
 static void
-sparc64obsd_trapframe_this_id (struct frame_info *this_frame,
+sparc64obsd_trapframe_this_id (frame_info_ptr this_frame,
 			       void **this_cache, struct frame_id *this_id)
 {
   struct sparc_frame_cache *cache =
@@ -273,7 +273,7 @@ sparc64obsd_trapframe_this_id (struct frame_info *this_frame,
 }
 
 static struct value *
-sparc64obsd_trapframe_prev_register (struct frame_info *this_frame,
+sparc64obsd_trapframe_prev_register (frame_info_ptr this_frame,
 				     void **this_cache, int regnum)
 {
   struct sparc_frame_cache *cache =
@@ -284,7 +284,7 @@ sparc64obsd_trapframe_prev_register (struct frame_info *this_frame,
 
 static int
 sparc64obsd_trapframe_sniffer (const struct frame_unwind *self,
-			       struct frame_info *this_frame,
+			       frame_info_ptr this_frame,
 			       void **this_cache)
 {
   CORE_ADDR pc;
diff --git a/gdb/sparc64-sol2-tdep.c b/gdb/sparc64-sol2-tdep.c
index e656c359efa..3d52d8caa35 100644
--- a/gdb/sparc64-sol2-tdep.c
+++ b/gdb/sparc64-sol2-tdep.c
@@ -99,7 +99,7 @@ static const struct regset sparc64_sol2_fpregset =
 \f
 
 static struct sparc_frame_cache *
-sparc64_sol2_sigtramp_frame_cache (struct frame_info *this_frame,
+sparc64_sol2_sigtramp_frame_cache (frame_info_ptr this_frame,
 				   void **this_cache)
 {
   struct sparc_frame_cache *cache;
@@ -154,7 +154,7 @@ sparc64_sol2_sigtramp_frame_cache (struct frame_info *this_frame,
 }
 
 static void
-sparc64_sol2_sigtramp_frame_this_id (struct frame_info *this_frame,
+sparc64_sol2_sigtramp_frame_this_id (frame_info_ptr this_frame,
 				     void **this_cache,
 				     struct frame_id *this_id)
 {
@@ -165,7 +165,7 @@ sparc64_sol2_sigtramp_frame_this_id (struct frame_info *this_frame,
 }
 
 static struct value *
-sparc64_sol2_sigtramp_frame_prev_register (struct frame_info *this_frame,
+sparc64_sol2_sigtramp_frame_prev_register (frame_info_ptr this_frame,
 					   void **this_cache,
 					   int regnum)
 {
@@ -177,7 +177,7 @@ sparc64_sol2_sigtramp_frame_prev_register (struct frame_info *this_frame,
 
 static int
 sparc64_sol2_sigtramp_frame_sniffer (const struct frame_unwind *self,
-				     struct frame_info *this_frame,
+				     frame_info_ptr this_frame,
 				     void **this_cache)
 {
   return sol2_sigtramp_p (this_frame);
diff --git a/gdb/sparc64-tdep.c b/gdb/sparc64-tdep.c
index 5ca5f2dca8c..8a801d351c6 100644
--- a/gdb/sparc64-tdep.c
+++ b/gdb/sparc64-tdep.c
@@ -1068,13 +1068,13 @@ sparc64_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
 /* Normal frames.  */
 
 static struct sparc_frame_cache *
-sparc64_frame_cache (struct frame_info *this_frame, void **this_cache)
+sparc64_frame_cache (frame_info_ptr this_frame, void **this_cache)
 {
   return sparc_frame_cache (this_frame, this_cache);
 }
 
 static void
-sparc64_frame_this_id (struct frame_info *this_frame, void **this_cache,
+sparc64_frame_this_id (frame_info_ptr this_frame, void **this_cache,
 		       struct frame_id *this_id)
 {
   struct sparc_frame_cache *cache =
@@ -1088,7 +1088,7 @@ sparc64_frame_this_id (struct frame_info *this_frame, void **this_cache,
 }
 
 static struct value *
-sparc64_frame_prev_register (struct frame_info *this_frame, void **this_cache,
+sparc64_frame_prev_register (frame_info_ptr this_frame, void **this_cache,
 			     int regnum)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
@@ -1152,7 +1152,7 @@ static const struct frame_unwind sparc64_frame_unwind =
 \f
 
 static CORE_ADDR
-sparc64_frame_base_address (struct frame_info *this_frame, void **this_cache)
+sparc64_frame_base_address (frame_info_ptr this_frame, void **this_cache)
 {
   struct sparc_frame_cache *cache =
     sparc64_frame_cache (this_frame, this_cache);
@@ -1771,7 +1771,7 @@ sparc64_return_value (struct gdbarch *gdbarch, struct value *function,
 static void
 sparc64_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
 			       struct dwarf2_frame_state_reg *reg,
-			       struct frame_info *this_frame)
+			       frame_info_ptr this_frame)
 {
   switch (regnum)
     {
diff --git a/gdb/sparc64-tdep.h b/gdb/sparc64-tdep.h
index 4e5e8f5c0f3..3fcfc394edc 100644
--- a/gdb/sparc64-tdep.h
+++ b/gdb/sparc64-tdep.h
@@ -20,7 +20,7 @@
 #ifndef SPARC64_TDEP_H
 #define SPARC64_TDEP_H 1
 
-struct frame_info;
+class frame_info_ptr;
 struct gdbarch;
 struct regcache;
 struct sparc_gregmap;
@@ -131,7 +131,7 @@ extern const struct sparc_gregmap sparc64nbsd_gregmap;
 
 extern struct trad_frame_saved_reg *
   sparc64nbsd_sigcontext_saved_regs (CORE_ADDR sigcontext_addr,
-				     struct frame_info *next_frame);
+				     frame_info_ptr next_frame);
 
 extern const struct sparc_fpregmap sparc64_bsd_fpregmap;
 
diff --git a/gdb/stack.c b/gdb/stack.c
index 6e0f58565fe..8a8936535f8 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -215,18 +215,18 @@ static const gdb::option::option_def backtrace_command_option_defs[] = {
 
 /* Prototypes for local functions.  */
 
-static void print_frame_local_vars (struct frame_info *frame,
+static void print_frame_local_vars (frame_info_ptr frame,
 				    bool quiet,
 				    const char *regexp, const char *t_regexp,
 				    int num_tabs, struct ui_file *stream);
 
 static void print_frame (const frame_print_options &opts,
-			 frame_info *frame, int print_level,
+			 frame_info_ptr frame, int print_level,
 			 enum print_what print_what,  int print_args,
 			 struct symtab_and_line sal);
 
-static struct frame_info *find_frame_for_function (const char *);
-static struct frame_info *find_frame_for_address (CORE_ADDR);
+static frame_info_ptr find_frame_for_function (const char *);
+static frame_info_ptr find_frame_for_address (CORE_ADDR);
 
 /* Zero means do things normally; we are interacting directly with the
    user.  One means print the full filename and linenumber when a
@@ -314,7 +314,7 @@ static last_displayed_symtab_info_type last_displayed_symtab_info;
 /* See stack.h.  */
 
 bool
-frame_show_address (struct frame_info *frame,
+frame_show_address (frame_info_ptr frame,
 		    struct symtab_and_line sal)
 {
   /* If there is a line number, but no PC, then there is no location
@@ -337,7 +337,7 @@ frame_show_address (struct frame_info *frame,
 /* See frame.h.  */
 
 void
-print_stack_frame_to_uiout (struct ui_out *uiout, struct frame_info *frame,
+print_stack_frame_to_uiout (struct ui_out *uiout, frame_info_ptr frame,
 			    int print_level, enum print_what print_what,
 			    int set_current_sal)
 {
@@ -353,7 +353,7 @@ print_stack_frame_to_uiout (struct ui_out *uiout, struct frame_info *frame,
    source line, the actual PC is printed at the beginning.  */
 
 void
-print_stack_frame (struct frame_info *frame, int print_level,
+print_stack_frame (frame_info_ptr frame, int print_level,
 		   enum print_what print_what,
 		   int set_current_sal)
 {
@@ -381,7 +381,7 @@ print_stack_frame (struct frame_info *frame, int print_level,
    argument (not just the first nameless argument).  */
 
 static void
-print_frame_nameless_args (struct frame_info *frame, long start, int num,
+print_frame_nameless_args (frame_info_ptr frame, long start, int num,
 			   int first, struct ui_file *stream)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
@@ -503,7 +503,7 @@ print_frame_arg (const frame_print_options &fp_opts,
    exception.  */
 
 void
-read_frame_local (struct symbol *sym, struct frame_info *frame,
+read_frame_local (struct symbol *sym, frame_info_ptr frame,
 		  struct frame_arg *argp)
 {
   argp->sym = sym;
@@ -525,7 +525,7 @@ read_frame_local (struct symbol *sym, struct frame_info *frame,
 
 void
 read_frame_arg (const frame_print_options &fp_opts,
-		symbol *sym, frame_info *frame,
+		symbol *sym, frame_info_ptr frame,
 		struct frame_arg *argp, struct frame_arg *entryargp)
 {
   struct value *val = NULL, *entryval = NULL;
@@ -722,7 +722,7 @@ read_frame_arg (const frame_print_options &fp_opts,
 
 static void
 print_frame_args (const frame_print_options &fp_opts,
-		  struct symbol *func, struct frame_info *frame,
+		  struct symbol *func, frame_info_ptr frame,
 		  int num, struct ui_file *stream)
 {
   struct ui_out *uiout = current_uiout;
@@ -929,7 +929,7 @@ print_frame_args (const frame_print_options &fp_opts,
    line is in the center of the next 'list'.  */
 
 void
-set_current_sal_from_frame (struct frame_info *frame)
+set_current_sal_from_frame (frame_info_ptr frame)
 {
   symtab_and_line sal = find_frame_sal (frame);
   if (sal.symtab != NULL)
@@ -996,7 +996,7 @@ print_frame_info_to_print_what (const char *print_frame_info)
 /* Print the PC from FRAME, plus any flags, to UIOUT.  */
 
 static void
-print_pc (struct ui_out *uiout, struct gdbarch *gdbarch, frame_info *frame,
+print_pc (struct ui_out *uiout, struct gdbarch *gdbarch, frame_info_ptr frame,
 	  CORE_ADDR pc)
 {
   uiout->field_core_addr ("addr", gdbarch, pc);
@@ -1031,7 +1031,7 @@ get_user_print_what_frame_info (gdb::optional<enum print_what> *what)
 
 void
 print_frame_info (const frame_print_options &fp_opts,
-		  frame_info *frame, int print_level,
+		  frame_info_ptr frame, int print_level,
 		  enum print_what print_what, int print_args,
 		  int set_current_sal)
 {
@@ -1265,7 +1265,7 @@ get_last_displayed_sal ()
    corresponding to FRAME.  */
 
 gdb::unique_xmalloc_ptr<char>
-find_frame_funname (struct frame_info *frame, enum language *funlang,
+find_frame_funname (frame_info_ptr frame, enum language *funlang,
 		    struct symbol **funcp)
 {
   struct symbol *func;
@@ -1319,7 +1319,7 @@ find_frame_funname (struct frame_info *frame, enum language *funlang,
 
 static void
 print_frame (const frame_print_options &fp_opts,
-	     frame_info *frame, int print_level,
+	     frame_info_ptr frame, int print_level,
 	     enum print_what print_what, int print_args,
 	     struct symtab_and_line sal)
 {
@@ -1474,11 +1474,11 @@ frame_selection_by_function_completer (struct cmd_list_element *ignore,
    level 1') then SELECTED_FRAME_P will be false.  */
 
 static void
-info_frame_command_core (struct frame_info *fi, bool selected_frame_p)
+info_frame_command_core (frame_info_ptr fi, bool selected_frame_p)
 {
   struct symbol *func;
   struct symtab *s;
-  struct frame_info *calling_frame_info;
+  frame_info_ptr calling_frame_info;
   int numregs;
   const char *funname = 0;
   enum language funlang = language_unknown;
@@ -1780,10 +1780,10 @@ info_frame_command_core (struct frame_info *fi, bool selected_frame_p)
 
 /* Return the innermost frame at level LEVEL.  */
 
-static struct frame_info *
+static frame_info_ptr
 leading_innermost_frame (int level)
 {
-  struct frame_info *leading;
+  frame_info_ptr leading;
 
   leading = get_current_frame ();
 
@@ -1801,11 +1801,11 @@ leading_innermost_frame (int level)
 
 /* Return the starting frame needed to handle COUNT outermost frames.  */
 
-static struct frame_info *
+static frame_info_ptr
 trailing_outermost_frame (int count)
 {
-  struct frame_info *current;
-  struct frame_info *trailing;
+  frame_info_ptr current;
+  frame_info_ptr trailing;
 
   trailing = get_current_frame ();
 
@@ -1834,9 +1834,9 @@ trailing_outermost_frame (int count)
    SELECT_FRAME.  */
 
 static void
-select_frame_command_core (struct frame_info *fi, bool ignored)
+select_frame_command_core (frame_info_ptr fi, bool ignored)
 {
-  frame_info *prev_frame = get_selected_frame ();
+  frame_info_ptr prev_frame = get_selected_frame ();
   select_frame (fi);
   if (get_selected_frame () != prev_frame)
     gdb::observers::user_selected_context_changed.notify (USER_SELECTED_FRAME);
@@ -1847,9 +1847,9 @@ select_frame_command_core (struct frame_info *fi, bool ignored)
    reprint the current frame summary).   */
 
 static void
-frame_command_core (struct frame_info *fi, bool ignored)
+frame_command_core (frame_info_ptr fi, bool ignored)
 {
-  frame_info *prev_frame = get_selected_frame ();
+  frame_info_ptr prev_frame = get_selected_frame ();
   select_frame (fi);
   if (get_selected_frame () != prev_frame)
     gdb::observers::user_selected_context_changed.notify (USER_SELECTED_FRAME);
@@ -1871,7 +1871,7 @@ frame_command_core (struct frame_info *fi, bool ignored)
    'frame' will all cause SELECTED_FRAME_P to be true.  In all other cases
    SELECTED_FRAME_P is false.  */
 
-template <void (*FPTR) (struct frame_info *fi, bool selected_frame_p)>
+template <void (*FPTR) (frame_info_ptr fi, bool selected_frame_p)>
 class frame_command_helper
 {
 public:
@@ -1882,7 +1882,7 @@ class frame_command_helper
   level (const char *arg, int from_tty)
   {
     int level = value_as_long (parse_and_eval (arg));
-    struct frame_info *fid
+    frame_info_ptr fid
       = find_relative_frame (get_current_frame (), &level);
     if (level != 0)
       error (_("No frame at level %s."), arg);
@@ -1897,7 +1897,7 @@ class frame_command_helper
   address (const char *arg, int from_tty)
   {
     CORE_ADDR addr = value_as_address (parse_and_eval (arg));
-    struct frame_info *fid = find_frame_for_address (addr);
+    frame_info_ptr fid = find_frame_for_address (addr);
     if (fid == NULL)
       error (_("No frame at address %s."), arg);
     FPTR (fid, false);
@@ -1910,7 +1910,7 @@ class frame_command_helper
   static void
   view (const char *args, int from_tty)
   {
-    struct frame_info *fid;
+    frame_info_ptr fid;
 
     if (args == NULL)
       error (_("Missing address argument to view a frame"));
@@ -1942,7 +1942,7 @@ class frame_command_helper
   {
     if (arg == NULL)
       error (_("Missing function name argument"));
-    struct frame_info *fid = find_frame_for_function (arg);
+    frame_info_ptr fid = find_frame_for_function (arg);
     if (fid == NULL)
       error (_("No frame for function \"%s\"."), arg);
     FPTR (fid, false);
@@ -1981,7 +1981,7 @@ backtrace_command_1 (const frame_print_options &fp_opts,
 		     const char *count_exp, int from_tty)
 
 {
-  struct frame_info *fi;
+  frame_info_ptr fi;
   int count;
   int py_start = 0, py_end = 0;
   enum ext_lang_bt_status result = EXT_LANG_BT_ERROR;
@@ -2043,7 +2043,7 @@ backtrace_command_1 (const frame_print_options &fp_opts,
      "-no-filters" has been specified from the command.  */
   if (bt_opts.no_filters || result == EXT_LANG_BT_NO_FILTERS)
     {
-      struct frame_info *trailing;
+      frame_info_ptr trailing;
 
       /* The following code must do two things.  First, it must set the
 	 variable TRAILING to the frame from which we should start
@@ -2301,7 +2301,7 @@ void
 print_variable_and_value_data::operator() (const char *print_name,
 					   struct symbol *sym)
 {
-  struct frame_info *frame;
+  frame_info_ptr frame;
 
   if (preg.has_value ()
       && preg->exec (sym->natural_name (), 0, NULL, 0) != 0)
@@ -2355,7 +2355,7 @@ prepare_reg (const char *regexp, gdb::optional<compiled_regex> *reg)
    This function will invalidate FRAME.  */
 
 static void
-print_frame_local_vars (struct frame_info *frame,
+print_frame_local_vars (frame_info_ptr frame,
 			bool quiet,
 			const char *regexp, const char *t_regexp,
 			int num_tabs, struct ui_file *stream)
@@ -2521,7 +2521,7 @@ iterate_over_block_arg_vars (const struct block *b,
    This function will invalidate FRAME.  */
 
 static void
-print_frame_arg_vars (struct frame_info *frame,
+print_frame_arg_vars (frame_info_ptr frame,
 		      bool quiet,
 		      const char *regexp, const char *t_regexp,
 		      struct ui_file *stream)
@@ -2613,14 +2613,14 @@ get_selected_block (CORE_ADDR *addr_in_block)
    but the final value of *LEVEL_OFFSET_PTR is nonzero and indicates
    how much farther the original request asked to go.  */
 
-struct frame_info *
-find_relative_frame (struct frame_info *frame, int *level_offset_ptr)
+frame_info_ptr
+find_relative_frame (frame_info_ptr frame, int *level_offset_ptr)
 {
   /* Going up is simple: just call get_prev_frame enough times or
      until the initial frame is reached.  */
   while (*level_offset_ptr > 0)
     {
-      struct frame_info *prev = get_prev_frame (frame);
+      frame_info_ptr prev = get_prev_frame (frame);
 
       if (!prev)
 	break;
@@ -2631,7 +2631,7 @@ find_relative_frame (struct frame_info *frame, int *level_offset_ptr)
   /* Going down is just as simple.  */
   while (*level_offset_ptr < 0)
     {
-      struct frame_info *next = get_next_frame (frame);
+      frame_info_ptr next = get_next_frame (frame);
 
       if (!next)
 	break;
@@ -2648,7 +2648,7 @@ find_relative_frame (struct frame_info *frame, int *level_offset_ptr)
 static void
 up_silently_base (const char *count_exp)
 {
-  struct frame_info *frame;
+  frame_info_ptr frame;
   int count = 1;
 
   if (count_exp)
@@ -2679,7 +2679,7 @@ up_command (const char *count_exp, int from_tty)
 static void
 down_silently_base (const char *count_exp)
 {
-  struct frame_info *frame;
+  frame_info_ptr frame;
   int count = -1;
 
   if (count_exp)
@@ -2717,7 +2717,7 @@ return_command (const char *retval_exp, int from_tty)
 {
   /* Initialize it just to avoid a GCC false warning.  */
   enum return_value_convention rv_conv = RETURN_VALUE_STRUCT_CONVENTION;
-  struct frame_info *thisframe;
+  frame_info_ptr thisframe;
   struct gdbarch *gdbarch;
   struct symbol *thisfun;
   struct value *return_value = NULL;
@@ -2854,7 +2854,7 @@ return_command (const char *retval_exp, int from_tty)
 /* Find the most inner frame in the current stack for a function called
    FUNCTION_NAME.  If no matching frame is found return NULL.  */
 
-static struct frame_info *
+static frame_info_ptr
 find_frame_for_function (const char *function_name)
 {
   /* Used to hold the lower and upper addresses for each of the
@@ -2863,7 +2863,7 @@ find_frame_for_function (const char *function_name)
   {
     CORE_ADDR low, high;
   };
-  struct frame_info *frame;
+  frame_info_ptr frame;
   bool found = false;
   int level = 1;
 
@@ -2966,7 +2966,7 @@ make_frame_apply_options_def_group (qcs_flags *flags,
 static void
 frame_apply_command_count (const char *which_command,
 			   const char *cmd, int from_tty,
-			   struct frame_info *trailing, int count)
+			   frame_info_ptr trailing, int count)
 {
   qcs_flags flags;
   set_backtrace_options set_bt_opts = user_set_backtrace_options;
@@ -2991,7 +2991,7 @@ frame_apply_command_count (const char *which_command,
   scoped_restore restore_set_backtrace_options
     = make_scoped_restore (&user_set_backtrace_options, set_bt_opts);
 
-  for (frame_info *fi = trailing; fi && count--; fi = get_prev_frame (fi))
+  for (frame_info_ptr fi = trailing; fi && count--; fi = get_prev_frame (fi))
     {
       QUIT;
 
@@ -3198,7 +3198,7 @@ static void
 frame_apply_command (const char* cmd, int from_tty)
 {
   int count;
-  struct frame_info *trailing;
+  frame_info_ptr trailing;
 
   if (!target_has_stack ())
     error (_("No stack."));
@@ -3236,11 +3236,11 @@ faas_command (const char *cmd, int from_tty)
 /* Find inner-mode frame with frame address ADDRESS.  Return NULL if no
    matching frame can be found.  */
 
-static struct frame_info *
+static frame_info_ptr
 find_frame_for_address (CORE_ADDR address)
 {
   struct frame_id id;
-  struct frame_info *fid;
+  frame_info_ptr fid;
 
   id = frame_id_build_wild (address);
 
@@ -3254,7 +3254,7 @@ find_frame_for_address (CORE_ADDR address)
     {
       if (id == get_frame_id (fid))
 	{
-	  struct frame_info *prev_frame;
+	  frame_info_ptr prev_frame;
 
 	  while (1)
 	    {
diff --git a/gdb/stack.h b/gdb/stack.h
index f78aedf1c85..97ee60a9be4 100644
--- a/gdb/stack.h
+++ b/gdb/stack.h
@@ -20,7 +20,7 @@
 #ifndef STACK_H
 #define STACK_H
 
-gdb::unique_xmalloc_ptr<char> find_frame_funname (struct frame_info *frame,
+gdb::unique_xmalloc_ptr<char> find_frame_funname (frame_info_ptr frame,
 						  enum language *funlang,
 						  struct symbol **funcp);
 
@@ -43,7 +43,7 @@ void get_user_print_what_frame_info (gdb::optional<enum print_what> *what);
 /* Return true if we should display the address in addition to the location,
    because we are in the middle of a statement.  */
 
-bool frame_show_address (struct frame_info *frame, struct symtab_and_line sal);
+bool frame_show_address (frame_info_ptr frame, struct symtab_and_line sal);
 
 /* Forget the last sal we displayed.  */
 
diff --git a/gdb/stap-probe.c b/gdb/stap-probe.c
index 2b3eb37b39a..9d6d129069f 100644
--- a/gdb/stap-probe.c
+++ b/gdb/stap-probe.c
@@ -151,7 +151,7 @@ class stap_probe : public probe
 
   /* See probe.h.  */
   struct value *evaluate_argument (unsigned n,
-				   struct frame_info *frame) override;
+				   frame_info_ptr frame) override;
 
   /* See probe.h.  */
   void compile_to_ax (struct agent_expr *aexpr,
@@ -1441,7 +1441,7 @@ stap_probe::can_evaluate_arguments () const
    corresponding to it.  Assertion is thrown if N does not exist.  */
 
 struct value *
-stap_probe::evaluate_argument (unsigned n, struct frame_info *frame)
+stap_probe::evaluate_argument (unsigned n, frame_info_ptr frame)
 {
   struct stap_probe_arg *arg;
   struct gdbarch *gdbarch = get_frame_arch (frame);
diff --git a/gdb/std-regs.c b/gdb/std-regs.c
index d71e2ad998e..5b880a49b16 100644
--- a/gdb/std-regs.c
+++ b/gdb/std-regs.c
@@ -27,7 +27,7 @@
 #include "gdbarch.h"
 
 static struct value *
-value_of_builtin_frame_fp_reg (struct frame_info *frame, const void *baton)
+value_of_builtin_frame_fp_reg (frame_info_ptr frame, const void *baton)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
 
@@ -53,7 +53,7 @@ value_of_builtin_frame_fp_reg (struct frame_info *frame, const void *baton)
 }
 
 static struct value *
-value_of_builtin_frame_pc_reg (struct frame_info *frame, const void *baton)
+value_of_builtin_frame_pc_reg (frame_info_ptr frame, const void *baton)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
 
@@ -72,7 +72,7 @@ value_of_builtin_frame_pc_reg (struct frame_info *frame, const void *baton)
 }
 
 static struct value *
-value_of_builtin_frame_sp_reg (struct frame_info *frame, const void *baton)
+value_of_builtin_frame_sp_reg (frame_info_ptr frame, const void *baton)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
 
@@ -82,7 +82,7 @@ value_of_builtin_frame_sp_reg (struct frame_info *frame, const void *baton)
 }
 
 static struct value *
-value_of_builtin_frame_ps_reg (struct frame_info *frame, const void *baton)
+value_of_builtin_frame_ps_reg (frame_info_ptr frame, const void *baton)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
 
diff --git a/gdb/symfile.h b/gdb/symfile.h
index 1d13e82502b..ffd1acddfdb 100644
--- a/gdb/symfile.h
+++ b/gdb/symfile.h
@@ -37,7 +37,7 @@ struct obj_section;
 struct obstack;
 struct block;
 struct value;
-struct frame_info;
+class frame_info_ptr;
 struct agent_expr;
 struct axs_value;
 class probe;
diff --git a/gdb/symtab.h b/gdb/symtab.h
index 89d7a183ff3..90f5b45738b 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -40,7 +40,7 @@
 
 /* Opaque declarations.  */
 struct ui_file;
-struct frame_info;
+class frame_info_ptr;
 struct symbol;
 struct obstack;
 struct objfile;
@@ -1069,13 +1069,13 @@ struct symbol_computed_ops
      FRAME may be zero.  */
 
   struct value *(*read_variable) (struct symbol * symbol,
-				  struct frame_info * frame);
+				  frame_info_ptr  frame);
 
   /* Read variable SYMBOL like read_variable at (callee) FRAME's function
      entry.  SYMBOL should be a function parameter, otherwise
      NO_ENTRY_VALUE_ERROR will be thrown.  */
   struct value *(*read_variable_at_entry) (struct symbol *symbol,
-					   struct frame_info *frame);
+					   frame_info_ptr frame);
 
   /* Find the "symbol_needs_kind" value for the given symbol.  This
      value determines whether reading the symbol needs memory (e.g., a
@@ -1147,7 +1147,7 @@ struct symbol_block_ops
      computed with DW_AT_static_link and this method must be used to compute
      the corresponding DW_AT_frame_base attribute.  */
   CORE_ADDR (*get_frame_base) (struct symbol *framefunc,
-			       struct frame_info *frame);
+			       frame_info_ptr frame);
 };
 
 /* Functions used with LOC_REGISTER and LOC_REGPARM_ADDR.  */
@@ -2254,7 +2254,7 @@ struct gnu_ifunc_fns
 
 extern const struct gnu_ifunc_fns *gnu_ifunc_fns_p;
 
-extern CORE_ADDR find_solib_trampoline_target (struct frame_info *, CORE_ADDR);
+extern CORE_ADDR find_solib_trampoline_target (frame_info_ptr , CORE_ADDR);
 
 struct symtab_and_line
 {
diff --git a/gdb/tui/tui-disasm.c b/gdb/tui/tui-disasm.c
index 2cb9c75ca8d..e4bbc47daa9 100644
--- a/gdb/tui/tui-disasm.c
+++ b/gdb/tui/tui-disasm.c
@@ -484,7 +484,7 @@ tui_disasm_window::addr_is_displayed (CORE_ADDR addr) const
 }
 
 void
-tui_disasm_window::maybe_update (struct frame_info *fi, symtab_and_line sal)
+tui_disasm_window::maybe_update (frame_info_ptr fi, symtab_and_line sal)
 {
   CORE_ADDR low;
 
diff --git a/gdb/tui/tui-disasm.h b/gdb/tui/tui-disasm.h
index e33c6411cc5..d9d9794998b 100644
--- a/gdb/tui/tui-disasm.h
+++ b/gdb/tui/tui-disasm.h
@@ -41,7 +41,7 @@ struct tui_disasm_window : public tui_source_window_base
 
   bool location_matches_p (struct bp_location *loc, int line_no) override;
 
-  void maybe_update (struct frame_info *fi, symtab_and_line sal) override;
+  void maybe_update (frame_info_ptr fi, symtab_and_line sal) override;
 
   void erase_source_content () override
   {
diff --git a/gdb/tui/tui-hooks.c b/gdb/tui/tui-hooks.c
index 83172789227..967ac30e6bb 100644
--- a/gdb/tui/tui-hooks.c
+++ b/gdb/tui/tui-hooks.c
@@ -62,9 +62,9 @@ static bool tui_refreshing_registers = false;
 /* Observer for the register_changed notification.  */
 
 static void
-tui_register_changed (struct frame_info *frame, int regno)
+tui_register_changed (frame_info_ptr frame, int regno)
 {
-  struct frame_info *fi;
+  frame_info_ptr fi;
 
   if (!tui_is_window_visible (DATA_WIN))
     return;
@@ -129,7 +129,7 @@ tui_refresh_frame_and_register_information ()
 
   if (from_stack && has_stack_frames ())
     {
-      struct frame_info *fi = get_selected_frame (NULL);
+      frame_info_ptr fi = get_selected_frame (NULL);
 
       /* Display the frame position (even if there is no symbols or
 	 the PC is not known).  */
diff --git a/gdb/tui/tui-regs.c b/gdb/tui/tui-regs.c
index 5106a3b9670..b94acfde8a3 100644
--- a/gdb/tui/tui-regs.c
+++ b/gdb/tui/tui-regs.c
@@ -85,7 +85,7 @@ tab_expansion_file::write (const char *buf, long length_buf)
    representation of it.  */
 
 static std::string
-tui_register_format (struct frame_info *frame, int regnum)
+tui_register_format (frame_info_ptr frame, int regnum)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
 
@@ -111,7 +111,7 @@ tui_register_format (struct frame_info *frame, int regnum)
    display.  When changep is set, check if the new register value has
    changed with respect to the previous call.  */
 static void
-tui_get_register (struct frame_info *frame,
+tui_get_register (frame_info_ptr frame,
 		  struct tui_data_item_window *data, 
 		  int regnum, bool *changedp)
 {
@@ -208,7 +208,7 @@ tui_data_window::show_registers (const reggroup *group)
 
 void
 tui_data_window::show_register_group (const reggroup *group,
-				      struct frame_info *frame, 
+				      frame_info_ptr frame, 
 				      bool refresh_values_only)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
@@ -462,7 +462,7 @@ tui_data_window::do_scroll_vertical (int num_to_scroll)
    given a particular frame.  If the values have changed, they are
    updated with the new value and highlighted.  */
 void
-tui_data_window::check_register_values (struct frame_info *frame)
+tui_data_window::check_register_values (frame_info_ptr frame)
 {
   if (m_regs_content.empty ())
     show_registers (m_current_group);
diff --git a/gdb/tui/tui-regs.h b/gdb/tui/tui-regs.h
index 5289d3a892d..fc838d3dffd 100644
--- a/gdb/tui/tui-regs.h
+++ b/gdb/tui/tui-regs.h
@@ -59,7 +59,7 @@ struct tui_data_window : public tui_win_info
     return DATA_NAME;
   }
 
-  void check_register_values (struct frame_info *frame);
+  void check_register_values (frame_info_ptr frame);
 
   void show_registers (const reggroup *group);
 
@@ -101,7 +101,7 @@ struct tui_data_window : public tui_win_info
   void display_reg_element_at_line (int start_element_no, int start_line_no);
 
   void show_register_group (const reggroup *group,
-			    struct frame_info *frame,
+			    frame_info_ptr frame,
 			    bool refresh_values_only);
 
   /* Answer the number of the last line in the regs display.  If there
diff --git a/gdb/tui/tui-source.c b/gdb/tui/tui-source.c
index 208889d0bf7..c45463ec765 100644
--- a/gdb/tui/tui-source.c
+++ b/gdb/tui/tui-source.c
@@ -140,7 +140,7 @@ tui_source_window::do_scroll_vertical (int num_to_scroll)
 
       if (cursal.symtab == NULL)
 	{
-	  struct frame_info *fi = get_selected_frame (NULL);
+	  frame_info_ptr fi = get_selected_frame (NULL);
 	  s = find_pc_line_symtab (get_frame_pc (fi));
 	  arch = get_frame_arch (fi);
 	}
@@ -191,7 +191,7 @@ tui_source_window::line_is_displayed (int line) const
 }
 
 void
-tui_source_window::maybe_update (struct frame_info *fi, symtab_and_line sal)
+tui_source_window::maybe_update (frame_info_ptr fi, symtab_and_line sal)
 {
   int start_line = (sal.line - ((height - 2) / 2)) + 1;
   if (start_line <= 0)
diff --git a/gdb/tui/tui-source.h b/gdb/tui/tui-source.h
index d2c6338acc3..7187debbd34 100644
--- a/gdb/tui/tui-source.h
+++ b/gdb/tui/tui-source.h
@@ -46,7 +46,7 @@ struct tui_source_window : public tui_source_window_base
 
   bool showing_source_p (const char *filename) const;
 
-  void maybe_update (struct frame_info *fi, symtab_and_line sal) override;
+  void maybe_update (frame_info_ptr fi, symtab_and_line sal) override;
 
   void erase_source_content () override
   {
diff --git a/gdb/tui/tui-stack.c b/gdb/tui/tui-stack.c
index be8ffbd0c12..85e71c0bc25 100644
--- a/gdb/tui/tui-stack.c
+++ b/gdb/tui/tui-stack.c
@@ -195,7 +195,7 @@ tui_locator_window::make_status_line () const
    name is demangled if demangling is turned on.  Returns a pointer to
    a static area holding the result.  */
 static char*
-tui_get_function_from_frame (struct frame_info *fi)
+tui_get_function_from_frame (frame_info_ptr fi)
 {
   static char name[256];
   string_file stream;
@@ -251,7 +251,7 @@ tui_locator_window::rerender ()
    subsequently refreshed), false otherwise.  */
 
 bool
-tui_show_frame_info (struct frame_info *fi)
+tui_show_frame_info (frame_info_ptr fi)
 {
   bool locator_changed_p;
 
diff --git a/gdb/tui/tui-stack.h b/gdb/tui/tui-stack.h
index 971ff1dd413..5cb570f779e 100644
--- a/gdb/tui/tui-stack.h
+++ b/gdb/tui/tui-stack.h
@@ -24,7 +24,7 @@
 
 #include "tui/tui-data.h"
 
-struct frame_info;
+class frame_info_ptr;
 
 /* Locator window class.  */
 
@@ -79,6 +79,6 @@ struct tui_locator_window : public tui_win_info
 };
 
 extern void tui_show_locator_content (void);
-extern bool tui_show_frame_info (struct frame_info *);
+extern bool tui_show_frame_info (frame_info_ptr );
 
 #endif /* TUI_TUI_STACK_H */
diff --git a/gdb/tui/tui-winsource.c b/gdb/tui/tui-winsource.c
index 87b8dcff154..27ac446f4d2 100644
--- a/gdb/tui/tui-winsource.c
+++ b/gdb/tui/tui-winsource.c
@@ -329,7 +329,7 @@ tui_source_window_base::rerender ()
     {
       struct symtab_and_line cursal
 	= get_current_source_symtab_and_line ();
-      struct frame_info *frame = deprecated_safe_get_selected_frame ();
+      frame_info_ptr frame = deprecated_safe_get_selected_frame ();
       struct gdbarch *gdbarch = get_frame_arch (frame);
 
       struct symtab *s = find_pc_line_symtab (get_frame_pc (frame));
@@ -353,7 +353,7 @@ tui_source_window_base::refill ()
       sal = get_current_source_symtab_and_line ();
       if (sal.symtab == NULL)
 	{
-	  struct frame_info *fi = deprecated_safe_get_selected_frame ();
+	  frame_info_ptr fi = deprecated_safe_get_selected_frame ();
 	  if (fi != nullptr)
 	    sal = find_pc_line (get_frame_pc (fi), 0);
 	}
diff --git a/gdb/tui/tui-winsource.h b/gdb/tui/tui-winsource.h
index 1e4dc12044a..f7301aacd26 100644
--- a/gdb/tui/tui-winsource.h
+++ b/gdb/tui/tui-winsource.h
@@ -153,7 +153,7 @@ struct tui_source_window_base : public tui_win_info
 
   /* Update the window to display the given location.  Does nothing if
      the location is already displayed.  */
-  virtual void maybe_update (struct frame_info *fi, symtab_and_line sal) = 0;
+  virtual void maybe_update (frame_info_ptr fi, symtab_and_line sal) = 0;
 
   void update_source_window_as_is  (struct gdbarch *gdbarch,
 				    const struct symtab_and_line &sal);
diff --git a/gdb/v850-tdep.c b/gdb/v850-tdep.c
index f7094e37a92..3caa209a273 100644
--- a/gdb/v850-tdep.c
+++ b/gdb/v850-tdep.c
@@ -1214,7 +1214,7 @@ v850_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
 }
 
 static struct v850_frame_cache *
-v850_alloc_frame_cache (struct frame_info *this_frame)
+v850_alloc_frame_cache (frame_info_ptr this_frame)
 {
   struct v850_frame_cache *cache;
 
@@ -1233,7 +1233,7 @@ v850_alloc_frame_cache (struct frame_info *this_frame)
 }
 
 static struct v850_frame_cache *
-v850_frame_cache (struct frame_info *this_frame, void **this_cache)
+v850_frame_cache (frame_info_ptr this_frame, void **this_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   struct v850_frame_cache *cache;
@@ -1299,7 +1299,7 @@ v850_frame_cache (struct frame_info *this_frame, void **this_cache)
 
 
 static struct value *
-v850_frame_prev_register (struct frame_info *this_frame,
+v850_frame_prev_register (frame_info_ptr this_frame,
 			  void **this_cache, int regnum)
 {
   struct v850_frame_cache *cache = v850_frame_cache (this_frame, this_cache);
@@ -1310,7 +1310,7 @@ v850_frame_prev_register (struct frame_info *this_frame,
 }
 
 static void
-v850_frame_this_id (struct frame_info *this_frame, void **this_cache,
+v850_frame_this_id (frame_info_ptr this_frame, void **this_cache,
 		    struct frame_id *this_id)
 {
   struct v850_frame_cache *cache = v850_frame_cache (this_frame, this_cache);
@@ -1333,7 +1333,7 @@ static const struct frame_unwind v850_frame_unwind = {
 };
 
 static CORE_ADDR
-v850_frame_base_address (struct frame_info *this_frame, void **this_cache)
+v850_frame_base_address (frame_info_ptr this_frame, void **this_cache)
 {
   struct v850_frame_cache *cache = v850_frame_cache (this_frame, this_cache);
 
diff --git a/gdb/valops.c b/gdb/valops.c
index 27e84d9f6b3..87724cb72e8 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -1182,7 +1182,7 @@ value_assign (struct value *toval, struct value *fromval)
 
     case lval_register:
       {
-	struct frame_info *frame;
+	frame_info_ptr frame;
 	struct gdbarch *gdbarch;
 	int value_reg;
 
@@ -1301,7 +1301,7 @@ value_assign (struct value *toval, struct value *fromval)
 	 re-find the previously selected frame automatically.  */
 
       {
-	struct frame_info *fi = frame_find_by_id (old_frame);
+	frame_info_ptr fi = frame_find_by_id (old_frame);
 
 	if (fi != NULL)
 	  select_frame (fi);
@@ -1376,7 +1376,7 @@ value_repeat (struct value *arg1, int count)
 struct value *
 value_of_variable (struct symbol *var, const struct block *b)
 {
-  struct frame_info *frame = NULL;
+  frame_info_ptr frame = NULL;
 
   if (symbol_read_needs_frame (var))
     frame = get_selected_frame (_("No frame selected."));
@@ -1409,7 +1409,7 @@ address_of_variable (struct symbol *var, const struct block *b)
     {
     case lval_register:
       {
-	struct frame_info *frame;
+	frame_info_ptr frame;
 	const char *regname;
 
 	frame = frame_find_by_id (VALUE_NEXT_FRAME_ID (val));
@@ -3945,7 +3945,7 @@ value_of_this (const struct language_defn *lang)
 {
   struct block_symbol sym;
   const struct block *b;
-  struct frame_info *frame;
+  frame_info_ptr frame;
 
   if (lang->name_of_this () == NULL)
     error (_("no `this' in current language"));
diff --git a/gdb/value.c b/gdb/value.c
index 3a0cac741e4..c5106e3484f 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -3958,7 +3958,7 @@ value_fetch_lazy_memory (struct value *val)
 static void
 value_fetch_lazy_register (struct value *val)
 {
-  struct frame_info *next_frame;
+  frame_info_ptr next_frame;
   int regnum;
   struct type *type = check_typedef (value_type (val));
   struct value *new_val = val, *mark = value_mark ();
@@ -4024,7 +4024,7 @@ value_fetch_lazy_register (struct value *val)
   if (frame_debug)
     {
       struct gdbarch *gdbarch;
-      struct frame_info *frame;
+      frame_info_ptr frame;
       frame = frame_find_by_id (VALUE_NEXT_FRAME_ID (val));
       frame = get_prev_frame_always (frame);
       regnum = VALUE_REGNUM (val);
diff --git a/gdb/value.h b/gdb/value.h
index 7e1eec22413..086175e80f1 100644
--- a/gdb/value.h
+++ b/gdb/value.h
@@ -621,7 +621,7 @@ struct value *value_vector_widen (struct value *scalar_value,
 #include "gdbtypes.h"
 #include "expression.h"
 
-struct frame_info;
+class frame_info_ptr;
 struct fn_field;
 
 extern int print_address_demangle (const struct value_print_options *,
@@ -703,13 +703,13 @@ extern struct value *default_value_from_register (struct gdbarch *gdbarch,
 						  struct frame_id frame_id);
 
 extern void read_frame_register_value (struct value *value,
-				       struct frame_info *frame);
+				       frame_info_ptr frame);
 
 extern struct value *value_from_register (struct type *type, int regnum,
-					  struct frame_info *frame);
+					  frame_info_ptr frame);
 
 extern CORE_ADDR address_from_register (int regnum,
-					struct frame_info *frame);
+					frame_info_ptr frame);
 
 extern struct value *value_of_variable (struct symbol *var,
 					const struct block *b);
@@ -717,9 +717,9 @@ extern struct value *value_of_variable (struct symbol *var,
 extern struct value *address_of_variable (struct symbol *var,
 					  const struct block *b);
 
-extern struct value *value_of_register (int regnum, struct frame_info *frame);
+extern struct value *value_of_register (int regnum, frame_info_ptr frame);
 
-struct value *value_of_register_lazy (struct frame_info *frame, int regnum);
+struct value *value_of_register_lazy (frame_info_ptr frame, int regnum);
 
 /* Return the symbol's reading requirement.  */
 
@@ -732,7 +732,7 @@ extern int symbol_read_needs_frame (struct symbol *);
 
 extern struct value *read_var_value (struct symbol *var,
 				     const struct block *var_block,
-				     struct frame_info *frame);
+				     frame_info_ptr frame);
 
 extern struct value *allocate_value (struct type *type);
 extern struct value *allocate_value_lazy (struct type *type);
@@ -1110,7 +1110,7 @@ extern int val_print_string (struct type *elttype, const char *encoding,
 
 extern void print_variable_and_value (const char *name,
 				      struct symbol *var,
-				      struct frame_info *frame,
+				      frame_info_ptr frame,
 				      struct ui_file *stream,
 				      int indent);
 
diff --git a/gdb/varobj.c b/gdb/varobj.c
index 0683af1991e..6a0c9c99616 100644
--- a/gdb/varobj.c
+++ b/gdb/varobj.c
@@ -225,10 +225,10 @@ gdbpy_enter_varobj::gdbpy_enter_varobj (const struct varobj *var)
 /* Return the full FRAME which corresponds to the given CORE_ADDR
    or NULL if no FRAME on the chain corresponds to CORE_ADDR.  */
 
-static struct frame_info *
+static frame_info_ptr
 find_frame_addr_in_frame_chain (CORE_ADDR frame_addr)
 {
-  struct frame_info *frame = NULL;
+  frame_info_ptr frame = NULL;
 
   if (frame_addr == (CORE_ADDR) 0)
     return NULL;
@@ -265,7 +265,7 @@ varobj_create (const char *objname,
 
   if (expression != NULL)
     {
-      struct frame_info *fi;
+      frame_info_ptr fi;
       struct frame_id old_id = null_frame_id;
       const struct block *block;
       const char *p;
@@ -1947,7 +1947,7 @@ name_of_child (struct varobj *var, int index)
 static bool
 check_scope (const struct varobj *var)
 {
-  struct frame_info *fi;
+  frame_info_ptr fi;
   bool scope;
 
   fi = frame_find_by_id (var->root->frame);
diff --git a/gdb/vax-tdep.c b/gdb/vax-tdep.c
index 6ad0dda021e..0fe57f92a80 100644
--- a/gdb/vax-tdep.c
+++ b/gdb/vax-tdep.c
@@ -189,7 +189,7 @@ vax_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 }
 
 static struct frame_id
-vax_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
+vax_dummy_id (struct gdbarch *gdbarch, frame_info_ptr this_frame)
 {
   CORE_ADDR fp;
 
@@ -305,7 +305,7 @@ struct vax_frame_cache
 };
 
 static struct vax_frame_cache *
-vax_frame_cache (struct frame_info *this_frame, void **this_cache)
+vax_frame_cache (frame_info_ptr this_frame, void **this_cache)
 {
   struct vax_frame_cache *cache;
   CORE_ADDR addr;
@@ -367,7 +367,7 @@ vax_frame_cache (struct frame_info *this_frame, void **this_cache)
 }
 
 static void
-vax_frame_this_id (struct frame_info *this_frame, void **this_cache,
+vax_frame_this_id (frame_info_ptr this_frame, void **this_cache,
 		   struct frame_id *this_id)
 {
   struct vax_frame_cache *cache = vax_frame_cache (this_frame, this_cache);
@@ -380,7 +380,7 @@ vax_frame_this_id (struct frame_info *this_frame, void **this_cache,
 }
 
 static struct value *
-vax_frame_prev_register (struct frame_info *this_frame,
+vax_frame_prev_register (frame_info_ptr this_frame,
 			 void **this_cache, int regnum)
 {
   struct vax_frame_cache *cache = vax_frame_cache (this_frame, this_cache);
@@ -401,7 +401,7 @@ static const struct frame_unwind vax_frame_unwind =
 \f
 
 static CORE_ADDR
-vax_frame_base_address (struct frame_info *this_frame, void **this_cache)
+vax_frame_base_address (frame_info_ptr this_frame, void **this_cache)
 {
   struct vax_frame_cache *cache = vax_frame_cache (this_frame, this_cache);
 
@@ -409,7 +409,7 @@ vax_frame_base_address (struct frame_info *this_frame, void **this_cache)
 }
 
 static CORE_ADDR
-vax_frame_args_address (struct frame_info *this_frame, void **this_cache)
+vax_frame_args_address (frame_info_ptr this_frame, void **this_cache)
 {
   return get_frame_register_unsigned (this_frame, VAX_AP_REGNUM);
 }
@@ -425,7 +425,7 @@ static const struct frame_base vax_frame_base =
 /* Return number of arguments for FRAME.  */
 
 static int
-vax_frame_num_args (struct frame_info *frame)
+vax_frame_num_args (frame_info_ptr frame)
 {
   CORE_ADDR args;
 
-- 
2.37.2


  parent reply	other threads:[~2022-08-30 10:08 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-30 10:08 [PATCH v4 0/5] Smart pointer wrapper for frame_info Bruno Larsen
2022-08-30 10:08 ` [PATCH v4 1/5] Remove frame_id_eq Bruno Larsen
2022-08-30 10:08 ` [PATCH v4 2/5] Introduce frame_info_ptr smart pointer class Bruno Larsen
2022-08-30 10:08 ` [PATCH v4 3/5] Change GDB to use frame_info_ptr Bruno Larsen
2022-08-30 10:08 ` Bruno Larsen [this message]
2022-08-30 10:08 ` [PATCH v4 5/5] gdb/frame: Add reinflation method for frame_info_ptr Bruno Larsen
2022-10-07 19:34   ` Tom Tromey
2022-10-10  7:54     ` Bruno Larsen
2022-10-11  7:58   ` Tom de Vries
2022-10-11  9:42     ` Bruno Larsen
2022-09-13  8:06 ` [Ping][PATCH v4 0/5] Smart pointer wrapper for frame_info Bruno Larsen
2022-09-21 15:39   ` [PINGv2][PATCH " Bruno Larsen
2022-09-29  7:01     ` [PINGv3][PATCH " Bruno Larsen
2022-10-05  9:58       ` [PINGv4][PATCH " Bruno Larsen
2022-10-07 19:35         ` Tom Tromey
2022-10-10  7:55           ` Bruno Larsen
2022-10-10 10:46             ` Tom de Vries
2022-10-10 12:04               ` Bruno Larsen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220830100837.926692-5-blarsen@redhat.com \
    --to=blarsen@redhat.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).