X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fgnu-v3-abi.c;h=d630ec07b11175e8a4610bf79e88a5d5c569ad5b;hb=0d037fafed44c6704d0f15e8d49815caebcd7814;hp=f5d3d13a537c7e283409aa2360a94f9946b4e085;hpb=8090b426b57bd9ebfa4c593ba3e6f939b2911739;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c index f5d3d13a53..d630ec07b1 100644 --- a/gdb/gnu-v3-abi.c +++ b/gdb/gnu-v3-abi.c @@ -1,7 +1,7 @@ /* Abstraction of GNU v3 abi. Contributed by Jim Blandy - Copyright (C) 2001-2017 Free Software Foundation, Inc. + Copyright (C) 2001-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -28,6 +28,7 @@ #include "c-lang.h" #include "typeprint.h" #include +#include "cli/cli-style.h" static struct cp_abi_ops gnu_v3_abi_ops; @@ -161,10 +162,10 @@ build_gdb_vtable_type (struct gdbarch *arch) /* We assumed in the allocation above that there were four fields. */ gdb_assert (field == (field_list + 4)); - t = arch_type (arch, TYPE_CODE_STRUCT, offset, NULL); + t = arch_type (arch, TYPE_CODE_STRUCT, offset * TARGET_CHAR_BIT, NULL); TYPE_NFIELDS (t) = field - field_list; TYPE_FIELDS (t) = field_list; - TYPE_TAG_NAME (t) = "gdb_gnu_v3_abi_vtable"; + TYPE_NAME (t) = "gdb_gnu_v3_abi_vtable"; INIT_CPLUS_SPECIFIC (t); return make_type_with_address_space (t, TYPE_INSTANCE_FLAG_CODE_SPACE); @@ -299,8 +300,9 @@ gnuv3_rtti_type (struct value *value, LONGEST offset_to_top; const char *atsign; - /* We only have RTTI for class objects. */ - if (TYPE_CODE (values_type) != TYPE_CODE_STRUCT) + /* We only have RTTI for dynamic class objects. */ + if (TYPE_CODE (values_type) != TYPE_CODE_STRUCT + || !gnuv3_dynamic_class (values_type)) return NULL; /* Determine architecture. */ @@ -326,7 +328,7 @@ gnuv3_rtti_type (struct value *value, If we didn't like this approach, we could instead look in the type_info object itself to get the class name. But this way should work just as well, and doesn't read target memory. */ - vtable_symbol_name = MSYMBOL_DEMANGLED_NAME (vtable_symbol); + vtable_symbol_name = vtable_symbol->demangled_name (); if (vtable_symbol_name == NULL || !startswith (vtable_symbol_name, "vtable for ")) { @@ -391,7 +393,7 @@ gnuv3_get_virtual_fn (struct gdbarch *gdbarch, struct value *container, /* If this architecture uses function descriptors directly in the vtable, then the address of the vtable entry is actually a "function pointer" (i.e. points to the descriptor). We don't need to scale the index - by the size of a function descriptor; GCC does that before outputing + by the size of a function descriptor; GCC does that before outputting debug information. */ if (gdbarch_vtable_function_descriptors (gdbarch)) vfn = value_addr (vfn); @@ -676,7 +678,7 @@ gnuv3_make_method_ptr (struct type *type, gdb_byte *contents, { struct gdbarch *gdbarch = get_type_arch (type); int size = TYPE_LENGTH (builtin_type (gdbarch)->builtin_data_ptr); - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + enum bfd_endian byte_order = type_byte_order (type); /* FIXME drow/2006-12-24: The adjustment of "this" is currently always zero, since the method pointer is of the correct type. @@ -905,16 +907,16 @@ print_one_vtable (struct gdbarch *gdbarch, struct value *value, if (gdbarch_vtable_function_descriptors (gdbarch)) vfn = value_addr (vfn); - TRY + try { addr = value_as_address (vfn); } - CATCH (ex, RETURN_MASK_ERROR) + catch (const gdb_exception_error &ex) { - printf_filtered (_(""), ex.message); + fprintf_styled (gdb_stdout, metadata_style.style (), + _(""), ex.what ()); got_error = 1; } - END_CATCH if (!got_error) print_function_pointer_address (opts, gdbarch, addr, gdb_stdout); @@ -1024,10 +1026,10 @@ build_std_type_info_type (struct gdbarch *arch) gdb_assert (field == (field_list + 2)); - t = arch_type (arch, TYPE_CODE_STRUCT, offset, NULL); + t = arch_type (arch, TYPE_CODE_STRUCT, offset * TARGET_CHAR_BIT, NULL); TYPE_NFIELDS (t) = field - field_list; TYPE_FIELDS (t) = field_list; - TYPE_TAG_NAME (t) = "gdb_gnu_v3_type_info"; + TYPE_NAME (t) = "gdb_gnu_v3_type_info"; INIT_CPLUS_SPECIFIC (t); return t; @@ -1146,11 +1148,11 @@ gnuv3_get_typename_from_type_info (struct value *type_info_ptr) #define TYPEINFO_PREFIX "typeinfo for " #define TYPEINFO_PREFIX_LEN (sizeof (TYPEINFO_PREFIX) - 1) - symname = MSYMBOL_DEMANGLED_NAME (typeinfo_sym.minsym); + symname = typeinfo_sym.minsym->demangled_name (); if (symname == NULL || strncmp (symname, TYPEINFO_PREFIX, TYPEINFO_PREFIX_LEN)) error (_("typeinfo symbol '%s' has unexpected name"), - MSYMBOL_LINKAGE_NAME (typeinfo_sym.minsym)); + typeinfo_sym.minsym->linkage_name ()); class_name = symname + TYPEINFO_PREFIX_LEN; /* Strip off @plt and version suffixes. */ @@ -1200,7 +1202,7 @@ gnuv3_skip_trampoline (struct frame_info *frame, CORE_ADDR stop_pc) /* The symbol's demangled name should be something like "virtual thunk to FUNCTION", where FUNCTION is the name of the function being thunked to. */ - thunk_name = MSYMBOL_DEMANGLED_NAME (thunk_sym.minsym); + thunk_name = thunk_sym.minsym->demangled_name (); if (thunk_name == NULL || strstr (thunk_name, " thunk to ") == NULL) return 0; @@ -1216,7 +1218,7 @@ gnuv3_skip_trampoline (struct frame_info *frame, CORE_ADDR stop_pc) of the real function from the function descriptor before passing on the address to other layers of GDB. */ func_addr = gdbarch_convert_from_func_ptr_addr (gdbarch, method_stop_pc, - ¤t_target); + current_top_target ()); if (func_addr != 0) method_stop_pc = func_addr; @@ -1358,8 +1360,6 @@ init_gnuv3_ops (void) gnu_v3_abi_ops.pass_by_reference = gnuv3_pass_by_reference; } -extern initialize_file_ftype _initialize_gnu_v3_abi; /* -Wmissing-prototypes */ - void _initialize_gnu_v3_abi (void) {