Rewrite TRY/CATCH
[deliverable/binutils-gdb.git] / gdb / cp-abi.c
CommitLineData
015a42b4 1/* Generic code for supporting multiple C++ ABI's
06c4d4dc 2
42a4f53d 3 Copyright (C) 2001-2019 Free Software Foundation, Inc.
015a42b4
JB
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
015a42b4
JB
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
015a42b4
JB
19
20#include "defs.h"
4de283e4 21#include "value.h"
d55e5aa6 22#include "cp-abi.h"
4de283e4 23#include "command.h"
fe1f4a5e
DJ
24#include "gdbcmd.h"
25#include "ui-out.h"
fe1f4a5e 26static struct cp_abi_ops *find_cp_abi (const char *short_name);
015a42b4 27
fe1f4a5e
DJ
28static struct cp_abi_ops current_cp_abi = { "", NULL };
29static struct cp_abi_ops auto_cp_abi = { "auto", NULL };
015a42b4 30
fe1f4a5e
DJ
31#define CP_ABI_MAX 8
32static struct cp_abi_ops *cp_abis[CP_ABI_MAX];
33static int num_cp_abis = 0;
015a42b4
JB
34
35enum ctor_kinds
36is_constructor_name (const char *name)
37{
38 if ((current_cp_abi.is_constructor_name) == NULL)
8a3fe4f8 39 error (_("ABI doesn't define required function is_constructor_name"));
015a42b4
JB
40 return (*current_cp_abi.is_constructor_name) (name);
41}
42
43enum dtor_kinds
44is_destructor_name (const char *name)
45{
46 if ((current_cp_abi.is_destructor_name) == NULL)
8a3fe4f8 47 error (_("ABI doesn't define required function is_destructor_name"));
015a42b4
JB
48 return (*current_cp_abi.is_destructor_name) (name);
49}
50
51int
52is_vtable_name (const char *name)
53{
54 if ((current_cp_abi.is_vtable_name) == NULL)
8a3fe4f8 55 error (_("ABI doesn't define required function is_vtable_name"));
015a42b4
JB
56 return (*current_cp_abi.is_vtable_name) (name);
57}
58
59int
60is_operator_name (const char *name)
61{
62 if ((current_cp_abi.is_operator_name) == NULL)
8a3fe4f8 63 error (_("ABI doesn't define required function is_operator_name"));
015a42b4
JB
64 return (*current_cp_abi.is_operator_name) (name);
65}
66
1514d34e 67int
8af8e3bc 68baseclass_offset (struct type *type, int index, const gdb_byte *valaddr,
6b850546 69 LONGEST embedded_offset, CORE_ADDR address,
8af8e3bc 70 const struct value *val)
1514d34e 71{
8af8e3bc
PA
72 int res = 0;
73
74 gdb_assert (current_cp_abi.baseclass_offset != NULL);
75
a70b8144 76 try
8af8e3bc
PA
77 {
78 res = (*current_cp_abi.baseclass_offset) (type, index, valaddr,
79 embedded_offset,
80 address, val);
81 }
a70b8144 82 catch (const gdb_exception_RETURN_MASK_ERROR &ex)
7556d4a4
PA
83 {
84 if (ex.error != NOT_AVAILABLE_ERROR)
85 throw_exception (ex);
86
87 throw_error (NOT_AVAILABLE_ERROR,
88 _("Cannot determine virtual baseclass offset "
89 "of incomplete object"));
90 }
8af8e3bc 91
7556d4a4 92 return res;
1514d34e
DJ
93}
94
e933e538 95struct value *
aff410f1
MS
96value_virtual_fn_field (struct value **arg1p,
97 struct fn_field *f, int j,
fe1f4a5e 98 struct type *type, int offset)
015a42b4
JB
99{
100 if ((current_cp_abi.virtual_fn_field) == NULL)
101 return NULL;
aff410f1
MS
102 return (*current_cp_abi.virtual_fn_field) (arg1p, f, j,
103 type, offset);
015a42b4 104}
1514d34e 105
015a42b4 106struct type *
aff410f1 107value_rtti_type (struct value *v, int *full,
6b850546 108 LONGEST *top, int *using_enc)
015a42b4 109{
7093c834 110 struct type *ret = NULL;
c5504eaf 111
015a42b4
JB
112 if ((current_cp_abi.rtti_type) == NULL)
113 return NULL;
a70b8144 114 try
7093c834
PP
115 {
116 ret = (*current_cp_abi.rtti_type) (v, full, top, using_enc);
117 }
a70b8144 118 catch (const gdb_exception_RETURN_MASK_ERROR &e)
492d29ea
PA
119 {
120 return NULL;
121 }
492d29ea 122
7093c834 123 return ret;
015a42b4
JB
124}
125
0d5de010 126void
aff410f1
MS
127cplus_print_method_ptr (const gdb_byte *contents,
128 struct type *type,
0d5de010
DJ
129 struct ui_file *stream)
130{
131 if (current_cp_abi.print_method_ptr == NULL)
132 error (_("GDB does not support pointers to methods on this target"));
133 (*current_cp_abi.print_method_ptr) (contents, type, stream);
134}
135
136int
ad4820ab 137cplus_method_ptr_size (struct type *to_type)
0d5de010
DJ
138{
139 if (current_cp_abi.method_ptr_size == NULL)
140 error (_("GDB does not support pointers to methods on this target"));
ad4820ab 141 return (*current_cp_abi.method_ptr_size) (to_type);
0d5de010
DJ
142}
143
144void
ad4820ab
UW
145cplus_make_method_ptr (struct type *type, gdb_byte *contents,
146 CORE_ADDR value, int is_virtual)
0d5de010
DJ
147{
148 if (current_cp_abi.make_method_ptr == NULL)
149 error (_("GDB does not support pointers to methods on this target"));
ad4820ab 150 (*current_cp_abi.make_method_ptr) (type, contents, value, is_virtual);
0d5de010
DJ
151}
152
b18be20d 153CORE_ADDR
aff410f1
MS
154cplus_skip_trampoline (struct frame_info *frame,
155 CORE_ADDR stop_pc)
b18be20d
DJ
156{
157 if (current_cp_abi.skip_trampoline == NULL)
158 return 0;
52f729a7 159 return (*current_cp_abi.skip_trampoline) (frame, stop_pc);
b18be20d
DJ
160}
161
0d5de010 162struct value *
aff410f1
MS
163cplus_method_ptr_to_value (struct value **this_p,
164 struct value *method_ptr)
0d5de010
DJ
165{
166 if (current_cp_abi.method_ptr_to_value == NULL)
167 error (_("GDB does not support pointers to methods on this target"));
168 return (*current_cp_abi.method_ptr_to_value) (this_p, method_ptr);
169}
170
c4aeac85
TT
171/* See cp-abi.h. */
172
173void
174cplus_print_vtable (struct value *value)
175{
176 if (current_cp_abi.print_vtable == NULL)
177 error (_("GDB cannot print the vtable on this target"));
843e694d 178 (*current_cp_abi.print_vtable) (value);
c4aeac85
TT
179}
180
6e72ca20
TT
181/* See cp-abi.h. */
182
183struct value *
184cplus_typeid (struct value *value)
185{
186 if (current_cp_abi.get_typeid == NULL)
187 error (_("GDB cannot find the typeid on this target"));
188 return (*current_cp_abi.get_typeid) (value);
189}
190
191/* See cp-abi.h. */
192
193struct type *
194cplus_typeid_type (struct gdbarch *gdbarch)
195{
196 if (current_cp_abi.get_typeid_type == NULL)
197 error (_("GDB cannot find the type for 'typeid' on this target"));
198 return (*current_cp_abi.get_typeid_type) (gdbarch);
199}
200
72f1fe8a
TT
201/* See cp-abi.h. */
202
203struct type *
204cplus_type_from_type_info (struct value *value)
205{
206 if (current_cp_abi.get_type_from_type_info == NULL)
207 error (_("GDB cannot find the type from a std::type_info on this target"));
208 return (*current_cp_abi.get_type_from_type_info) (value);
209}
210
cc16e6c9
TT
211/* See cp-abi.h. */
212
2f408ecb 213std::string
cc16e6c9
TT
214cplus_typename_from_type_info (struct value *value)
215{
216 if (current_cp_abi.get_typename_from_type_info == NULL)
217 error (_("GDB cannot find the type name "
218 "from a std::type_info on this target"));
219 return (*current_cp_abi.get_typename_from_type_info) (value);
220}
221
41f1b697
DJ
222int
223cp_pass_by_reference (struct type *type)
224{
225 if ((current_cp_abi.pass_by_reference) == NULL)
226 return 0;
227 return (*current_cp_abi.pass_by_reference) (type);
228}
229
fe1f4a5e
DJ
230/* Set the current C++ ABI to SHORT_NAME. */
231
232static int
233switch_to_cp_abi (const char *short_name)
234{
235 struct cp_abi_ops *abi;
236
237 abi = find_cp_abi (short_name);
238 if (abi == NULL)
239 return 0;
240
241 current_cp_abi = *abi;
242 return 1;
243}
244
245/* Add ABI to the list of supported C++ ABI's. */
246
015a42b4 247int
fe1f4a5e 248register_cp_abi (struct cp_abi_ops *abi)
015a42b4 249{
fe1f4a5e
DJ
250 if (num_cp_abis == CP_ABI_MAX)
251 internal_error (__FILE__, __LINE__,
3e43a32a
MS
252 _("Too many C++ ABIs, please increase "
253 "CP_ABI_MAX in cp-abi.c"));
fe1f4a5e 254
015a42b4
JB
255 cp_abis[num_cp_abis++] = abi;
256
257 return 1;
fe1f4a5e
DJ
258}
259
260/* Set the ABI to use in "auto" mode to SHORT_NAME. */
015a42b4 261
fe1f4a5e
DJ
262void
263set_cp_abi_as_auto_default (const char *short_name)
264{
265 char *new_longname, *new_doc;
266 struct cp_abi_ops *abi = find_cp_abi (short_name);
267
268 if (abi == NULL)
269 internal_error (__FILE__, __LINE__,
e2e0b3e5 270 _("Cannot find C++ ABI \"%s\" to set it as auto default."),
fe1f4a5e
DJ
271 short_name);
272
273 if (auto_cp_abi.longname != NULL)
274 xfree ((char *) auto_cp_abi.longname);
275 if (auto_cp_abi.doc != NULL)
276 xfree ((char *) auto_cp_abi.doc);
277
278 auto_cp_abi = *abi;
279
280 auto_cp_abi.shortname = "auto";
0dfdb8ba 281 new_longname = xstrprintf ("currently \"%s\"", abi->shortname);
fe1f4a5e
DJ
282 auto_cp_abi.longname = new_longname;
283
0dfdb8ba 284 new_doc = xstrprintf ("Automatically selected; currently \"%s\"",
049742da 285 abi->shortname);
fe1f4a5e
DJ
286 auto_cp_abi.doc = new_doc;
287
288 /* Since we copy the current ABI into current_cp_abi instead of
289 using a pointer, if auto is currently the default, we need to
290 reset it. */
291 if (strcmp (current_cp_abi.shortname, "auto") == 0)
292 switch_to_cp_abi ("auto");
015a42b4
JB
293}
294
fe1f4a5e
DJ
295/* Return the ABI operations associated with SHORT_NAME. */
296
297static struct cp_abi_ops *
298find_cp_abi (const char *short_name)
015a42b4
JB
299{
300 int i;
fe1f4a5e 301
015a42b4 302 for (i = 0; i < num_cp_abis; i++)
fe1f4a5e
DJ
303 if (strcmp (cp_abis[i]->shortname, short_name) == 0)
304 return cp_abis[i];
305
306 return NULL;
015a42b4
JB
307}
308
fe1f4a5e
DJ
309/* Display the list of registered C++ ABIs. */
310
311static void
312list_cp_abis (int from_tty)
313{
79a45e25 314 struct ui_out *uiout = current_uiout;
fe1f4a5e 315 int i;
fe1f4a5e 316
112e8700 317 uiout->text ("The available C++ ABIs are:\n");
2e783024 318 ui_out_emit_tuple tuple_emitter (uiout, "cp-abi-list");
fe1f4a5e
DJ
319 for (i = 0; i < num_cp_abis; i++)
320 {
321 char pad[14];
322 int padcount;
323
112e8700
SM
324 uiout->text (" ");
325 uiout->field_string ("cp-abi", cp_abis[i]->shortname);
fe1f4a5e
DJ
326
327 padcount = 16 - 2 - strlen (cp_abis[i]->shortname);
328 pad[padcount] = 0;
329 while (padcount > 0)
330 pad[--padcount] = ' ';
112e8700 331 uiout->text (pad);
fe1f4a5e 332
112e8700
SM
333 uiout->field_string ("doc", cp_abis[i]->doc);
334 uiout->text ("\n");
fe1f4a5e 335 }
fe1f4a5e
DJ
336}
337
338/* Set the current C++ ABI, or display the list of options if no
339 argument is given. */
340
341static void
4ada038f 342set_cp_abi_cmd (const char *args, int from_tty)
fe1f4a5e
DJ
343{
344 if (args == NULL)
345 {
346 list_cp_abis (from_tty);
347 return;
348 }
349
350 if (!switch_to_cp_abi (args))
8a3fe4f8 351 error (_("Could not find \"%s\" in ABI list"), args);
fe1f4a5e
DJ
352}
353
db2b2972
TT
354/* A completion function for "set cp-abi". */
355
eb3ff9a5 356static void
db2b2972 357cp_abi_completer (struct cmd_list_element *ignore,
eb3ff9a5 358 completion_tracker &tracker,
6f937416 359 const char *text, const char *word)
db2b2972
TT
360{
361 static const char **cp_abi_names;
362
363 if (cp_abi_names == NULL)
364 {
365 int i;
366
367 cp_abi_names = XNEWVEC (const char *, num_cp_abis + 1);
368 for (i = 0; i < num_cp_abis; ++i)
369 cp_abi_names[i] = cp_abis[i]->shortname;
6108433d 370 cp_abi_names[i] = NULL;
db2b2972
TT
371 }
372
eb3ff9a5 373 complete_on_enum (tracker, cp_abi_names, text, word);
db2b2972
TT
374}
375
fe1f4a5e
DJ
376/* Show the currently selected C++ ABI. */
377
378static void
4ada038f 379show_cp_abi_cmd (const char *args, int from_tty)
fe1f4a5e 380{
79a45e25
PA
381 struct ui_out *uiout = current_uiout;
382
112e8700 383 uiout->text ("The currently selected C++ ABI is \"");
fe1f4a5e 384
112e8700
SM
385 uiout->field_string ("cp-abi", current_cp_abi.shortname);
386 uiout->text ("\" (");
387 uiout->field_string ("longname", current_cp_abi.longname);
388 uiout->text (").\n");
fe1f4a5e
DJ
389}
390
391void
392_initialize_cp_abi (void)
393{
db2b2972
TT
394 struct cmd_list_element *c;
395
fe1f4a5e
DJ
396 register_cp_abi (&auto_cp_abi);
397 switch_to_cp_abi ("auto");
398
db2b2972 399 c = add_cmd ("cp-abi", class_obscure, set_cp_abi_cmd, _("\
ac74f770
MS
400Set the ABI used for inspecting C++ objects.\n\
401\"set cp-abi\" with no arguments will list the available ABIs."),
db2b2972
TT
402 &setlist);
403 set_cmd_completer (c, cp_abi_completer);
fe1f4a5e
DJ
404
405 add_cmd ("cp-abi", class_obscure, show_cp_abi_cmd,
aff410f1
MS
406 _("Show the ABI used for inspecting C++ objects."),
407 &showlist);
fe1f4a5e 408}
This page took 1.233381 seconds and 4 git commands to generate.