From 04e2ac7b2a7c5fbc0afcf151aeb8a26415ad0fac Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Fri, 21 Oct 2022 16:06:59 -0400 Subject: [PATCH] gdb: move frame_info_ptr method implementations to frame-info.c I don't see any particular reason why the implementations of the frame_info_ptr object are in the header file. It only seems to add some complexity. Since we can't include frame.h in frame-info.h, we have to add declarations of functions defined in frame.c, in frame-info.h. By moving the implementations to a new frame-info.c, we can avoid that. Change-Id: I435c828f81b8a3392c43ef018af31effddf6be9c Reviewed-By: Bruno Larsen Reviewed-By: Tom Tromey --- gdb/Makefile.in | 1 + gdb/frame-info.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ gdb/frame-info.h | 20 ++------------------ gdb/frame.c | 4 +--- gdb/frame.h | 4 ++++ 5 files changed, 55 insertions(+), 21 deletions(-) create mode 100644 gdb/frame-info.c diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 0f5df2ccb7b..fb4d42c7baa 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -1088,6 +1088,7 @@ COMMON_SFILES = \ findvar.c \ frame.c \ frame-base.c \ + frame-info.c \ frame-unwind.c \ gcore.c \ gdb-demangle.c \ diff --git a/gdb/frame-info.c b/gdb/frame-info.c new file mode 100644 index 00000000000..84791205d90 --- /dev/null +++ b/gdb/frame-info.c @@ -0,0 +1,47 @@ +/* Frame info pointer + + Copyright (C) 2022 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include "defs.h" + +#include "frame-info.h" +#include "frame.h" + +/* See frame-info-ptr.h. */ + +intrusive_list frame_info_ptr::frame_list; + +/* See frame-info-ptr.h. */ + +void +frame_info_ptr::prepare_reinflate () +{ + m_cached_id = get_frame_id (*this); +} + +/* See frame-info-ptr.h. */ + +void +frame_info_ptr::reinflate () +{ + gdb_assert (m_cached_id != null_frame_id); + + if (m_ptr == nullptr) + m_ptr = frame_find_by_id (m_cached_id).get (); + gdb_assert (m_ptr != nullptr); +} diff --git a/gdb/frame-info.h b/gdb/frame-info.h index 7159f82b196..1d2d4bdc7e6 100644 --- a/gdb/frame-info.h +++ b/gdb/frame-info.h @@ -25,12 +25,6 @@ struct frame_info; -/* Forward declarations of functions, needed for the frame_info_ptr - to work correctly. */ -extern void reinit_frame_cache (); -extern struct frame_id get_frame_id (frame_info_ptr); -extern frame_info_ptr frame_find_by_id (struct frame_id id); - /* A wrapper for "frame_info *". frame_info objects are invalidated whenever reinit_frame_cache is called. This class arranges to invalidate the pointer when appropriate. This is done to help @@ -136,20 +130,10 @@ public: } /* Cache the frame_id that the pointer will use to reinflate. */ - void prepare_reinflate () - { - m_cached_id = get_frame_id (*this); - } + void prepare_reinflate (); /* Use the cached frame_id to reinflate the pointer. */ - void reinflate () - { - gdb_assert (m_cached_id != null_frame_id); - - if (m_ptr == nullptr) - m_ptr = frame_find_by_id (m_cached_id).get (); - gdb_assert (m_ptr != nullptr); - } + void reinflate (); private: diff --git a/gdb/frame.c b/gdb/frame.c index 14f9668ce00..c8c4ec817a4 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -19,6 +19,7 @@ #include "defs.h" #include "frame.h" +#include "frame-info.h" #include "target.h" #include "value.h" #include "inferior.h" /* for inferior_ptid */ @@ -56,9 +57,6 @@ static frame_info *sentinel_frame; /* Number of calls to reinit_frame_cache. */ static unsigned int frame_cache_generation = 0; -/* See frame-info.h. */ -intrusive_list frame_info_ptr::frame_list; - /* See frame.h. */ unsigned int diff --git a/gdb/frame.h b/gdb/frame.h index 0a142ad2fc4..6b841fd5063 100644 --- a/gdb/frame.h +++ b/gdb/frame.h @@ -280,6 +280,10 @@ extern frame_info_ptr get_next_frame_sentinel_okay (frame_info_ptr); frame. */ 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 frame_info_ptr frame_find_by_id (frame_id id); + /* Base attributes of a frame: */ /* The frame's `resume' address. Where the program will resume in -- 2.30.2