Fix search in TUI
[deliverable/binutils-gdb.git] / gdb / cp-abi.c
CommitLineData
015a42b4 1/* Generic code for supporting multiple C++ ABI's
06c4d4dc 2
b811d2c2 3 Copyright (C) 2001-2020 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 }
230d2906 82 catch (const gdb_exception_error &ex)
7556d4a4
PA
83 {
84 if (ex.error != NOT_AVAILABLE_ERROR)
eedc3f4f 85 throw;
7556d4a4
PA
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
8ecb59f8
TT
112 if ((current_cp_abi.rtti_type) == NULL
113 || !HAVE_CPLUS_STRUCT (check_typedef (value_type (v))))
015a42b4 114 return NULL;
a70b8144 115 try
7093c834
PP
116 {
117 ret = (*current_cp_abi.rtti_type) (v, full, top, using_enc);
118 }
230d2906 119 catch (const gdb_exception_error &e)
492d29ea
PA
120 {
121 return NULL;
122 }
492d29ea 123
7093c834 124 return ret;
015a42b4
JB
125}
126
0d5de010 127void
aff410f1
MS
128cplus_print_method_ptr (const gdb_byte *contents,
129 struct type *type,
0d5de010
DJ
130 struct ui_file *stream)
131{
132 if (current_cp_abi.print_method_ptr == NULL)
133 error (_("GDB does not support pointers to methods on this target"));
134 (*current_cp_abi.print_method_ptr) (contents, type, stream);
135}
136
137int
ad4820ab 138cplus_method_ptr_size (struct type *to_type)
0d5de010
DJ
139{
140 if (current_cp_abi.method_ptr_size == NULL)
141 error (_("GDB does not support pointers to methods on this target"));
ad4820ab 142 return (*current_cp_abi.method_ptr_size) (to_type);
0d5de010
DJ
143}
144
145void
ad4820ab
UW
146cplus_make_method_ptr (struct type *type, gdb_byte *contents,
147 CORE_ADDR value, int is_virtual)
0d5de010
DJ
148{
149 if (current_cp_abi.make_method_ptr == NULL)
150 error (_("GDB does not support pointers to methods on this target"));
ad4820ab 151 (*current_cp_abi.make_method_ptr) (type, contents, value, is_virtual);
0d5de010
DJ
152}
153
b18be20d 154CORE_ADDR
aff410f1
MS
155cplus_skip_trampoline (struct frame_info *frame,
156 CORE_ADDR stop_pc)
b18be20d
DJ
157{
158 if (current_cp_abi.skip_trampoline == NULL)
159 return 0;
52f729a7 160 return (*current_cp_abi.skip_trampoline) (frame, stop_pc);
b18be20d
DJ
161}
162
0d5de010 163struct value *
aff410f1
MS
164cplus_method_ptr_to_value (struct value **this_p,
165 struct value *method_ptr)
0d5de010
DJ
166{
167 if (current_cp_abi.method_ptr_to_value == NULL)
168 error (_("GDB does not support pointers to methods on this target"));
169 return (*current_cp_abi.method_ptr_to_value) (this_p, method_ptr);
170}
171
c4aeac85
TT
172/* See cp-abi.h. */
173
174void
175cplus_print_vtable (struct value *value)
176{
177 if (current_cp_abi.print_vtable == NULL)
178 error (_("GDB cannot print the vtable on this target"));
843e694d 179 (*current_cp_abi.print_vtable) (value);
c4aeac85
TT
180}
181
6e72ca20
TT
182/* See cp-abi.h. */
183
184struct value *
185cplus_typeid (struct value *value)
186{
187 if (current_cp_abi.get_typeid == NULL)
188 error (_("GDB cannot find the typeid on this target"));
189 return (*current_cp_abi.get_typeid) (value);
190}
191
192/* See cp-abi.h. */
193
194struct type *
195cplus_typeid_type (struct gdbarch *gdbarch)
196{
197 if (current_cp_abi.get_typeid_type == NULL)
198 error (_("GDB cannot find the type for 'typeid' on this target"));
199 return (*current_cp_abi.get_typeid_type) (gdbarch);
200}
201
72f1fe8a
TT
202/* See cp-abi.h. */
203
204struct type *
205cplus_type_from_type_info (struct value *value)
206{
207 if (current_cp_abi.get_type_from_type_info == NULL)
208 error (_("GDB cannot find the type from a std::type_info on this target"));
209 return (*current_cp_abi.get_type_from_type_info) (value);
210}
211
cc16e6c9
TT
212/* See cp-abi.h. */
213
2f408ecb 214std::string
cc16e6c9
TT
215cplus_typename_from_type_info (struct value *value)
216{
217 if (current_cp_abi.get_typename_from_type_info == NULL)
218 error (_("GDB cannot find the type name "
219 "from a std::type_info on this target"));
220 return (*current_cp_abi.get_typename_from_type_info) (value);
221}
222
9d084466
TBA
223/* See cp-abi.h. */
224
225struct language_pass_by_ref_info
41f1b697
DJ
226cp_pass_by_reference (struct type *type)
227{
228 if ((current_cp_abi.pass_by_reference) == NULL)
9d084466 229 return default_pass_by_reference (type);
41f1b697
DJ
230 return (*current_cp_abi.pass_by_reference) (type);
231}
232
fe1f4a5e
DJ
233/* Set the current C++ ABI to SHORT_NAME. */
234
235static int
236switch_to_cp_abi (const char *short_name)
237{
238 struct cp_abi_ops *abi;
239
240 abi = find_cp_abi (short_name);
241 if (abi == NULL)
242 return 0;
243
244 current_cp_abi = *abi;
245 return 1;
246}
247
248/* Add ABI to the list of supported C++ ABI's. */
249
015a42b4 250int
fe1f4a5e 251register_cp_abi (struct cp_abi_ops *abi)
015a42b4 252{
fe1f4a5e
DJ
253 if (num_cp_abis == CP_ABI_MAX)
254 internal_error (__FILE__, __LINE__,
3e43a32a
MS
255 _("Too many C++ ABIs, please increase "
256 "CP_ABI_MAX in cp-abi.c"));
fe1f4a5e 257
015a42b4
JB
258 cp_abis[num_cp_abis++] = abi;
259
260 return 1;
fe1f4a5e
DJ
261}
262
263/* Set the ABI to use in "auto" mode to SHORT_NAME. */
015a42b4 264
fe1f4a5e
DJ
265void
266set_cp_abi_as_auto_default (const char *short_name)
267{
268 char *new_longname, *new_doc;
269 struct cp_abi_ops *abi = find_cp_abi (short_name);
270
271 if (abi == NULL)
272 internal_error (__FILE__, __LINE__,
e2e0b3e5 273 _("Cannot find C++ ABI \"%s\" to set it as auto default."),
fe1f4a5e
DJ
274 short_name);
275
276 if (auto_cp_abi.longname != NULL)
277 xfree ((char *) auto_cp_abi.longname);
278 if (auto_cp_abi.doc != NULL)
279 xfree ((char *) auto_cp_abi.doc);
280
281 auto_cp_abi = *abi;
282
283 auto_cp_abi.shortname = "auto";
0dfdb8ba 284 new_longname = xstrprintf ("currently \"%s\"", abi->shortname);
fe1f4a5e
DJ
285 auto_cp_abi.longname = new_longname;
286
0dfdb8ba 287 new_doc = xstrprintf ("Automatically selected; currently \"%s\"",
049742da 288 abi->shortname);
fe1f4a5e
DJ
289 auto_cp_abi.doc = new_doc;
290
291 /* Since we copy the current ABI into current_cp_abi instead of
292 using a pointer, if auto is currently the default, we need to
293 reset it. */
294 if (strcmp (current_cp_abi.shortname, "auto") == 0)
295 switch_to_cp_abi ("auto");
015a42b4
JB
296}
297
fe1f4a5e
DJ
298/* Return the ABI operations associated with SHORT_NAME. */
299
300static struct cp_abi_ops *
301find_cp_abi (const char *short_name)
015a42b4
JB
302{
303 int i;
fe1f4a5e 304
015a42b4 305 for (i = 0; i < num_cp_abis; i++)
fe1f4a5e
DJ
306 if (strcmp (cp_abis[i]->shortname, short_name) == 0)
307 return cp_abis[i];
308
309 return NULL;
015a42b4
JB
310}
311
fe1f4a5e
DJ
312/* Display the list of registered C++ ABIs. */
313
314static void
315list_cp_abis (int from_tty)
316{
79a45e25 317 struct ui_out *uiout = current_uiout;
fe1f4a5e 318 int i;
fe1f4a5e 319
112e8700 320 uiout->text ("The available C++ ABIs are:\n");
2e783024 321 ui_out_emit_tuple tuple_emitter (uiout, "cp-abi-list");
fe1f4a5e
DJ
322 for (i = 0; i < num_cp_abis; i++)
323 {
324 char pad[14];
325 int padcount;
326
112e8700
SM
327 uiout->text (" ");
328 uiout->field_string ("cp-abi", cp_abis[i]->shortname);
fe1f4a5e
DJ
329
330 padcount = 16 - 2 - strlen (cp_abis[i]->shortname);
331 pad[padcount] = 0;
332 while (padcount > 0)
333 pad[--padcount] = ' ';
112e8700 334 uiout->text (pad);
fe1f4a5e 335
112e8700
SM
336 uiout->field_string ("doc", cp_abis[i]->doc);
337 uiout->text ("\n");
fe1f4a5e 338 }
fe1f4a5e
DJ
339}
340
341/* Set the current C++ ABI, or display the list of options if no
342 argument is given. */
343
344static void
4ada038f 345set_cp_abi_cmd (const char *args, int from_tty)
fe1f4a5e
DJ
346{
347 if (args == NULL)
348 {
349 list_cp_abis (from_tty);
350 return;
351 }
352
353 if (!switch_to_cp_abi (args))
8a3fe4f8 354 error (_("Could not find \"%s\" in ABI list"), args);
fe1f4a5e
DJ
355}
356
db2b2972
TT
357/* A completion function for "set cp-abi". */
358
eb3ff9a5 359static void
db2b2972 360cp_abi_completer (struct cmd_list_element *ignore,
eb3ff9a5 361 completion_tracker &tracker,
6f937416 362 const char *text, const char *word)
db2b2972
TT
363{
364 static const char **cp_abi_names;
365
366 if (cp_abi_names == NULL)
367 {
368 int i;
369
370 cp_abi_names = XNEWVEC (const char *, num_cp_abis + 1);
371 for (i = 0; i < num_cp_abis; ++i)
372 cp_abi_names[i] = cp_abis[i]->shortname;
6108433d 373 cp_abi_names[i] = NULL;
db2b2972
TT
374 }
375
eb3ff9a5 376 complete_on_enum (tracker, cp_abi_names, text, word);
db2b2972
TT
377}
378
fe1f4a5e
DJ
379/* Show the currently selected C++ ABI. */
380
381static void
4ada038f 382show_cp_abi_cmd (const char *args, int from_tty)
fe1f4a5e 383{
79a45e25
PA
384 struct ui_out *uiout = current_uiout;
385
112e8700 386 uiout->text ("The currently selected C++ ABI is \"");
fe1f4a5e 387
112e8700
SM
388 uiout->field_string ("cp-abi", current_cp_abi.shortname);
389 uiout->text ("\" (");
390 uiout->field_string ("longname", current_cp_abi.longname);
391 uiout->text (").\n");
fe1f4a5e
DJ
392}
393
394void
395_initialize_cp_abi (void)
396{
db2b2972
TT
397 struct cmd_list_element *c;
398
fe1f4a5e
DJ
399 register_cp_abi (&auto_cp_abi);
400 switch_to_cp_abi ("auto");
401
db2b2972 402 c = add_cmd ("cp-abi", class_obscure, set_cp_abi_cmd, _("\
ac74f770
MS
403Set the ABI used for inspecting C++ objects.\n\
404\"set cp-abi\" with no arguments will list the available ABIs."),
db2b2972
TT
405 &setlist);
406 set_cmd_completer (c, cp_abi_completer);
fe1f4a5e
DJ
407
408 add_cmd ("cp-abi", class_obscure, show_cp_abi_cmd,
aff410f1
MS
409 _("Show the ABI used for inspecting C++ objects."),
410 &showlist);
fe1f4a5e 411}
This page took 1.328235 seconds and 4 git commands to generate.