* spu-tdep.c: Update for unwinder changes.
[deliverable/binutils-gdb.git] / gdb / cp-abi.c
CommitLineData
015a42b4 1/* Generic code for supporting multiple C++ ABI's
06c4d4dc 2
9b254dd1 3 Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007, 2008
6aba47ca 4 Free Software Foundation, Inc.
015a42b4
JB
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
015a42b4
JB
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
015a42b4
JB
20
21#include "defs.h"
22#include "value.h"
23#include "cp-abi.h"
fe1f4a5e
DJ
24#include "command.h"
25#include "gdbcmd.h"
26#include "ui-out.h"
27
309367d4 28#include "gdb_string.h"
015a42b4 29
fe1f4a5e 30static struct cp_abi_ops *find_cp_abi (const char *short_name);
015a42b4 31
fe1f4a5e
DJ
32static struct cp_abi_ops current_cp_abi = { "", NULL };
33static struct cp_abi_ops auto_cp_abi = { "auto", NULL };
015a42b4 34
fe1f4a5e
DJ
35#define CP_ABI_MAX 8
36static struct cp_abi_ops *cp_abis[CP_ABI_MAX];
37static int num_cp_abis = 0;
015a42b4
JB
38
39enum ctor_kinds
40is_constructor_name (const char *name)
41{
42 if ((current_cp_abi.is_constructor_name) == NULL)
8a3fe4f8 43 error (_("ABI doesn't define required function is_constructor_name"));
015a42b4
JB
44 return (*current_cp_abi.is_constructor_name) (name);
45}
46
47enum dtor_kinds
48is_destructor_name (const char *name)
49{
50 if ((current_cp_abi.is_destructor_name) == NULL)
8a3fe4f8 51 error (_("ABI doesn't define required function is_destructor_name"));
015a42b4
JB
52 return (*current_cp_abi.is_destructor_name) (name);
53}
54
55int
56is_vtable_name (const char *name)
57{
58 if ((current_cp_abi.is_vtable_name) == NULL)
8a3fe4f8 59 error (_("ABI doesn't define required function is_vtable_name"));
015a42b4
JB
60 return (*current_cp_abi.is_vtable_name) (name);
61}
62
63int
64is_operator_name (const char *name)
65{
66 if ((current_cp_abi.is_operator_name) == NULL)
8a3fe4f8 67 error (_("ABI doesn't define required function is_operator_name"));
015a42b4
JB
68 return (*current_cp_abi.is_operator_name) (name);
69}
70
1514d34e 71int
06c4d4dc 72baseclass_offset (struct type *type, int index, const bfd_byte *valaddr,
1514d34e
DJ
73 CORE_ADDR address)
74{
75 if (current_cp_abi.baseclass_offset == NULL)
8a3fe4f8 76 error (_("ABI doesn't define required function baseclass_offset"));
1514d34e
DJ
77 return (*current_cp_abi.baseclass_offset) (type, index, valaddr, address);
78}
79
e933e538 80struct value *
fe1f4a5e
DJ
81value_virtual_fn_field (struct value **arg1p, struct fn_field *f, int j,
82 struct type *type, int offset)
015a42b4
JB
83{
84 if ((current_cp_abi.virtual_fn_field) == NULL)
85 return NULL;
86 return (*current_cp_abi.virtual_fn_field) (arg1p, f, j, type, offset);
87}
1514d34e 88
015a42b4 89struct type *
e933e538 90value_rtti_type (struct value *v, int *full, int *top, int *using_enc)
015a42b4
JB
91{
92 if ((current_cp_abi.rtti_type) == NULL)
93 return NULL;
94 return (*current_cp_abi.rtti_type) (v, full, top, using_enc);
95}
96
0d5de010
DJ
97void
98cplus_print_method_ptr (const gdb_byte *contents, struct type *type,
99 struct ui_file *stream)
100{
101 if (current_cp_abi.print_method_ptr == NULL)
102 error (_("GDB does not support pointers to methods on this target"));
103 (*current_cp_abi.print_method_ptr) (contents, type, stream);
104}
105
106int
107cplus_method_ptr_size (void)
108{
109 if (current_cp_abi.method_ptr_size == NULL)
110 error (_("GDB does not support pointers to methods on this target"));
111 return (*current_cp_abi.method_ptr_size) ();
112}
113
114void
115cplus_make_method_ptr (gdb_byte *contents, CORE_ADDR value, int is_virtual)
116{
117 if (current_cp_abi.make_method_ptr == NULL)
118 error (_("GDB does not support pointers to methods on this target"));
119 (*current_cp_abi.make_method_ptr) (contents, value, is_virtual);
120}
121
b18be20d 122CORE_ADDR
52f729a7 123cplus_skip_trampoline (struct frame_info *frame, CORE_ADDR stop_pc)
b18be20d
DJ
124{
125 if (current_cp_abi.skip_trampoline == NULL)
126 return 0;
52f729a7 127 return (*current_cp_abi.skip_trampoline) (frame, stop_pc);
b18be20d
DJ
128}
129
0d5de010
DJ
130struct value *
131cplus_method_ptr_to_value (struct value **this_p, struct value *method_ptr)
132{
133 if (current_cp_abi.method_ptr_to_value == NULL)
134 error (_("GDB does not support pointers to methods on this target"));
135 return (*current_cp_abi.method_ptr_to_value) (this_p, method_ptr);
136}
137
41f1b697
DJ
138int
139cp_pass_by_reference (struct type *type)
140{
141 if ((current_cp_abi.pass_by_reference) == NULL)
142 return 0;
143 return (*current_cp_abi.pass_by_reference) (type);
144}
145
fe1f4a5e
DJ
146/* Set the current C++ ABI to SHORT_NAME. */
147
148static int
149switch_to_cp_abi (const char *short_name)
150{
151 struct cp_abi_ops *abi;
152
153 abi = find_cp_abi (short_name);
154 if (abi == NULL)
155 return 0;
156
157 current_cp_abi = *abi;
158 return 1;
159}
160
161/* Add ABI to the list of supported C++ ABI's. */
162
015a42b4 163int
fe1f4a5e 164register_cp_abi (struct cp_abi_ops *abi)
015a42b4 165{
fe1f4a5e
DJ
166 if (num_cp_abis == CP_ABI_MAX)
167 internal_error (__FILE__, __LINE__,
e2e0b3e5 168 _("Too many C++ ABIs, please increase CP_ABI_MAX in cp-abi.c"));
fe1f4a5e 169
015a42b4
JB
170 cp_abis[num_cp_abis++] = abi;
171
172 return 1;
fe1f4a5e
DJ
173}
174
175/* Set the ABI to use in "auto" mode to SHORT_NAME. */
015a42b4 176
fe1f4a5e
DJ
177void
178set_cp_abi_as_auto_default (const char *short_name)
179{
180 char *new_longname, *new_doc;
181 struct cp_abi_ops *abi = find_cp_abi (short_name);
182
183 if (abi == NULL)
184 internal_error (__FILE__, __LINE__,
e2e0b3e5 185 _("Cannot find C++ ABI \"%s\" to set it as auto default."),
fe1f4a5e
DJ
186 short_name);
187
188 if (auto_cp_abi.longname != NULL)
189 xfree ((char *) auto_cp_abi.longname);
190 if (auto_cp_abi.doc != NULL)
191 xfree ((char *) auto_cp_abi.doc);
192
193 auto_cp_abi = *abi;
194
195 auto_cp_abi.shortname = "auto";
0dfdb8ba 196 new_longname = xstrprintf ("currently \"%s\"", abi->shortname);
fe1f4a5e
DJ
197 auto_cp_abi.longname = new_longname;
198
0dfdb8ba 199 new_doc = xstrprintf ("Automatically selected; currently \"%s\"",
049742da 200 abi->shortname);
fe1f4a5e
DJ
201 auto_cp_abi.doc = new_doc;
202
203 /* Since we copy the current ABI into current_cp_abi instead of
204 using a pointer, if auto is currently the default, we need to
205 reset it. */
206 if (strcmp (current_cp_abi.shortname, "auto") == 0)
207 switch_to_cp_abi ("auto");
015a42b4
JB
208}
209
fe1f4a5e
DJ
210/* Return the ABI operations associated with SHORT_NAME. */
211
212static struct cp_abi_ops *
213find_cp_abi (const char *short_name)
015a42b4
JB
214{
215 int i;
fe1f4a5e 216
015a42b4 217 for (i = 0; i < num_cp_abis; i++)
fe1f4a5e
DJ
218 if (strcmp (cp_abis[i]->shortname, short_name) == 0)
219 return cp_abis[i];
220
221 return NULL;
015a42b4
JB
222}
223
fe1f4a5e
DJ
224/* Display the list of registered C++ ABIs. */
225
226static void
227list_cp_abis (int from_tty)
228{
229 struct cleanup *cleanup_chain;
230 int i;
231 ui_out_text (uiout, "The available C++ ABIs are:\n");
232
233 cleanup_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "cp-abi-list");
234 for (i = 0; i < num_cp_abis; i++)
235 {
236 char pad[14];
237 int padcount;
238
239 ui_out_text (uiout, " ");
240 ui_out_field_string (uiout, "cp-abi", cp_abis[i]->shortname);
241
242 padcount = 16 - 2 - strlen (cp_abis[i]->shortname);
243 pad[padcount] = 0;
244 while (padcount > 0)
245 pad[--padcount] = ' ';
246 ui_out_text (uiout, pad);
247
248 ui_out_field_string (uiout, "doc", cp_abis[i]->doc);
249 ui_out_text (uiout, "\n");
250 }
251 do_cleanups (cleanup_chain);
252}
253
254/* Set the current C++ ABI, or display the list of options if no
255 argument is given. */
256
257static void
258set_cp_abi_cmd (char *args, int from_tty)
259{
260 if (args == NULL)
261 {
262 list_cp_abis (from_tty);
263 return;
264 }
265
266 if (!switch_to_cp_abi (args))
8a3fe4f8 267 error (_("Could not find \"%s\" in ABI list"), args);
fe1f4a5e
DJ
268}
269
270/* Show the currently selected C++ ABI. */
271
272static void
273show_cp_abi_cmd (char *args, int from_tty)
274{
275 ui_out_text (uiout, "The currently selected C++ ABI is \"");
276
277 ui_out_field_string (uiout, "cp-abi", current_cp_abi.shortname);
278 ui_out_text (uiout, "\" (");
279 ui_out_field_string (uiout, "longname", current_cp_abi.longname);
280 ui_out_text (uiout, ").\n");
281}
282
b9362cc7
AC
283extern initialize_file_ftype _initialize_cp_abi; /* -Wmissing-prototypes */
284
fe1f4a5e
DJ
285void
286_initialize_cp_abi (void)
287{
288 register_cp_abi (&auto_cp_abi);
289 switch_to_cp_abi ("auto");
290
1a966eab
AC
291 add_cmd ("cp-abi", class_obscure, set_cp_abi_cmd, _("\
292Set the ABI used for inspecting C++ objects.\n\
293\"set cp-abi\" with no arguments will list the available ABIs."),
fe1f4a5e
DJ
294 &setlist);
295
296 add_cmd ("cp-abi", class_obscure, show_cp_abi_cmd,
1a966eab 297 _("Show the ABI used for inspecting C++ objects."), &showlist);
fe1f4a5e 298}
This page took 0.502425 seconds and 4 git commands to generate.