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