]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/frame-base.c
[binutils, ARM, 4/16] BF insns infrastructure with array of relocs in struct arm_it
[thirdparty/binutils-gdb.git] / gdb / frame-base.c
CommitLineData
da62e633
AC
1/* Definitions for frame address handler, for GDB, the GNU debugger.
2
42a4f53d 3 Copyright (C) 2003-2019 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"
0cad6aec 23#include "gdb_obstack.h"
da62e633
AC
24
25/* A default frame base implementations. If it wasn't for the old
42efa47a
AC
26 DEPRECATED_FRAME_LOCALS_ADDRESS and DEPRECATED_FRAME_ARGS_ADDRESS,
27 these could be combined into a single function. All architectures
28 really need to override this. */
da62e633
AC
29
30static CORE_ADDR
669fac23 31default_frame_base_address (struct frame_info *this_frame, void **this_cache)
da62e633 32{
da62e633
AC
33 return get_frame_base (this_frame); /* sigh! */
34}
35
36static CORE_ADDR
669fac23 37default_frame_locals_address (struct frame_info *this_frame, void **this_cache)
da62e633 38{
669fac23 39 return default_frame_base_address (this_frame, this_cache);
da62e633
AC
40}
41
42static CORE_ADDR
669fac23 43default_frame_args_address (struct frame_info *this_frame, void **this_cache)
da62e633 44{
669fac23 45 return default_frame_base_address (this_frame, this_cache);
da62e633
AC
46}
47
48const struct frame_base default_frame_base = {
49 NULL, /* No parent. */
50 default_frame_base_address,
51 default_frame_locals_address,
52 default_frame_args_address
53};
54
55static struct gdbarch_data *frame_base_data;
56
0cad6aec
AC
57struct frame_base_table_entry
58{
59 frame_base_sniffer_ftype *sniffer;
60 struct frame_base_table_entry *next;
61};
62
da62e633
AC
63struct frame_base_table
64{
0cad6aec
AC
65 struct frame_base_table_entry *head;
66 struct frame_base_table_entry **tail;
da62e633 67 const struct frame_base *default_base;
da62e633
AC
68};
69
70static void *
0cad6aec 71frame_base_init (struct obstack *obstack)
da62e633 72{
0cad6aec
AC
73 struct frame_base_table *table
74 = OBSTACK_ZALLOC (obstack, struct frame_base_table);
bb9bcb69 75
0cad6aec 76 table->tail = &table->head;
da62e633
AC
77 table->default_base = &default_frame_base;
78 return table;
79}
80
e8a89fe2
AC
81void
82frame_base_append_sniffer (struct gdbarch *gdbarch,
83 frame_base_sniffer_ftype *sniffer)
84{
9a3c8263
SM
85 struct frame_base_table *table
86 = (struct frame_base_table *) gdbarch_data (gdbarch, frame_base_data);
bb9bcb69 87
3e43a32a
MS
88 (*table->tail)
89 = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct frame_base_table_entry);
0cad6aec
AC
90 (*table->tail)->sniffer = sniffer;
91 table->tail = &(*table->tail)->next;
da62e633
AC
92}
93
94void
95frame_base_set_default (struct gdbarch *gdbarch,
96 const struct frame_base *default_base)
97{
9a3c8263
SM
98 struct frame_base_table *table
99 = (struct frame_base_table *) gdbarch_data (gdbarch, frame_base_data);
bb9bcb69 100
da62e633
AC
101 table->default_base = default_base;
102}
103
104const struct frame_base *
669fac23 105frame_base_find_by_frame (struct frame_info *this_frame)
da62e633 106{
669fac23 107 struct gdbarch *gdbarch = get_frame_arch (this_frame);
9a3c8263
SM
108 struct frame_base_table *table
109 = (struct frame_base_table *) gdbarch_data (gdbarch, frame_base_data);
0cad6aec
AC
110 struct frame_base_table_entry *entry;
111
112 for (entry = table->head; entry != NULL; entry = entry->next)
da62e633 113 {
e8a89fe2 114 const struct frame_base *desc = NULL;
bb9bcb69 115
669fac23 116 desc = entry->sniffer (this_frame);
da62e633
AC
117 if (desc != NULL)
118 return desc;
119 }
120 return table->default_base;
121}
122
123void
124_initialize_frame_base (void)
125{
0cad6aec 126 frame_base_data = gdbarch_data_register_pre_init (frame_base_init);
da62e633 127}