X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fcp-abi.c;h=14552d1e6d95309685eb13feb2a6ad72147ba7d5;hb=809df4465f01277ab689fb82b3f16ff79f9a2606;hp=6e200ff6385778f6673c37ad072db83a3ff5b6bf;hpb=9b254dd1ce46c19dde1dde5b8d1e22e862dfacce;p=binutils-gdb.git diff --git a/gdb/cp-abi.c b/gdb/cp-abi.c index 6e200ff6385..14552d1e6d9 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, 2002, 2003, 2005, 2006, 2007, 2008 + Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This file is part of GDB. @@ -22,6 +22,7 @@ #include "value.h" #include "cp-abi.h" #include "command.h" +#include "exceptions.h" #include "gdbcmd.h" #include "ui-out.h" @@ -89,9 +90,18 @@ value_virtual_fn_field (struct value **arg1p, struct fn_field *f, int j, struct type * value_rtti_type (struct value *v, int *full, int *top, int *using_enc) { + struct type *ret = NULL; + struct gdb_exception e; + if ((current_cp_abi.rtti_type) == NULL) return NULL; - return (*current_cp_abi.rtti_type) (v, full, top, using_enc); + TRY_CATCH (e, RETURN_MASK_ERROR) + { + ret = (*current_cp_abi.rtti_type) (v, full, top, using_enc); + } + if (e.reason < 0) + return NULL; + return ret; } void @@ -104,19 +114,20 @@ cplus_print_method_ptr (const gdb_byte *contents, struct type *type, } int -cplus_method_ptr_size (void) +cplus_method_ptr_size (struct type *to_type) { 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) (); + return (*current_cp_abi.method_ptr_size) (to_type); } void -cplus_make_method_ptr (gdb_byte *contents, CORE_ADDR value, int is_virtual) +cplus_make_method_ptr (struct type *type, 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); + (*current_cp_abi.make_method_ptr) (type, contents, value, is_virtual); } CORE_ADDR @@ -228,8 +239,8 @@ list_cp_abis (int from_tty) { struct cleanup *cleanup_chain; int i; - ui_out_text (uiout, "The available C++ ABIs are:\n"); + ui_out_text (uiout, "The available C++ ABIs are:\n"); cleanup_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "cp-abi-list"); for (i = 0; i < num_cp_abis; i++) {