/* Generic code for supporting multiple C++ ABI's
- Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2010
- Free Software Foundation, Inc.
+ Copyright (C) 2001-2003, 2005-2012 Free Software Foundation, Inc.
This file is part of GDB.
#include "exceptions.h"
#include "gdbcmd.h"
#include "ui-out.h"
-
+#include "gdb_assert.h"
#include "gdb_string.h"
static struct cp_abi_ops *find_cp_abi (const char *short_name);
}
int
-baseclass_offset (struct type *type, int index,
- const bfd_byte *valaddr,
- CORE_ADDR address)
+baseclass_offset (struct type *type, int index, const gdb_byte *valaddr,
+ int embedded_offset, CORE_ADDR address,
+ const struct value *val)
{
- if (current_cp_abi.baseclass_offset == NULL)
- error (_("ABI doesn't define required function baseclass_offset"));
- return (*current_cp_abi.baseclass_offset) (type, index,
- valaddr, address);
+ volatile struct gdb_exception ex;
+ int res = 0;
+
+ gdb_assert (current_cp_abi.baseclass_offset != NULL);
+
+ TRY_CATCH (ex, RETURN_MASK_ERROR)
+ {
+ res = (*current_cp_abi.baseclass_offset) (type, index, valaddr,
+ embedded_offset,
+ address, val);
+ }
+
+ if (ex.reason < 0 && ex.error == NOT_AVAILABLE_ERROR)
+ throw_error (NOT_AVAILABLE_ERROR,
+ _("Cannot determine virtual baseclass offset "
+ "of incomplete object"));
+ else if (ex.reason < 0)
+ throw_exception (ex);
+ else
+ return res;
}
struct value *
int *top, int *using_enc)
{
struct type *ret = NULL;
- struct gdb_exception e;
+ volatile struct gdb_exception e;
if ((current_cp_abi.rtti_type) == NULL)
return NULL;
return (*current_cp_abi.method_ptr_to_value) (this_p, method_ptr);
}
+/* See cp-abi.h. */
+
+void
+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);
+}
+
int
cp_pass_by_reference (struct type *type)
{
{
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;
static void
list_cp_abis (int from_tty)
{
+ struct ui_out *uiout = current_uiout;
struct cleanup *cleanup_chain;
int i;
static void
show_cp_abi_cmd (char *args, int from_tty)
{
+ struct ui_out *uiout = current_uiout;
+
ui_out_text (uiout, "The currently selected C++ ABI is \"");
ui_out_field_string (uiout, "cp-abi", current_cp_abi.shortname);