2011-01-05 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
7b6bb8da 3 Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2010, 2011
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__,
3e43a32a
MS
187 _("Too many C++ ABIs, please increase "
188 "CP_ABI_MAX in cp-abi.c"));
fe1f4a5e 189
015a42b4
JB
190 cp_abis[num_cp_abis++] = abi;
191
192 return 1;
fe1f4a5e
DJ
193}
194
195/* Set the ABI to use in "auto" mode to SHORT_NAME. */
015a42b4 196
fe1f4a5e
DJ
197void
198set_cp_abi_as_auto_default (const char *short_name)
199{
200 char *new_longname, *new_doc;
201 struct cp_abi_ops *abi = find_cp_abi (short_name);
202
203 if (abi == NULL)
204 internal_error (__FILE__, __LINE__,
e2e0b3e5 205 _("Cannot find C++ ABI \"%s\" to set it as auto default."),
fe1f4a5e
DJ
206 short_name);
207
208 if (auto_cp_abi.longname != NULL)
209 xfree ((char *) auto_cp_abi.longname);
210 if (auto_cp_abi.doc != NULL)
211 xfree ((char *) auto_cp_abi.doc);
212
213 auto_cp_abi = *abi;
214
215 auto_cp_abi.shortname = "auto";
0dfdb8ba 216 new_longname = xstrprintf ("currently \"%s\"", abi->shortname);
fe1f4a5e
DJ
217 auto_cp_abi.longname = new_longname;
218
0dfdb8ba 219 new_doc = xstrprintf ("Automatically selected; currently \"%s\"",
049742da 220 abi->shortname);
fe1f4a5e
DJ
221 auto_cp_abi.doc = new_doc;
222
223 /* Since we copy the current ABI into current_cp_abi instead of
224 using a pointer, if auto is currently the default, we need to
225 reset it. */
226 if (strcmp (current_cp_abi.shortname, "auto") == 0)
227 switch_to_cp_abi ("auto");
015a42b4
JB
228}
229
fe1f4a5e
DJ
230/* Return the ABI operations associated with SHORT_NAME. */
231
232static struct cp_abi_ops *
233find_cp_abi (const char *short_name)
015a42b4
JB
234{
235 int i;
fe1f4a5e 236
015a42b4 237 for (i = 0; i < num_cp_abis; i++)
fe1f4a5e
DJ
238 if (strcmp (cp_abis[i]->shortname, short_name) == 0)
239 return cp_abis[i];
240
241 return NULL;
015a42b4
JB
242}
243
fe1f4a5e
DJ
244/* Display the list of registered C++ ABIs. */
245
246static void
247list_cp_abis (int from_tty)
248{
249 struct cleanup *cleanup_chain;
250 int i;
fe1f4a5e 251
c5504eaf 252 ui_out_text (uiout, "The available C++ ABIs are:\n");
aff410f1
MS
253 cleanup_chain = make_cleanup_ui_out_tuple_begin_end (uiout,
254 "cp-abi-list");
fe1f4a5e
DJ
255 for (i = 0; i < num_cp_abis; i++)
256 {
257 char pad[14];
258 int padcount;
259
260 ui_out_text (uiout, " ");
261 ui_out_field_string (uiout, "cp-abi", cp_abis[i]->shortname);
262
263 padcount = 16 - 2 - strlen (cp_abis[i]->shortname);
264 pad[padcount] = 0;
265 while (padcount > 0)
266 pad[--padcount] = ' ';
267 ui_out_text (uiout, pad);
268
269 ui_out_field_string (uiout, "doc", cp_abis[i]->doc);
270 ui_out_text (uiout, "\n");
271 }
272 do_cleanups (cleanup_chain);
273}
274
275/* Set the current C++ ABI, or display the list of options if no
276 argument is given. */
277
278static void
279set_cp_abi_cmd (char *args, int from_tty)
280{
281 if (args == NULL)
282 {
283 list_cp_abis (from_tty);
284 return;
285 }
286
287 if (!switch_to_cp_abi (args))
8a3fe4f8 288 error (_("Could not find \"%s\" in ABI list"), args);
fe1f4a5e
DJ
289}
290
291/* Show the currently selected C++ ABI. */
292
293static void
294show_cp_abi_cmd (char *args, int from_tty)
295{
296 ui_out_text (uiout, "The currently selected C++ ABI is \"");
297
298 ui_out_field_string (uiout, "cp-abi", current_cp_abi.shortname);
299 ui_out_text (uiout, "\" (");
300 ui_out_field_string (uiout, "longname", current_cp_abi.longname);
301 ui_out_text (uiout, ").\n");
302}
303
b9362cc7
AC
304extern initialize_file_ftype _initialize_cp_abi; /* -Wmissing-prototypes */
305
fe1f4a5e
DJ
306void
307_initialize_cp_abi (void)
308{
309 register_cp_abi (&auto_cp_abi);
310 switch_to_cp_abi ("auto");
311
3e43a32a
MS
312 add_cmd ("cp-abi", class_obscure, set_cp_abi_cmd,
313 _("Set the ABI used for inspecting C++ objects.\n\"set cp-abi\" "
314 "with no arguments will list the available ABIs."),
fe1f4a5e
DJ
315 &setlist);
316
317 add_cmd ("cp-abi", class_obscure, show_cp_abi_cmd,
aff410f1
MS
318 _("Show the ABI used for inspecting C++ objects."),
319 &showlist);
fe1f4a5e 320}
This page took 0.744161 seconds and 4 git commands to generate.