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