X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fgnu-v2-abi.c;h=9f7dd0ac12f076e7afe592ece43a8e068da778fe;hb=2106ed9baf1098a5d76469ecde30813065c46c68;hp=5e55b6730cf7539779bf59e4f7574ce8fe48f342;hpb=6d3d12ebef6fa7dd6bc8c34fbc5e440ac8d0a8c6;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gnu-v2-abi.c b/gdb/gnu-v2-abi.c index 5e55b6730c..9f7dd0ac12 100644 --- a/gdb/gnu-v2-abi.c +++ b/gdb/gnu-v2-abi.c @@ -1,6 +1,6 @@ /* Abstraction of GNU v2 abi. - Copyright (C) 2001-2014 Free Software Foundation, Inc. + Copyright (C) 2001-2020 Free Software Foundation, Inc. Contributed by Daniel Berlin @@ -27,8 +27,6 @@ #include "gdb-demangle.h" #include "cp-abi.h" #include "cp-support.h" -#include "exceptions.h" - #include struct cp_abi_ops gnu_v2_abi_ops; @@ -39,10 +37,10 @@ static enum dtor_kinds gnuv2_is_destructor_name (const char *name) { if ((name[0] == '_' && is_cplus_marker (name[1]) && name[2] == '_') - || strncmp (name, "__dt__", 6) == 0) + || startswith (name, "__dt__")) return complete_object_dtor; else - return 0; + return (enum dtor_kinds) 0; } static enum ctor_kinds @@ -50,10 +48,10 @@ gnuv2_is_constructor_name (const char *name) { if ((name[0] == '_' && name[1] == '_' && (isdigit (name[2]) || strchr ("Qt", name[2]))) - || strncmp (name, "__ct__", 6) == 0) + || startswith (name, "__ct__")) return complete_object_ctor; else - return 0; + return (enum ctor_kinds) 0; } static int @@ -70,7 +68,7 @@ gnuv2_is_vtable_name (const char *name) static int gnuv2_is_operator_name (const char *name) { - return strncmp (name, "operator", 8) == 0; + return startswith (name, CP_OPERATOR_STR); } @@ -134,8 +132,8 @@ gnuv2_virtual_fn_field (struct value **arg1p, struct fn_field * f, int j, /* With older versions of g++, the vtbl field pointed to an array of structures. Nowadays it points directly to the structure. */ - if (TYPE_CODE (value_type (vtbl)) == TYPE_CODE_PTR - && TYPE_CODE (TYPE_TARGET_TYPE (value_type (vtbl))) == TYPE_CODE_ARRAY) + if (value_type (vtbl)->code () == TYPE_CODE_PTR + && TYPE_TARGET_TYPE (value_type (vtbl))->code () == TYPE_CODE_ARRAY) { /* Handle the case where the vtbl field points to an array of structures. */ @@ -157,7 +155,7 @@ gnuv2_virtual_fn_field (struct value **arg1p, struct fn_field * f, int j, entry_type = check_typedef (value_type (entry)); - if (TYPE_CODE (entry_type) == TYPE_CODE_STRUCT) + if (entry_type->code () == TYPE_CODE_STRUCT) { /* Move the `this' pointer according to the virtual function table. */ set_value_offset (arg1, value_offset (arg1) @@ -171,7 +169,7 @@ gnuv2_virtual_fn_field (struct value **arg1p, struct fn_field * f, int j, vfn = value_field (entry, 2); } - else if (TYPE_CODE (entry_type) == TYPE_CODE_PTR) + else if (entry_type->code () == TYPE_CODE_PTR) vfn = entry; else error (_("I'm confused: virtual function table has bad type")); @@ -185,7 +183,7 @@ gnuv2_virtual_fn_field (struct value **arg1p, struct fn_field * f, int j, static struct type * -gnuv2_value_rtti_type (struct value *v, int *full, int *top, int *using_enc) +gnuv2_value_rtti_type (struct value *v, int *full, LONGEST *top, int *using_enc) { struct type *known_type; struct type *rtti_type; @@ -206,9 +204,9 @@ gnuv2_value_rtti_type (struct value *v, int *full, int *top, int *using_enc) /* Get declared type. */ known_type = value_type (v); - CHECK_TYPEDEF (known_type); + known_type = check_typedef (known_type); /* RTTI works only or class objects. */ - if (TYPE_CODE (known_type) != TYPE_CODE_CLASS) + if (known_type->code () != TYPE_CODE_STRUCT) return NULL; /* Plan on this changing in the future as i get around to setting @@ -227,7 +225,7 @@ gnuv2_value_rtti_type (struct value *v, int *full, int *top, int *using_enc) /* Make sure our basetype and known type match, otherwise, cast so we can get at the vtable properly. */ btype = known_type_vptr_basetype; - CHECK_TYPEDEF (btype); + btype = check_typedef (btype); if (btype != known_type ) { v = value_cast (btype, v); @@ -245,7 +243,7 @@ gnuv2_value_rtti_type (struct value *v, int *full, int *top, int *using_enc) /* Try to find a symbol that is the vtable. */ minsym=lookup_minimal_symbol_by_pc(vtbl); if (minsym.minsym==NULL - || (linkage_name=MSYMBOL_LINKAGE_NAME (minsym.minsym))==NULL + || (linkage_name=minsym.minsym->linkage_name ())==NULL || !is_vtable_name (linkage_name)) return NULL; @@ -314,9 +312,9 @@ vb_match (struct type *type, int index, struct type *basetype) /* It's a virtual baseclass pointer, now we just need to find out whether it is for this baseclass. */ - fieldtype = TYPE_FIELD_TYPE (type, index); + fieldtype = type->field (index).type (); if (fieldtype == NULL - || TYPE_CODE (fieldtype) != TYPE_CODE_PTR) + || fieldtype->code () != TYPE_CODE_PTR) /* "Can't happen". */ return 0; @@ -327,10 +325,10 @@ vb_match (struct type *type, int index, struct type *basetype) if (TYPE_TARGET_TYPE (fieldtype) == basetype) return 1; - if (TYPE_NAME (basetype) != NULL - && TYPE_NAME (TYPE_TARGET_TYPE (fieldtype)) != NULL - && strcmp (TYPE_NAME (basetype), - TYPE_NAME (TYPE_TARGET_TYPE (fieldtype))) == 0) + if (basetype->name () != NULL + && TYPE_TARGET_TYPE (fieldtype)->name () != NULL + && strcmp (basetype->name (), + TYPE_TARGET_TYPE (fieldtype)->name ()) == 0) return 1; return 0; } @@ -342,7 +340,7 @@ vb_match (struct type *type, int index, struct type *basetype) static int gnuv2_baseclass_offset (struct type *type, int index, - const bfd_byte *valaddr, int embedded_offset, + const bfd_byte *valaddr, LONGEST embedded_offset, CORE_ADDR address, const struct value *val) { struct type *basetype = TYPE_BASECLASS (type, index); @@ -350,7 +348,7 @@ gnuv2_baseclass_offset (struct type *type, int index, if (BASETYPE_VIA_VIRTUAL (type, index)) { /* Must hunt for the pointer to this virtual baseclass. */ - int i, len = TYPE_NFIELDS (type); + int i, len = type->num_fields (); int n_baseclasses = TYPE_N_BASECLASSES (type); /* First look for the virtual baseclass pointer @@ -360,11 +358,11 @@ gnuv2_baseclass_offset (struct type *type, int index, if (vb_match (type, i, basetype)) { struct type *field_type; - int field_offset; + LONGEST field_offset; int field_length; CORE_ADDR addr; - field_type = check_typedef (TYPE_FIELD_TYPE (type, i)); + field_type = check_typedef (type->field (i).type ()); field_offset = TYPE_FIELD_BITPOS (type, i) / 8; field_length = TYPE_LENGTH (field_type); @@ -415,10 +413,9 @@ init_gnuv2_ops (void) gnu_v2_abi_ops.baseclass_offset = gnuv2_baseclass_offset; } -extern initialize_file_ftype _initialize_gnu_v2_abi; /* -Wmissing-prototypes */ - +void _initialize_gnu_v2_abi (); void -_initialize_gnu_v2_abi (void) +_initialize_gnu_v2_abi () { init_gnuv2_ops (); register_cp_abi (&gnu_v2_abi_ops);