/* 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"
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
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