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