*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / cp-abi.c
CommitLineData
015a42b4 1/* Generic code for supporting multiple C++ ABI's
06c4d4dc 2
6aba47ca
DJ
3 Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007
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
DJ
24#include "command.h"
25#include "gdbcmd.h"
26#include "ui-out.h"
27
309367d4 28#include "gdb_string.h"
015a42b4 29
fe1f4a5e 30static struct cp_abi_ops *find_cp_abi (const char *short_name);
015a42b4 31
fe1f4a5e
DJ
32static struct cp_abi_ops current_cp_abi = { "", NULL };
33static struct cp_abi_ops auto_cp_abi = { "auto", NULL };
015a42b4 34
fe1f4a5e
DJ
35#define CP_ABI_MAX 8
36static struct cp_abi_ops *cp_abis[CP_ABI_MAX];
37static int num_cp_abis = 0;
015a42b4
JB
38
39enum ctor_kinds
40is_constructor_name (const char *name)
41{
42 if ((current_cp_abi.is_constructor_name) == NULL)
8a3fe4f8 43 error (_("ABI doesn't define required function is_constructor_name"));
015a42b4
JB
44 return (*current_cp_abi.is_constructor_name) (name);
45}
46
47enum dtor_kinds
48is_destructor_name (const char *name)
49{
50 if ((current_cp_abi.is_destructor_name) == NULL)
8a3fe4f8 51 error (_("ABI doesn't define required function is_destructor_name"));
015a42b4
JB
52 return (*current_cp_abi.is_destructor_name) (name);
53}
54
55int
56is_vtable_name (const char *name)
57{
58 if ((current_cp_abi.is_vtable_name) == NULL)
8a3fe4f8 59 error (_("ABI doesn't define required function is_vtable_name"));
015a42b4
JB
60 return (*current_cp_abi.is_vtable_name) (name);
61}
62
63int
64is_operator_name (const char *name)
65{
66 if ((current_cp_abi.is_operator_name) == NULL)
8a3fe4f8 67 error (_("ABI doesn't define required function is_operator_name"));
015a42b4
JB
68 return (*current_cp_abi.is_operator_name) (name);
69}
70
1514d34e 71int
06c4d4dc 72baseclass_offset (struct type *type, int index, const bfd_byte *valaddr,
1514d34e
DJ
73 CORE_ADDR address)
74{
75 if (current_cp_abi.baseclass_offset == NULL)
8a3fe4f8 76 error (_("ABI doesn't define required function baseclass_offset"));
1514d34e
DJ
77 return (*current_cp_abi.baseclass_offset) (type, index, valaddr, address);
78}
79
e933e538 80struct value *
fe1f4a5e
DJ
81value_virtual_fn_field (struct value **arg1p, struct fn_field *f, int j,
82 struct type *type, int offset)
015a42b4
JB
83{
84 if ((current_cp_abi.virtual_fn_field) == NULL)
85 return NULL;
86 return (*current_cp_abi.virtual_fn_field) (arg1p, f, j, type, offset);
87}
1514d34e 88
015a42b4 89struct type *
e933e538 90value_rtti_type (struct value *v, int *full, int *top, int *using_enc)
015a42b4
JB
91{
92 if ((current_cp_abi.rtti_type) == NULL)
93 return NULL;
94 return (*current_cp_abi.rtti_type) (v, full, top, using_enc);
95}
96
0d5de010
DJ
97void
98cplus_print_method_ptr (const gdb_byte *contents, struct type *type,
99 struct ui_file *stream)
100{
101 if (current_cp_abi.print_method_ptr == NULL)
102 error (_("GDB does not support pointers to methods on this target"));
103 (*current_cp_abi.print_method_ptr) (contents, type, stream);
104}
105
106int
107cplus_method_ptr_size (void)
108{
109 if (current_cp_abi.method_ptr_size == NULL)
110 error (_("GDB does not support pointers to methods on this target"));
111 return (*current_cp_abi.method_ptr_size) ();
112}
113
114void
115cplus_make_method_ptr (gdb_byte *contents, CORE_ADDR value, int is_virtual)
116{
117 if (current_cp_abi.make_method_ptr == NULL)
118 error (_("GDB does not support pointers to methods on this target"));
119 (*current_cp_abi.make_method_ptr) (contents, value, is_virtual);
120}
121
b18be20d 122CORE_ADDR
52f729a7 123cplus_skip_trampoline (struct frame_info *frame, CORE_ADDR stop_pc)
b18be20d
DJ
124{
125 if (current_cp_abi.skip_trampoline == NULL)
126 return 0;
52f729a7 127 return (*current_cp_abi.skip_trampoline) (frame, stop_pc);
b18be20d
DJ
128}
129
0d5de010
DJ
130struct value *
131cplus_method_ptr_to_value (struct value **this_p, struct value *method_ptr)
132{
133 if (current_cp_abi.method_ptr_to_value == NULL)
134 error (_("GDB does not support pointers to methods on this target"));
135 return (*current_cp_abi.method_ptr_to_value) (this_p, method_ptr);
136}
137
fe1f4a5e
DJ
138/* Set the current C++ ABI to SHORT_NAME. */
139
140static int
141switch_to_cp_abi (const char *short_name)
142{
143 struct cp_abi_ops *abi;
144
145 abi = find_cp_abi (short_name);
146 if (abi == NULL)
147 return 0;
148
149 current_cp_abi = *abi;
150 return 1;
151}
152
153/* Add ABI to the list of supported C++ ABI's. */
154
015a42b4 155int
fe1f4a5e 156register_cp_abi (struct cp_abi_ops *abi)
015a42b4 157{
fe1f4a5e
DJ
158 if (num_cp_abis == CP_ABI_MAX)
159 internal_error (__FILE__, __LINE__,
e2e0b3e5 160 _("Too many C++ ABIs, please increase CP_ABI_MAX in cp-abi.c"));
fe1f4a5e 161
015a42b4
JB
162 cp_abis[num_cp_abis++] = abi;
163
164 return 1;
fe1f4a5e
DJ
165}
166
167/* Set the ABI to use in "auto" mode to SHORT_NAME. */
015a42b4 168
fe1f4a5e
DJ
169void
170set_cp_abi_as_auto_default (const char *short_name)
171{
172 char *new_longname, *new_doc;
173 struct cp_abi_ops *abi = find_cp_abi (short_name);
174
175 if (abi == NULL)
176 internal_error (__FILE__, __LINE__,
e2e0b3e5 177 _("Cannot find C++ ABI \"%s\" to set it as auto default."),
fe1f4a5e
DJ
178 short_name);
179
180 if (auto_cp_abi.longname != NULL)
181 xfree ((char *) auto_cp_abi.longname);
182 if (auto_cp_abi.doc != NULL)
183 xfree ((char *) auto_cp_abi.doc);
184
185 auto_cp_abi = *abi;
186
187 auto_cp_abi.shortname = "auto";
049742da 188 xasprintf (&new_longname, "currently \"%s\"", abi->shortname);
fe1f4a5e
DJ
189 auto_cp_abi.longname = new_longname;
190
049742da
MK
191 xasprintf (&new_doc, "Automatically selected; currently \"%s\"",
192 abi->shortname);
fe1f4a5e
DJ
193 auto_cp_abi.doc = new_doc;
194
195 /* Since we copy the current ABI into current_cp_abi instead of
196 using a pointer, if auto is currently the default, we need to
197 reset it. */
198 if (strcmp (current_cp_abi.shortname, "auto") == 0)
199 switch_to_cp_abi ("auto");
015a42b4
JB
200}
201
fe1f4a5e
DJ
202/* Return the ABI operations associated with SHORT_NAME. */
203
204static struct cp_abi_ops *
205find_cp_abi (const char *short_name)
015a42b4
JB
206{
207 int i;
fe1f4a5e 208
015a42b4 209 for (i = 0; i < num_cp_abis; i++)
fe1f4a5e
DJ
210 if (strcmp (cp_abis[i]->shortname, short_name) == 0)
211 return cp_abis[i];
212
213 return NULL;
015a42b4
JB
214}
215
fe1f4a5e
DJ
216/* Display the list of registered C++ ABIs. */
217
218static void
219list_cp_abis (int from_tty)
220{
221 struct cleanup *cleanup_chain;
222 int i;
223 ui_out_text (uiout, "The available C++ ABIs are:\n");
224
225 cleanup_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "cp-abi-list");
226 for (i = 0; i < num_cp_abis; i++)
227 {
228 char pad[14];
229 int padcount;
230
231 ui_out_text (uiout, " ");
232 ui_out_field_string (uiout, "cp-abi", cp_abis[i]->shortname);
233
234 padcount = 16 - 2 - strlen (cp_abis[i]->shortname);
235 pad[padcount] = 0;
236 while (padcount > 0)
237 pad[--padcount] = ' ';
238 ui_out_text (uiout, pad);
239
240 ui_out_field_string (uiout, "doc", cp_abis[i]->doc);
241 ui_out_text (uiout, "\n");
242 }
243 do_cleanups (cleanup_chain);
244}
245
246/* Set the current C++ ABI, or display the list of options if no
247 argument is given. */
248
249static void
250set_cp_abi_cmd (char *args, int from_tty)
251{
252 if (args == NULL)
253 {
254 list_cp_abis (from_tty);
255 return;
256 }
257
258 if (!switch_to_cp_abi (args))
8a3fe4f8 259 error (_("Could not find \"%s\" in ABI list"), args);
fe1f4a5e
DJ
260}
261
262/* Show the currently selected C++ ABI. */
263
264static void
265show_cp_abi_cmd (char *args, int from_tty)
266{
267 ui_out_text (uiout, "The currently selected C++ ABI is \"");
268
269 ui_out_field_string (uiout, "cp-abi", current_cp_abi.shortname);
270 ui_out_text (uiout, "\" (");
271 ui_out_field_string (uiout, "longname", current_cp_abi.longname);
272 ui_out_text (uiout, ").\n");
273}
274
b9362cc7
AC
275extern initialize_file_ftype _initialize_cp_abi; /* -Wmissing-prototypes */
276
fe1f4a5e
DJ
277void
278_initialize_cp_abi (void)
279{
280 register_cp_abi (&auto_cp_abi);
281 switch_to_cp_abi ("auto");
282
1a966eab
AC
283 add_cmd ("cp-abi", class_obscure, set_cp_abi_cmd, _("\
284Set the ABI used for inspecting C++ objects.\n\
285\"set cp-abi\" with no arguments will list the available ABIs."),
fe1f4a5e
DJ
286 &setlist);
287
288 add_cmd ("cp-abi", class_obscure, show_cp_abi_cmd,
1a966eab 289 _("Show the ABI used for inspecting C++ objects."), &showlist);
fe1f4a5e 290}
This page took 0.422831 seconds and 4 git commands to generate.