]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/frame-base.c
Finalized intl-update patches
[thirdparty/binutils-gdb.git] / gdb / frame-base.c
CommitLineData
da62e633
AC
1/* Definitions for frame address handler, for GDB, the GNU debugger.
2
213516ef 3 Copyright (C) 2003-2023 Free Software Foundation, Inc.
da62e633
AC
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
da62e633
AC
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
da62e633
AC
19
20#include "defs.h"
21#include "frame-base.h"
22#include "frame.h"
bf31fd38 23#include "gdbsupport/gdb_obstack.h"
0d12e84c 24#include "gdbarch.h"
da62e633
AC
25
26/* A default frame base implementations. If it wasn't for the old
42efa47a
AC
27 DEPRECATED_FRAME_LOCALS_ADDRESS and DEPRECATED_FRAME_ARGS_ADDRESS,
28 these could be combined into a single function. All architectures
29 really need to override this. */
da62e633
AC
30
31static CORE_ADDR
bd2b40ac 32default_frame_base_address (frame_info_ptr this_frame, void **this_cache)
da62e633 33{
da62e633
AC
34 return get_frame_base (this_frame); /* sigh! */
35}
36
37static CORE_ADDR
bd2b40ac 38default_frame_locals_address (frame_info_ptr this_frame, void **this_cache)
da62e633 39{
669fac23 40 return default_frame_base_address (this_frame, this_cache);
da62e633
AC
41}
42
43static CORE_ADDR
bd2b40ac 44default_frame_args_address (frame_info_ptr this_frame, void **this_cache)
da62e633 45{
669fac23 46 return default_frame_base_address (this_frame, this_cache);
da62e633
AC
47}
48
49const struct frame_base default_frame_base = {
50 NULL, /* No parent. */
51 default_frame_base_address,
52 default_frame_locals_address,
53 default_frame_args_address
54};
55
0cad6aec
AC
56struct frame_base_table_entry
57{
58 frame_base_sniffer_ftype *sniffer;
59 struct frame_base_table_entry *next;
60};
61
da62e633
AC
62struct frame_base_table
63{
cb275538
TT
64 struct frame_base_table_entry *head = nullptr;
65 struct frame_base_table_entry **tail = &head;
66 const struct frame_base *default_base = &default_frame_base;
da62e633
AC
67};
68
cb275538 69static const registry<gdbarch>::key<struct frame_base_table> frame_base_data;
bb9bcb69 70
cb275538
TT
71static struct frame_base_table *
72get_frame_base_table (struct gdbarch *gdbarch)
73{
74 struct frame_base_table *table = frame_base_data.get (gdbarch);
75 if (table == nullptr)
76 table = frame_base_data.emplace (gdbarch);
da62e633
AC
77 return table;
78}
79
e8a89fe2
AC
80void
81frame_base_append_sniffer (struct gdbarch *gdbarch,
82 frame_base_sniffer_ftype *sniffer)
83{
cb275538 84 struct frame_base_table *table = get_frame_base_table (gdbarch);
bb9bcb69 85
3e43a32a
MS
86 (*table->tail)
87 = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct frame_base_table_entry);
0cad6aec
AC
88 (*table->tail)->sniffer = sniffer;
89 table->tail = &(*table->tail)->next;
da62e633
AC
90}
91
92void
93frame_base_set_default (struct gdbarch *gdbarch,
94 const struct frame_base *default_base)
95{
cb275538 96 struct frame_base_table *table = get_frame_base_table (gdbarch);
bb9bcb69 97
da62e633
AC
98 table->default_base = default_base;
99}
100
101const struct frame_base *
bd2b40ac 102frame_base_find_by_frame (frame_info_ptr this_frame)
da62e633 103{
669fac23 104 struct gdbarch *gdbarch = get_frame_arch (this_frame);
cb275538 105 struct frame_base_table *table = get_frame_base_table (gdbarch);
0cad6aec
AC
106 struct frame_base_table_entry *entry;
107
108 for (entry = table->head; entry != NULL; entry = entry->next)
da62e633 109 {
e8a89fe2 110 const struct frame_base *desc = NULL;
bb9bcb69 111
669fac23 112 desc = entry->sniffer (this_frame);
da62e633
AC
113 if (desc != NULL)
114 return desc;
115 }
116 return table->default_base;
117}