findvar.c \
frame.c \
frame-base.c \
- frame-info.c \
frame-unwind.c \
gcore.c \
gdb-demangle.c \
struct language_arch_info;
struct type_print_options;
struct parser_state;
+struct compile_instance;
#include "compile/compile.h"
#include "value.h"
#define CALL_SITE_H
#include "dwarf2/types.h"
+#include "../frame.h"
#include "gdbsupport/function-view.h"
-#include "frame-info.h"
struct dwarf2_locexpr_baton;
struct dwarf2_per_cu_data;
+++ /dev/null
-/* Frame info pointer
-
- Copyright (C) 2022-2023 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_level = frame_relative_level (*this);
-
- if (m_cached_level != 0)
- m_cached_id = get_frame_id (*this);
-}
-
-/* See frame-info-ptr.h. */
-
-void
-frame_info_ptr::reinflate ()
-{
- /* Ensure we have a valid frame level (sentinel frame or above), indicating
- prepare_reinflate was called. */
- gdb_assert (m_cached_level >= -1);
-
- if (m_ptr != nullptr)
- {
- /* The frame_info wasn't invalidated, no need to reinflate. */
- return;
- }
-
- /* Frame #0 needs special handling, see comment in select_frame. */
- if (m_cached_level == 0)
- m_ptr = get_current_frame ().get ();
- else
- {
- gdb_assert (frame_id_p (m_cached_id));
- m_ptr = frame_find_by_id (m_cached_id).get ();
- }
-
- gdb_assert (m_ptr != nullptr);
-}
+++ /dev/null
-/* Frame info pointer
-
- Copyright (C) 2022-2023 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/>. */
-
-#ifndef GDB_FRAME_INFO_H
-#define GDB_FRAME_INFO_H
-
-#include "gdbsupport/intrusive_list.h"
-#include "frame-id.h"
-
-struct frame_info;
-
-/* 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
- detect a GDB bug that was relatively common.
-
- A small amount of code must still operate on raw pointers, so a
- "get" method is provided. However, you should normally not use
- this in new code. */
-
-class frame_info_ptr : public intrusive_list_node<frame_info_ptr>
-{
-public:
- /* Create a frame_info_ptr from a raw pointer. */
- explicit frame_info_ptr (struct frame_info *ptr)
- : m_ptr (ptr)
- {
- frame_list.push_back (*this);
- }
-
- /* Create a null frame_info_ptr. */
- frame_info_ptr ()
- {
- frame_list.push_back (*this);
- }
-
- frame_info_ptr (std::nullptr_t)
- {
- frame_list.push_back (*this);
- }
-
- frame_info_ptr (const frame_info_ptr &other)
- : m_ptr (other.m_ptr),
- m_cached_id (other.m_cached_id),
- m_cached_level (other.m_cached_level)
- {
- frame_list.push_back (*this);
- }
-
- frame_info_ptr (frame_info_ptr &&other)
- : m_ptr (other.m_ptr),
- m_cached_id (other.m_cached_id),
- m_cached_level (other.m_cached_level)
- {
- other.m_ptr = nullptr;
- other.m_cached_id = null_frame_id;
- other.m_cached_level = invalid_level;
- frame_list.push_back (*this);
- }
-
- ~frame_info_ptr ()
- {
- /* If this node has static storage, it may be deleted after
- frame_list. Attempting to erase ourselves would then trigger
- internal errors, so make sure we are still linked first. */
- if (is_linked ())
- frame_list.erase (frame_list.iterator_to (*this));
- }
-
- frame_info_ptr &operator= (const frame_info_ptr &other)
- {
- m_ptr = other.m_ptr;
- m_cached_id = other.m_cached_id;
- m_cached_level = other.m_cached_level;
- return *this;
- }
-
- frame_info_ptr &operator= (std::nullptr_t)
- {
- m_ptr = nullptr;
- m_cached_id = null_frame_id;
- m_cached_level = invalid_level;
- return *this;
- }
-
- frame_info_ptr &operator= (frame_info_ptr &&other)
- {
- m_ptr = other.m_ptr;
- m_cached_id = other.m_cached_id;
- m_cached_level = other.m_cached_level;
- other.m_ptr = nullptr;
- other.m_cached_id = null_frame_id;
- other.m_cached_level = invalid_level;
- return *this;
- }
-
- frame_info *operator-> () const
- {
- return m_ptr;
- }
-
- /* Fetch the underlying pointer. Note that new code should
- generally not use this -- avoid it if at all possible. */
- frame_info *get () const
- {
- return m_ptr;
- }
-
- /* This exists for compatibility with pre-existing code that checked
- a "frame_info *" using "!". */
- bool operator! () const
- {
- return m_ptr == nullptr;
- }
-
- /* This exists for compatibility with pre-existing code that checked
- a "frame_info *" like "if (ptr)". */
- explicit operator bool () const
- {
- return m_ptr != nullptr;
- }
-
- /* Invalidate this pointer. */
- void invalidate ()
- {
- m_ptr = nullptr;
- }
-
- /* Cache the frame_id that the pointer will use to reinflate. */
- void prepare_reinflate ();
-
- /* Use the cached frame_id to reinflate the pointer. */
- void reinflate ();
-
-private:
- /* We sometimes need to construct frame_info_ptr objects around the
- sentinel_frame, which has level -1. Therefore, make the invalid frame
- level value -2. */
- static constexpr int invalid_level = -2;
-
- /* The underlying pointer. */
- frame_info *m_ptr = nullptr;
-
- /* The frame_id of the underlying pointer. */
- frame_id m_cached_id = null_frame_id;
-
- /* The frame level of the underlying pointer. */
- int m_cached_level = invalid_level;
-
- /* All frame_info_ptr objects are kept on an intrusive list.
- This keeps their construction and destruction costs
- reasonably small. */
- static intrusive_list<frame_info_ptr> frame_list;
-
- /* A friend so it can invalidate the pointers. */
- friend void reinit_frame_cache ();
-};
-
-static inline bool
-operator== (const frame_info *self, const frame_info_ptr &other)
-{
- return self == other.get ();
-}
-
-static inline bool
-operator== (const frame_info_ptr &self, const frame_info_ptr &other)
-{
- return self.get () == other.get ();
-}
-
-static inline bool
-operator== (const frame_info_ptr &self, const frame_info *other)
-{
- return self.get () == other;
-}
-
-static inline bool
-operator!= (const frame_info *self, const frame_info_ptr &other)
-{
- return self != other.get ();
-}
-
-static inline bool
-operator!= (const frame_info_ptr &self, const frame_info_ptr &other)
-{
- return self.get () != other.get ();
-}
-
-static inline bool
-operator!= (const frame_info_ptr &self, const frame_info *other)
-{
- return self.get () != other;
-}
-
-#endif /* GDB_FRAME_INFO_H */
#include "defs.h"
#include "frame.h"
-#include "frame-info.h"
#include "target.h"
#include "value.h"
#include "inferior.h" /* for inferior_ptid */
get_frame_id (frame).to_string ().c_str ());
}
+/* 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_level = frame_relative_level (*this);
+
+ if (m_cached_level != 0)
+ m_cached_id = get_frame_id (*this);
+}
+
+/* See frame-info-ptr.h. */
+
+void
+frame_info_ptr::reinflate ()
+{
+ /* Ensure we have a valid frame level (sentinel frame or above), indicating
+ prepare_reinflate was called. */
+ gdb_assert (m_cached_level >= -1);
+
+ if (m_ptr != nullptr)
+ {
+ /* The frame_info wasn't invalidated, no need to reinflate. */
+ return;
+ }
+
+ /* Frame #0 needs special handling, see comment in select_frame. */
+ if (m_cached_level == 0)
+ m_ptr = get_current_frame ().get ();
+ else
+ {
+ gdb_assert (frame_id_p (m_cached_id));
+ m_ptr = frame_find_by_id (m_cached_id).get ();
+ }
+
+ gdb_assert (m_ptr != nullptr);
+}
+
void _initialize_frame ();
void
_initialize_frame ()
#if !defined (FRAME_H)
#define FRAME_H 1
-#include "frame-info.h"
-
/* The following is the intended naming schema for frame functions.
It isn't 100% consistent, but it is approaching that. Frame naming
schema:
*/
#include "cli/cli-option.h"
+#include "frame-id.h"
#include "gdbsupport/common-debug.h"
+#include "gdbsupport/intrusive_list.h"
struct symtab_and_line;
struct frame_unwind;
/* The frame object. */
-class frame_info_ptr;
/* Save and restore the currently selected frame. */
SENTINEL_FRAME
};
+/* 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
+ detect a GDB bug that was relatively common.
+
+ A small amount of code must still operate on raw pointers, so a
+ "get" method is provided. However, you should normally not use
+ this in new code. */
+
+class frame_info_ptr : public intrusive_list_node<frame_info_ptr>
+{
+public:
+ /* Create a frame_info_ptr from a raw pointer. */
+ explicit frame_info_ptr (struct frame_info *ptr)
+ : m_ptr (ptr)
+ {
+ frame_list.push_back (*this);
+ }
+
+ /* Create a null frame_info_ptr. */
+ frame_info_ptr ()
+ {
+ frame_list.push_back (*this);
+ }
+
+ frame_info_ptr (std::nullptr_t)
+ {
+ frame_list.push_back (*this);
+ }
+
+ frame_info_ptr (const frame_info_ptr &other)
+ : m_ptr (other.m_ptr),
+ m_cached_id (other.m_cached_id),
+ m_cached_level (other.m_cached_level)
+ {
+ frame_list.push_back (*this);
+ }
+
+ frame_info_ptr (frame_info_ptr &&other)
+ : m_ptr (other.m_ptr),
+ m_cached_id (other.m_cached_id),
+ m_cached_level (other.m_cached_level)
+ {
+ other.m_ptr = nullptr;
+ other.m_cached_id = null_frame_id;
+ other.m_cached_level = invalid_level;
+ frame_list.push_back (*this);
+ }
+
+ ~frame_info_ptr ()
+ {
+ /* If this node has static storage, it may be deleted after
+ frame_list. Attempting to erase ourselves would then trigger
+ internal errors, so make sure we are still linked first. */
+ if (is_linked ())
+ frame_list.erase (frame_list.iterator_to (*this));
+ }
+
+ frame_info_ptr &operator= (const frame_info_ptr &other)
+ {
+ m_ptr = other.m_ptr;
+ m_cached_id = other.m_cached_id;
+ m_cached_level = other.m_cached_level;
+ return *this;
+ }
+
+ frame_info_ptr &operator= (std::nullptr_t)
+ {
+ m_ptr = nullptr;
+ m_cached_id = null_frame_id;
+ m_cached_level = invalid_level;
+ return *this;
+ }
+
+ frame_info_ptr &operator= (frame_info_ptr &&other)
+ {
+ m_ptr = other.m_ptr;
+ m_cached_id = other.m_cached_id;
+ m_cached_level = other.m_cached_level;
+ other.m_ptr = nullptr;
+ other.m_cached_id = null_frame_id;
+ other.m_cached_level = invalid_level;
+ return *this;
+ }
+
+ frame_info *operator-> () const
+ {
+ return m_ptr;
+ }
+
+ /* Fetch the underlying pointer. Note that new code should
+ generally not use this -- avoid it if at all possible. */
+ frame_info *get () const
+ {
+ return m_ptr;
+ }
+
+ /* This exists for compatibility with pre-existing code that checked
+ a "frame_info *" using "!". */
+ bool operator! () const
+ {
+ return m_ptr == nullptr;
+ }
+
+ /* This exists for compatibility with pre-existing code that checked
+ a "frame_info *" like "if (ptr)". */
+ explicit operator bool () const
+ {
+ return m_ptr != nullptr;
+ }
+
+ /* Invalidate this pointer. */
+ void invalidate ()
+ {
+ m_ptr = nullptr;
+ }
+
+ /* Cache the frame_id that the pointer will use to reinflate. */
+ void prepare_reinflate ();
+
+ /* Use the cached frame_id to reinflate the pointer. */
+ void reinflate ();
+
+private:
+ /* We sometimes need to construct frame_info_ptr objects around the
+ sentinel_frame, which has level -1. Therefore, make the invalid frame
+ level value -2. */
+ static constexpr int invalid_level = -2;
+
+ /* The underlying pointer. */
+ frame_info *m_ptr = nullptr;
+
+ /* The frame_id of the underlying pointer. */
+ frame_id m_cached_id = null_frame_id;
+
+ /* The frame level of the underlying pointer. */
+ int m_cached_level = invalid_level;
+
+ /* All frame_info_ptr objects are kept on an intrusive list.
+ This keeps their construction and destruction costs
+ reasonably small. */
+ static intrusive_list<frame_info_ptr> frame_list;
+
+ /* A friend so it can invalidate the pointers. */
+ friend void reinit_frame_cache ();
+};
+
+static inline bool
+operator== (const frame_info *self, const frame_info_ptr &other)
+{
+ return self == other.get ();
+}
+
+static inline bool
+operator== (const frame_info_ptr &self, const frame_info_ptr &other)
+{
+ return self.get () == other.get ();
+}
+
+static inline bool
+operator== (const frame_info_ptr &self, const frame_info *other)
+{
+ return self.get () == other;
+}
+
+static inline bool
+operator!= (const frame_info *self, const frame_info_ptr &other)
+{
+ return self != other.get ();
+}
+
+static inline bool
+operator!= (const frame_info_ptr &self, const frame_info_ptr &other)
+{
+ return self.get () != other.get ();
+}
+
+static inline bool
+operator!= (const frame_info_ptr &self, const frame_info *other)
+{
+ return self.get () != other;
+}
+
/* For every stopped thread, GDB tracks two frames: current and
selected. Current frame is the inner most frame of the selected
thread. Selected frame is the one being examined by the GDB
#include "dwarf2.h"
#include "gdbsupport/gdb_obstack.h"
#include "gmp-utils.h"
-#include "frame-info.h"
/* Forward declarations for prototypes. */
struct field;
struct type *self_type;
};
-
/* The type-specific info for TYPE_CODE_FIXED_POINT types. */
struct fixed_point_type_info
#include "completer.h"
#include "gdb-demangle.h"
#include "split-name.h"
+#include "frame.h"
/* Opaque declarations. */
struct ui_file;