diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3e914eb0d9..0784e823e2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +2020-06-23 Andrew Burgess + + * target-descriptions.c (class tdesc_compatible_info): New class. + (struct target_desc): Change type of compatible vector. + (tdesc_compatible_p): Update for change in type of + target_desc::compatible. + (tdesc_compatible_info_list): New function. + (tdesc_compatible_info_arch_name): New function. + (tdesc_add_compatible): Update for change in type of + target_desc::compatible. + (print_c_tdesc::visit_pre): Likewise. + 2020-06-23 Andrew Burgess * target-descriptions.c (print_c_tdesc::print_c_tdesc): Change diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c index da6cb76404..1937e7ca4a 100644 --- a/gdb/target-descriptions.c +++ b/gdb/target-descriptions.c @@ -308,6 +308,29 @@ make_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *ttype) return gdb_type.get_type (); } +/* Wrapper around bfd_arch_info_type. A class with this name is used in + the API that is shared between gdb and gdbserver code, but gdbserver + doesn't use compatibility information, so its version of this class is + empty. */ + +class tdesc_compatible_info +{ +public: + /* Constructor. */ + explicit tdesc_compatible_info (const bfd_arch_info_type *arch) + : m_arch (arch) + { /* Nothing. */ } + + /* Access the contained pointer. */ + const bfd_arch_info_type *arch () const + { return m_arch; } + +private: + /* Architecture information looked up from the entity within + a target description. */ + const bfd_arch_info_type *m_arch; +}; + /* A target description. */ struct target_desc : tdesc_element @@ -328,7 +351,7 @@ struct target_desc : tdesc_element enum gdb_osabi osabi = GDB_OSABI_UNKNOWN; /* The list of compatible architectures reported by the target. */ - std::vector compatible; + std::vector compatible; /* Any architecture-specific properties specified by the target. */ std::vector properties; @@ -598,11 +621,11 @@ int tdesc_compatible_p (const struct target_desc *target_desc, const struct bfd_arch_info *arch) { - for (const bfd_arch_info *compat : target_desc->compatible) + for (const tdesc_compatible_info_up &compat : target_desc->compatible) { - if (compat == arch - || arch->compatible (arch, compat) - || compat->compatible (compat, arch)) + if (compat->arch () == arch + || arch->compatible (arch, compat->arch ()) + || compat->arch ()->compatible (compat->arch (), arch)) return 1; } @@ -642,6 +665,22 @@ tdesc_architecture_name (const struct target_desc *target_desc) return target_desc->arch->printable_name; } +/* See gdbsupport/tdesc.h. */ + +const std::vector & +tdesc_compatible_info_list (const target_desc *target_desc) +{ + return target_desc->compatible; +} + +/* See gdbsupport/tdesc.h. */ + +const char * +tdesc_compatible_info_arch_name (const tdesc_compatible_info_up &compatible) +{ + return compatible->arch ()->printable_name; +} + /* Return the OSABI associated with this target description, or GDB_OSABI_UNKNOWN if no osabi was specified. */ @@ -1158,14 +1197,16 @@ tdesc_add_compatible (struct target_desc *target_desc, if (compatible == NULL) return; - for (const bfd_arch_info *compat : target_desc->compatible) - if (compat == compatible) + for (const tdesc_compatible_info_up &compat : target_desc->compatible) + if (compat->arch () == compatible) internal_error (__FILE__, __LINE__, _("Attempted to add duplicate " "compatible architecture \"%s\""), compatible->printable_name); - target_desc->compatible.push_back (compatible); + target_desc->compatible.push_back + (std::unique_ptr + (new tdesc_compatible_info (compatible))); } void @@ -1320,10 +1361,10 @@ public: printf_unfiltered ("\n"); } - for (const bfd_arch_info_type *compatible : e->compatible) + for (const tdesc_compatible_info_up &compatible : e->compatible) printf_unfiltered (" tdesc_add_compatible (result, bfd_scan_arch (\"%s\"));\n", - compatible->printable_name); + compatible->arch ()->printable_name); if (!e->compatible.empty ()) printf_unfiltered ("\n"); diff --git a/gdbserver/ChangeLog b/gdbserver/ChangeLog index c5c3b09841..43b8bc895d 100644 --- a/gdbserver/ChangeLog +++ b/gdbserver/ChangeLog @@ -1,3 +1,9 @@ +2020-06-23 Andrew Burgess + + * tdesc.cc (struct tdesc_compatible_info): New struct. + (tdesc_compatible_info_list): New function. + (tdesc_compatible_info_arch_name): New function. + 2020-06-22 Tankut Baris Aktemur Use std::list to stop pending signal instead of manually-created diff --git a/gdbserver/tdesc.cc b/gdbserver/tdesc.cc index 8d97defb9b..d21688b932 100644 --- a/gdbserver/tdesc.cc +++ b/gdbserver/tdesc.cc @@ -122,6 +122,27 @@ current_target_desc (void) return current_process ()->tdesc; } +/* An empty structure. */ + +struct tdesc_compatible_info { }; + +/* See gdbsupport/tdesc.h. */ + +const std::vector & +tdesc_compatible_info_list (const target_desc *target_desc) +{ + static std::vector empty; + return empty; +} + +/* See gdbsupport/tdesc.h. */ + +const char * +tdesc_compatible_info_arch_name (const tdesc_compatible_info_up &c_info) +{ + return nullptr; +} + /* See gdbsupport/tdesc.h. */ const char * diff --git a/gdbsupport/ChangeLog b/gdbsupport/ChangeLog index 7c2c4bff47..2e5cbba01c 100644 --- a/gdbsupport/ChangeLog +++ b/gdbsupport/ChangeLog @@ -1,3 +1,12 @@ +2020-06-23 Andrew Burgess + + * tdesc.cc (print_xml_feature::visit_pre): Print compatible + information. + * tdesc.h (struct tdesc_compatible_info): Declare new struct. + (tdesc_compatible_info_up): New typedef. + (tdesc_compatible_info_list): Declare new function. + (tdesc_compatible_info_arch_name): Declare new function. + 2020-05-25 Michael Weghorn * common-utils.cc, common-utils.h (stringify_argv): Drop diff --git a/gdbsupport/tdesc.cc b/gdbsupport/tdesc.cc index aaea8e0d8a..63f41cbf67 100644 --- a/gdbsupport/tdesc.cc +++ b/gdbsupport/tdesc.cc @@ -392,6 +392,12 @@ void print_xml_feature::visit_pre (const target_desc *e) const char *osabi = tdesc_osabi_name (e); if (osabi != nullptr) string_appendf (*m_buffer, "%s", osabi); + + const std::vector &compatible_list + = tdesc_compatible_info_list (e); + for (const auto &c : compatible_list) + string_appendf (*m_buffer, "%s\n", + tdesc_compatible_info_arch_name (c)); #endif } diff --git a/gdbsupport/tdesc.h b/gdbsupport/tdesc.h index 3b1f1f57ff..0cdcf56346 100644 --- a/gdbsupport/tdesc.h +++ b/gdbsupport/tdesc.h @@ -131,6 +131,27 @@ struct tdesc_reg : tdesc_element typedef std::unique_ptr tdesc_reg_up; +/* Declaration of a structure that holds information about one + "compatibility" entry within a target description. */ + +struct tdesc_compatible_info; + +/* A pointer to a single piece of compatibility information. */ + +typedef std::unique_ptr tdesc_compatible_info_up; + +/* Return a vector of compatibility information pointers from the target + description TARGET_DESC. */ + +const std::vector &tdesc_compatible_info_list + (const target_desc *target_desc); + +/* Return the architecture name from a compatibility information + COMPATIBLE. */ + +const char *tdesc_compatible_info_arch_name + (const tdesc_compatible_info_up &compatible); + enum tdesc_type_kind { /* Predefined types. */