diff options
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/Makefile.in | 1 | ||||
-rw-r--r-- | gdb/frame-info.c | 47 | ||||
-rw-r--r-- | gdb/frame-info.h | 20 | ||||
-rw-r--r-- | gdb/frame.c | 4 | ||||
-rw-r--r-- | gdb/frame.h | 4 |
5 files changed, 55 insertions, 21 deletions
diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 0f5df2c..fb4d42c 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 0000000..8479120 --- /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 <http://www.gnu.org/licenses/>. */ + +#include "defs.h" + +#include "frame-info.h" +#include "frame.h" + +/* See frame-info-ptr.h. */ + +intrusive_list<frame_info_ptr> 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 7159f82..1d2d4bd 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 14f9668..c8c4ec8 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_info_ptr::frame_list; - /* See frame.h. */ unsigned int diff --git a/gdb/frame.h b/gdb/frame.h index 0a142ad..6b841fd 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 |