/* Generic code for supporting multiple C++ ABI's
- Copyright 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007
+ Free Software Foundation, Inc.
This file is part of GDB.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA. */
#include "defs.h"
#include "value.h"
is_constructor_name (const char *name)
{
if ((current_cp_abi.is_constructor_name) == NULL)
- error ("ABI doesn't define required function is_constructor_name");
+ error (_("ABI doesn't define required function is_constructor_name"));
return (*current_cp_abi.is_constructor_name) (name);
}
is_destructor_name (const char *name)
{
if ((current_cp_abi.is_destructor_name) == NULL)
- error ("ABI doesn't define required function is_destructor_name");
+ error (_("ABI doesn't define required function is_destructor_name"));
return (*current_cp_abi.is_destructor_name) (name);
}
is_vtable_name (const char *name)
{
if ((current_cp_abi.is_vtable_name) == NULL)
- error ("ABI doesn't define required function is_vtable_name");
+ error (_("ABI doesn't define required function is_vtable_name"));
return (*current_cp_abi.is_vtable_name) (name);
}
is_operator_name (const char *name)
{
if ((current_cp_abi.is_operator_name) == NULL)
- error ("ABI doesn't define required function is_operator_name");
+ error (_("ABI doesn't define required function is_operator_name"));
return (*current_cp_abi.is_operator_name) (name);
}
CORE_ADDR address)
{
if (current_cp_abi.baseclass_offset == NULL)
- error ("ABI doesn't define required function baseclass_offset");
+ error (_("ABI doesn't define required function baseclass_offset"));
return (*current_cp_abi.baseclass_offset) (type, index, valaddr, address);
}
return (*current_cp_abi.rtti_type) (v, full, top, using_enc);
}
+void
+cplus_print_method_ptr (const gdb_byte *contents, struct type *type,
+ struct ui_file *stream)
+{
+ if (current_cp_abi.print_method_ptr == NULL)
+ error (_("GDB does not support pointers to methods on this target"));
+ (*current_cp_abi.print_method_ptr) (contents, type, stream);
+}
+
+int
+cplus_method_ptr_size (void)
+{
+ if (current_cp_abi.method_ptr_size == NULL)
+ error (_("GDB does not support pointers to methods on this target"));
+ return (*current_cp_abi.method_ptr_size) ();
+}
+
+void
+cplus_make_method_ptr (gdb_byte *contents, CORE_ADDR value, int is_virtual)
+{
+ if (current_cp_abi.make_method_ptr == NULL)
+ error (_("GDB does not support pointers to methods on this target"));
+ (*current_cp_abi.make_method_ptr) (contents, value, is_virtual);
+}
+
+CORE_ADDR
+cplus_skip_trampoline (CORE_ADDR stop_pc)
+{
+ if (current_cp_abi.skip_trampoline == NULL)
+ return 0;
+ return (*current_cp_abi.skip_trampoline) (stop_pc);
+}
+
+struct value *
+cplus_method_ptr_to_value (struct value **this_p, struct value *method_ptr)
+{
+ if (current_cp_abi.method_ptr_to_value == NULL)
+ error (_("GDB does not support pointers to methods on this target"));
+ return (*current_cp_abi.method_ptr_to_value) (this_p, method_ptr);
+}
+
/* Set the current C++ ABI to SHORT_NAME. */
static int
{
if (num_cp_abis == CP_ABI_MAX)
internal_error (__FILE__, __LINE__,
- "Too many C++ ABIs, please increase CP_ABI_MAX in cp-abi.c");
+ _("Too many C++ ABIs, please increase CP_ABI_MAX in cp-abi.c"));
cp_abis[num_cp_abis++] = abi;
if (abi == NULL)
internal_error (__FILE__, __LINE__,
- "Cannot find C++ ABI \"%s\" to set it as auto default.",
+ _("Cannot find C++ ABI \"%s\" to set it as auto default."),
short_name);
if (auto_cp_abi.longname != NULL)
auto_cp_abi = *abi;
auto_cp_abi.shortname = "auto";
- new_longname = xmalloc (strlen ("currently ") + 1 + strlen (abi->shortname)
- + 1 + 1);
- sprintf (new_longname, "currently \"%s\"", abi->shortname);
+ xasprintf (&new_longname, "currently \"%s\"", abi->shortname);
auto_cp_abi.longname = new_longname;
- new_doc = xmalloc (strlen ("Automatically selected; currently ")
- + 1 + strlen (abi->shortname) + 1 + 1);
- sprintf (new_doc, "Automatically selected; currently \"%s\"", abi->shortname);
+ xasprintf (&new_doc, "Automatically selected; currently \"%s\"",
+ abi->shortname);
auto_cp_abi.doc = new_doc;
/* Since we copy the current ABI into current_cp_abi instead of
}
if (!switch_to_cp_abi (args))
- error ("Could not find \"%s\" in ABI list", args);
+ error (_("Could not find \"%s\" in ABI list"), args);
}
/* Show the currently selected C++ ABI. */
register_cp_abi (&auto_cp_abi);
switch_to_cp_abi ("auto");
- 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.",
+ 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);
add_cmd ("cp-abi", class_obscure, show_cp_abi_cmd,
- "Show the ABI used for inspecting C++ objects.", &showlist);
+ _("Show the ABI used for inspecting C++ objects."), &showlist);
}