aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog12
-rw-r--r--gdb/target-descriptions.c61
-rw-r--r--gdbserver/ChangeLog6
-rw-r--r--gdbserver/tdesc.cc21
-rw-r--r--gdbsupport/ChangeLog9
-rw-r--r--gdbsupport/tdesc.cc6
-rw-r--r--gdbsupport/tdesc.h21
7 files changed, 126 insertions, 10 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 3e914eb..0784e82 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,17 @@
2020-06-23 Andrew Burgess <andrew.burgess@embecosm.com>
+ * 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 <andrew.burgess@embecosm.com>
+
* target-descriptions.c (print_c_tdesc::print_c_tdesc): Change
whitespace to underscore.
(maint_print_c_tdesc_cmd): Use fake filename for target
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index da6cb76..1937e7c 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 <compatible> 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<const bfd_arch_info *> compatible;
+ std::vector<tdesc_compatible_info_up> compatible;
/* Any architecture-specific properties specified by the target. */
std::vector<property> 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_up> &
+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<tdesc_compatible_info>
+ (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 c5c3b09..43b8bc8 100644
--- a/gdbserver/ChangeLog
+++ b/gdbserver/ChangeLog
@@ -1,3 +1,9 @@
+2020-06-23 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * 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 <tankut.baris.aktemur@intel.com>
Use std::list to stop pending signal instead of manually-created
diff --git a/gdbserver/tdesc.cc b/gdbserver/tdesc.cc
index 8d97def..d21688b 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_up> &
+tdesc_compatible_info_list (const target_desc *target_desc)
+{
+ static std::vector<tdesc_compatible_info_up> 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 7c2c4bf..2e5cbba 100644
--- a/gdbsupport/ChangeLog
+++ b/gdbsupport/ChangeLog
@@ -1,3 +1,12 @@
+2020-06-23 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * 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 <m.weghorn@posteo.de>
* common-utils.cc, common-utils.h (stringify_argv): Drop
diff --git a/gdbsupport/tdesc.cc b/gdbsupport/tdesc.cc
index aaea8e0..63f41cb 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, "<osabi>%s</osabi>", osabi);
+
+ const std::vector<tdesc_compatible_info_up> &compatible_list
+ = tdesc_compatible_info_list (e);
+ for (const auto &c : compatible_list)
+ string_appendf (*m_buffer, "<compatible>%s</compatible>\n",
+ tdesc_compatible_info_arch_name (c));
#endif
}
diff --git a/gdbsupport/tdesc.h b/gdbsupport/tdesc.h
index 3b1f1f5..0cdcf56 100644
--- a/gdbsupport/tdesc.h
+++ b/gdbsupport/tdesc.h
@@ -131,6 +131,27 @@ struct tdesc_reg : tdesc_element
typedef std::unique_ptr<tdesc_reg> 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> tdesc_compatible_info_up;
+
+/* Return a vector of compatibility information pointers from the target
+ description TARGET_DESC. */
+
+const std::vector<tdesc_compatible_info_up> &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. */