#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 *
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);
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,