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