X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Ftdesc.c;h=04c702fa033651a83c8c438ce5d156ac36eb9371;hb=6dc0ebde59dfb73eae507ced718bafa54023bf33;hp=5ea234145f633fbcc7da025c668de01182c2ca36;hpb=d4a0e8b57d6f85e4ee4a31e0e6929ff5b4fd9823;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/tdesc.c b/gdb/gdbserver/tdesc.c index 5ea234145f..04c702fa03 100644 --- a/gdb/gdbserver/tdesc.c +++ b/gdb/gdbserver/tdesc.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2012-2017 Free Software Foundation, Inc. +/* Copyright (C) 2012-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -19,22 +19,78 @@ #include "tdesc.h" #include "regdef.h" -void -init_target_desc (struct target_desc *tdesc) +#ifndef IN_PROCESS_AGENT + +target_desc::~target_desc () { - int offset = 0; + xfree ((char *) arch); + xfree ((char *) osabi); +} + +bool target_desc::operator== (const target_desc &other) const +{ + if (reg_defs != other.reg_defs) + return false; - for (reg *reg : tdesc->reg_defs) + /* Compare expedite_regs. */ + int i = 0; + for (; expedite_regs[i] != NULL; i++) { - reg->offset = offset; - offset += reg->size; + if (strcmp (expedite_regs[i], other.expedite_regs[i]) != 0) + return false; } + if (other.expedite_regs[i] != NULL) + return false; + + return true; +} + +#endif + +void target_desc::accept (tdesc_element_visitor &v) const +{ +#ifndef IN_PROCESS_AGENT + v.visit_pre (this); + + for (const tdesc_feature_up &feature : features) + feature->accept (v); + + v.visit_post (this); +#endif +} + +void +init_target_desc (struct target_desc *tdesc, + const char **expedite_regs) +{ + int offset = 0; + + /* Go through all the features and populate reg_defs. */ + for (const tdesc_feature_up &feature : tdesc->features) + for (const tdesc_reg_up &treg : feature->registers) + { + int regnum = treg->target_regnum; + + /* Register number will increase (possibly with gaps) or be zero. */ + gdb_assert (regnum == 0 || regnum >= tdesc->reg_defs.size ()); + + if (regnum != 0) + tdesc->reg_defs.resize (regnum, reg (offset)); + + tdesc->reg_defs.emplace_back (treg->name.c_str (), offset, + treg->bitsize); + offset += treg->bitsize; + } tdesc->registers_size = offset / 8; /* Make sure PBUFSIZ is large enough to hold a full register packet. */ gdb_assert (2 * tdesc->registers_size + 32 <= PBUFSIZ); + +#ifndef IN_PROCESS_AGENT + tdesc->expedite_regs = expedite_regs; +#endif } struct target_desc * @@ -66,7 +122,15 @@ current_target_desc (void) return current_process ()->tdesc; } -/* See arch/tdesc.h. */ +/* See common/tdesc.h. */ + +const char * +tdesc_architecture_name (const struct target_desc *target_desc) +{ + return target_desc->arch; +} + +/* See common/tdesc.h. */ void set_tdesc_architecture (struct target_desc *target_desc, @@ -75,7 +139,15 @@ set_tdesc_architecture (struct target_desc *target_desc, target_desc->arch = xstrdup (name); } -/* See arch/tdesc.h. */ +/* See common/tdesc.h. */ + +const char * +tdesc_osabi_name (const struct target_desc *target_desc) +{ + return target_desc->osabi; +} + +/* See common/tdesc.h. */ void set_tdesc_osabi (struct target_desc *target_desc, const char *name) @@ -83,45 +155,21 @@ set_tdesc_osabi (struct target_desc *target_desc, const char *name) target_desc->osabi = xstrdup (name); } -/* Return a string which is of XML format, including XML target - description to be sent to GDB. */ +/* See common/tdesc.h. */ const char * -tdesc_get_features_xml (target_desc *tdesc) +tdesc_get_features_xml (const target_desc *tdesc) { /* Either .xmltarget or .features is not NULL. */ gdb_assert (tdesc->xmltarget != NULL - || (tdesc->features != NULL + || (!tdesc->features.empty () && tdesc->arch != NULL)); if (tdesc->xmltarget == NULL) { - std::string buffer ("@"); - - buffer += ""; - buffer += ""; - buffer += ""; - buffer += tdesc->arch; - buffer += ""; - - if (tdesc->osabi != nullptr) - { - buffer += ""; - buffer += tdesc->osabi; - buffer += ""; - } - - char *xml; - - for (int i = 0; VEC_iterate (char_ptr, tdesc->features, i, xml); i++) - { - buffer += ""; - } - - buffer += ""; - + std::string buffer ("@"); + print_xml_feature v (&buffer); + tdesc->accept (v); tdesc->xmltarget = xstrdup (buffer.c_str ()); } @@ -129,113 +177,12 @@ tdesc_get_features_xml (target_desc *tdesc) } #endif -struct tdesc_type -{}; - -/* See arch/tdesc.h. */ +/* See common/tdesc.h. */ struct tdesc_feature * -tdesc_create_feature (struct target_desc *tdesc, const char *name, - const char *xml) -{ -#ifndef IN_PROCESS_AGENT - VEC_safe_push (char_ptr, tdesc->features, xstrdup (xml)); -#endif - return tdesc; -} - -/* See arch/tdesc.h. */ - -tdesc_type_with_fields * -tdesc_create_flags (struct tdesc_feature *feature, const char *name, - int size) -{ - return NULL; -} - -/* See arch/tdesc.h. */ - -void -tdesc_add_flag (tdesc_type_with_fields *type, int start, - const char *flag_name) -{} - -/* See arch/tdesc.h. */ - -struct tdesc_type * -tdesc_named_type (const struct tdesc_feature *feature, const char *id) -{ - return NULL; -} - -/* See arch/tdesc.h. */ - -tdesc_type_with_fields * -tdesc_create_union (struct tdesc_feature *feature, const char *id) -{ - return NULL; -} - -/* See arch/tdesc.h. */ - -tdesc_type_with_fields * -tdesc_create_struct (struct tdesc_feature *feature, const char *id) -{ - return NULL; -} - -/* See arch/tdesc.h. */ - -void -tdesc_create_reg (struct tdesc_feature *feature, const char *name, - int regnum, int save_restore, const char *group, - int bitsize, const char *type) -{ - struct target_desc *tdesc = (struct target_desc *) feature; - - while (tdesc->reg_defs.size () < regnum) - { - struct reg *reg = XCNEW (struct reg); - - reg->name = ""; - reg->size = 0; - tdesc->reg_defs.push_back (reg); - } - - gdb_assert (regnum == 0 - || regnum == tdesc->reg_defs.size ()); - - struct reg *reg = XCNEW (struct reg); - - reg->name = name; - reg->size = bitsize; - tdesc->reg_defs.push_back (reg); -} - -/* See arch/tdesc.h. */ - -struct tdesc_type * -tdesc_create_vector (struct tdesc_feature *feature, const char *name, - struct tdesc_type *field_type, int count) -{ - return NULL; -} - -void -tdesc_add_bitfield (tdesc_type_with_fields *type, const char *field_name, - int start, int end) -{} - -/* See arch/tdesc.h. */ - -void -tdesc_add_field (tdesc_type_with_fields *type, const char *field_name, - struct tdesc_type *field_type) -{} - -/* See arch/tdesc.h. */ - -void -tdesc_set_struct_size (tdesc_type_with_fields *type, int size) +tdesc_create_feature (struct target_desc *tdesc, const char *name) { + struct tdesc_feature *new_feature = new tdesc_feature (name); + tdesc->features.emplace_back (new_feature); + return new_feature; }