Index: gdb/cp-abi.c |
diff --git a/gdb/cp-abi.c b/gdb/cp-abi.c |
index 16b53566b58fbd0e24b063862d570ebea3ff51b9..f1858898fa71e6ec657b231c3c06afe1e37018c3 100644 |
--- a/gdb/cp-abi.c |
+++ b/gdb/cp-abi.c |
@@ -1,6 +1,6 @@ |
/* Generic code for supporting multiple C++ ABI's |
- Copyright (C) 2001-2003, 2005-2012 Free Software Foundation, Inc. |
+ Copyright (C) 2001-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
@@ -25,7 +25,7 @@ |
#include "gdbcmd.h" |
#include "ui-out.h" |
#include "gdb_assert.h" |
-#include "gdb_string.h" |
+#include <string.h> |
static struct cp_abi_ops *find_cp_abi (const char *short_name); |
@@ -176,7 +176,48 @@ cplus_print_vtable (struct value *value) |
{ |
if (current_cp_abi.print_vtable == NULL) |
error (_("GDB cannot print the vtable on this target")); |
- return (*current_cp_abi.print_vtable) (value); |
+ (*current_cp_abi.print_vtable) (value); |
+} |
+ |
+/* See cp-abi.h. */ |
+ |
+struct value * |
+cplus_typeid (struct value *value) |
+{ |
+ if (current_cp_abi.get_typeid == NULL) |
+ error (_("GDB cannot find the typeid on this target")); |
+ return (*current_cp_abi.get_typeid) (value); |
+} |
+ |
+/* See cp-abi.h. */ |
+ |
+struct type * |
+cplus_typeid_type (struct gdbarch *gdbarch) |
+{ |
+ if (current_cp_abi.get_typeid_type == NULL) |
+ error (_("GDB cannot find the type for 'typeid' on this target")); |
+ return (*current_cp_abi.get_typeid_type) (gdbarch); |
+} |
+ |
+/* See cp-abi.h. */ |
+ |
+struct type * |
+cplus_type_from_type_info (struct value *value) |
+{ |
+ if (current_cp_abi.get_type_from_type_info == NULL) |
+ error (_("GDB cannot find the type from a std::type_info on this target")); |
+ return (*current_cp_abi.get_type_from_type_info) (value); |
+} |
+ |
+/* See cp-abi.h. */ |
+ |
+char * |
+cplus_typename_from_type_info (struct value *value) |
+{ |
+ if (current_cp_abi.get_typename_from_type_info == NULL) |
+ error (_("GDB cannot find the type name " |
+ "from a std::type_info on this target")); |
+ return (*current_cp_abi.get_typename_from_type_info) (value); |
} |
int |
@@ -314,6 +355,27 @@ set_cp_abi_cmd (char *args, int from_tty) |
error (_("Could not find \"%s\" in ABI list"), args); |
} |
+/* A completion function for "set cp-abi". */ |
+ |
+static VEC (char_ptr) * |
+cp_abi_completer (struct cmd_list_element *ignore, |
+ const char *text, const char *word) |
+{ |
+ static const char **cp_abi_names; |
+ |
+ if (cp_abi_names == NULL) |
+ { |
+ int i; |
+ |
+ cp_abi_names = XNEWVEC (const char *, num_cp_abis + 1); |
+ for (i = 0; i < num_cp_abis; ++i) |
+ cp_abi_names[i] = cp_abis[i]->shortname; |
+ cp_abi_names[i] = NULL; |
+ } |
+ |
+ return complete_on_enum (cp_abi_names, text, word); |
+} |
+ |
/* Show the currently selected C++ ABI. */ |
static void |
@@ -334,13 +396,16 @@ extern initialize_file_ftype _initialize_cp_abi; /* -Wmissing-prototypes */ |
void |
_initialize_cp_abi (void) |
{ |
+ struct cmd_list_element *c; |
+ |
register_cp_abi (&auto_cp_abi); |
switch_to_cp_abi ("auto"); |
- add_cmd ("cp-abi", class_obscure, set_cp_abi_cmd, _("\ |
+ c = add_cmd ("cp-abi", class_obscure, set_cp_abi_cmd, _("\ |
Set the ABI used for inspecting C++ objects.\n\ |
\"set cp-abi\" with no arguments will list the available ABIs."), |
- &setlist); |
+ &setlist); |
+ set_cmd_completer (c, cp_abi_completer); |
add_cmd ("cp-abi", class_obscure, show_cp_abi_cmd, |
_("Show the ABI used for inspecting C++ objects."), |