1 /* Generic code for supporting multiple C++ ABI's 2 3 Copyright (C) 2001-2003, 2005-2012 Free Software Foundation, Inc. 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 9 the Free Software Foundation; either version 3 of the License, or 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 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 20 #include "defs.h" 21 #include "value.h" 22 #include "cp-abi.h" 23 #include "command.h" 24 #include "exceptions.h" 25 #include "gdbcmd.h" 26 #include "ui-out.h" 27 #include "gdb_assert.h" 28 #include "gdb_string.h" 29 30 static struct cp_abi_ops *find_cp_abi (const char *short_name); 31 32 static struct cp_abi_ops current_cp_abi = { "", NULL }; 33 static struct cp_abi_ops auto_cp_abi = { "auto", NULL }; 34 35 #define CP_ABI_MAX 8 36 static struct cp_abi_ops *cp_abis[CP_ABI_MAX]; 37 static int num_cp_abis = 0; 38 39 enum ctor_kinds 40 is_constructor_name (const char *name) 41 { 42 if ((current_cp_abi.is_constructor_name) == NULL) 43 error (_("ABI doesn't define required function is_constructor_name")); 44 return (*current_cp_abi.is_constructor_name) (name); 45 } 46 47 enum dtor_kinds 48 is_destructor_name (const char *name) 49 { 50 if ((current_cp_abi.is_destructor_name) == NULL) 51 error (_("ABI doesn't define required function is_destructor_name")); 52 return (*current_cp_abi.is_destructor_name) (name); 53 } 54 55 int 56 is_vtable_name (const char *name) 57 { 58 if ((current_cp_abi.is_vtable_name) == NULL) 59 error (_("ABI doesn't define required function is_vtable_name")); 60 return (*current_cp_abi.is_vtable_name) (name); 61 } 62 63 int 64 is_operator_name (const char *name) 65 { 66 if ((current_cp_abi.is_operator_name) == NULL) 67 error (_("ABI doesn't define required function is_operator_name")); 68 return (*current_cp_abi.is_operator_name) (name); 69 } 70 71 int 72 baseclass_offset (struct type *type, int index, const gdb_byte *valaddr, 73 int embedded_offset, CORE_ADDR address, 74 const struct value *val) 75 { 76 volatile struct gdb_exception ex; 77 int res = 0; 78 79 gdb_assert (current_cp_abi.baseclass_offset != NULL); 80 81 TRY_CATCH (ex, RETURN_MASK_ERROR) 82 { 83 res = (*current_cp_abi.baseclass_offset) (type, index, valaddr, 84 embedded_offset, 85 address, val); 86 } 87 88 if (ex.reason < 0 && ex.error == NOT_AVAILABLE_ERROR) 89 throw_error (NOT_AVAILABLE_ERROR, 90 _("Cannot determine virtual baseclass offset " 91 "of incomplete object")); 92 else if (ex.reason < 0) 93 throw_exception (ex); 94 else 95 return res; 96 } 97 98 struct value * 99 value_virtual_fn_field (struct value **arg1p, 100 struct fn_field *f, int j, 101 struct type *type, int offset) 102 { 103 if ((current_cp_abi.virtual_fn_field) == NULL) 104 return NULL; 105 return (*current_cp_abi.virtual_fn_field) (arg1p, f, j, 106 type, offset); 107 } 108 109 struct type * 110 value_rtti_type (struct value *v, int *full, 111 int *top, int *using_enc) 112 { 113 struct type *ret = NULL; 114 struct gdb_exception e; 115 116 if ((current_cp_abi.rtti_type) == NULL) 117 return NULL; 118 TRY_CATCH (e, RETURN_MASK_ERROR) 119 { 120 ret = (*current_cp_abi.rtti_type) (v, full, top, using_enc); 121 } 122 if (e.reason < 0) 123 return NULL; 124 return ret; 125 } 126 127 void 128 cplus_print_method_ptr (const gdb_byte *contents, 129 struct type *type, 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 137 int 138 cplus_method_ptr_size (struct type *to_type) 139 { 140 if (current_cp_abi.method_ptr_size == NULL) 141 error (_("GDB does not support pointers to methods on this target")); 142 return (*current_cp_abi.method_ptr_size) (to_type); 143 } 144 145 void 146 cplus_make_method_ptr (struct type *type, gdb_byte *contents, 147 CORE_ADDR value, int is_virtual) 148 { 149 if (current_cp_abi.make_method_ptr == NULL) 150 error (_("GDB does not support pointers to methods on this target")); 151 (*current_cp_abi.make_method_ptr) (type, contents, value, is_virtual); 152 } 153 154 CORE_ADDR 155 cplus_skip_trampoline (struct frame_info *frame, 156 CORE_ADDR stop_pc) 157 { 158 if (current_cp_abi.skip_trampoline == NULL) 159 return 0; 160 return (*current_cp_abi.skip_trampoline) (frame, stop_pc); 161 } 162 163 struct value * 164 cplus_method_ptr_to_value (struct value **this_p, 165 struct value *method_ptr) 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 172 int 173 cp_pass_by_reference (struct type *type) 174 { 175 if ((current_cp_abi.pass_by_reference) == NULL) 176 return 0; 177 return (*current_cp_abi.pass_by_reference) (type); 178 } 179 180 /* Set the current C++ ABI to SHORT_NAME. */ 181 182 static int 183 switch_to_cp_abi (const char *short_name) 184 { 185 struct cp_abi_ops *abi; 186 187 abi = find_cp_abi (short_name); 188 if (abi == NULL) 189 return 0; 190 191 current_cp_abi = *abi; 192 return 1; 193 } 194 195 /* Add ABI to the list of supported C++ ABI's. */ 196 197 int 198 register_cp_abi (struct cp_abi_ops *abi) 199 { 200 if (num_cp_abis == CP_ABI_MAX) 201 internal_error (__FILE__, __LINE__, 202 _("Too many C++ ABIs, please increase " 203 "CP_ABI_MAX in cp-abi.c")); 204 205 cp_abis[num_cp_abis++] = abi; 206 207 return 1; 208 } 209 210 /* Set the ABI to use in "auto" mode to SHORT_NAME. */ 211 212 void 213 set_cp_abi_as_auto_default (const char *short_name) 214 { 215 char *new_longname, *new_doc; 216 struct cp_abi_ops *abi = find_cp_abi (short_name); 217 218 if (abi == NULL) 219 internal_error (__FILE__, __LINE__, 220 _("Cannot find C++ ABI \"%s\" to set it as auto default."), 221 short_name); 222 223 if (auto_cp_abi.longname != NULL) 224 xfree ((char *) auto_cp_abi.longname); 225 if (auto_cp_abi.doc != NULL) 226 xfree ((char *) auto_cp_abi.doc); 227 228 auto_cp_abi = *abi; 229 230 auto_cp_abi.shortname = "auto"; 231 new_longname = xstrprintf ("currently \"%s\"", abi->shortname); 232 auto_cp_abi.longname = new_longname; 233 234 new_doc = xstrprintf ("Automatically selected; currently \"%s\"", 235 abi->shortname); 236 auto_cp_abi.doc = new_doc; 237 238 /* Since we copy the current ABI into current_cp_abi instead of 239 using a pointer, if auto is currently the default, we need to 240 reset it. */ 241 if (strcmp (current_cp_abi.shortname, "auto") == 0) 242 switch_to_cp_abi ("auto"); 243 } 244 245 /* Return the ABI operations associated with SHORT_NAME. */ 246 247 static struct cp_abi_ops * 248 find_cp_abi (const char *short_name) 249 { 250 int i; 251 252 for (i = 0; i < num_cp_abis; i++) 253 if (strcmp (cp_abis[i]->shortname, short_name) == 0) 254 return cp_abis[i]; 255 256 return NULL; 257 } 258 259 /* Display the list of registered C++ ABIs. */ 260 261 static void 262 list_cp_abis (int from_tty) 263 { 264 struct ui_out *uiout = current_uiout; 265 struct cleanup *cleanup_chain; 266 int i; 267 268 ui_out_text (uiout, "The available C++ ABIs are:\n"); 269 cleanup_chain = make_cleanup_ui_out_tuple_begin_end (uiout, 270 "cp-abi-list"); 271 for (i = 0; i < num_cp_abis; i++) 272 { 273 char pad[14]; 274 int padcount; 275 276 ui_out_text (uiout, " "); 277 ui_out_field_string (uiout, "cp-abi", cp_abis[i]->shortname); 278 279 padcount = 16 - 2 - strlen (cp_abis[i]->shortname); 280 pad[padcount] = 0; 281 while (padcount > 0) 282 pad[--padcount] = ' '; 283 ui_out_text (uiout, pad); 284 285 ui_out_field_string (uiout, "doc", cp_abis[i]->doc); 286 ui_out_text (uiout, "\n"); 287 } 288 do_cleanups (cleanup_chain); 289 } 290 291 /* Set the current C++ ABI, or display the list of options if no 292 argument is given. */ 293 294 static void 295 set_cp_abi_cmd (char *args, int from_tty) 296 { 297 if (args == NULL) 298 { 299 list_cp_abis (from_tty); 300 return; 301 } 302 303 if (!switch_to_cp_abi (args)) 304 error (_("Could not find \"%s\" in ABI list"), args); 305 } 306 307 /* Show the currently selected C++ ABI. */ 308 309 static void 310 show_cp_abi_cmd (char *args, int from_tty) 311 { 312 struct ui_out *uiout = current_uiout; 313 314 ui_out_text (uiout, "The currently selected C++ ABI is \""); 315 316 ui_out_field_string (uiout, "cp-abi", current_cp_abi.shortname); 317 ui_out_text (uiout, "\" ("); 318 ui_out_field_string (uiout, "longname", current_cp_abi.longname); 319 ui_out_text (uiout, ").\n"); 320 } 321 322 extern initialize_file_ftype _initialize_cp_abi; /* -Wmissing-prototypes */ 323 324 void 325 _initialize_cp_abi (void) 326 { 327 register_cp_abi (&auto_cp_abi); 328 switch_to_cp_abi ("auto"); 329 330 add_cmd ("cp-abi", class_obscure, set_cp_abi_cmd, _("\ 331 Set the ABI used for inspecting C++ objects.\n\ 332 \"set cp-abi\" with no arguments will list the available ABIs."), 333 &setlist); 334 335 add_cmd ("cp-abi", class_obscure, show_cp_abi_cmd, 336 _("Show the ABI used for inspecting C++ objects."), 337 &showlist); 338 } 339