ChangeLog:
authorUlrich Weigand <uweigand@de.ibm.com>
Fri, 31 Jul 2009 14:39:12 +0000 (14:39 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Fri, 31 Jul 2009 14:39:12 +0000 (14:39 +0000)
* features/gdb-target.dtd (target): Accept optional
<compatible> elements.
(compatible): Define element.

* target-descriptions.h (tdesc_compatible_p): New.
(tdesc_add_compatible): New.
* target-descriptions.c (arch_p): New VEC_P type.
(struct target_desc): New member compatible.
(free_target_description): Handle it.
(maint_print_c_tdesc_cmd): Likewise.
(tdesc_compatible_p): New function.
(tdesc_add_compatible): New function.

* xml-tdesc.c (tdesc_end_compatible): New function.
(target_children): Handle <compatible> element.

* arch-utils.c (choose_architecture_for_target): Accept target
description instead of BFD architecture as input.  Query target
description for compatible architectures.
(gdbarch_info_fill): Update call.

* NEWS: Mention <compatible> element of target descriptions.

doc/ChangeLog:

* gdb.texinfo (Target Descriptions): Document <compatible> element.

gdb/ChangeLog
gdb/NEWS
gdb/arch-utils.c
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/features/gdb-target.dtd
gdb/target-descriptions.c
gdb/target-descriptions.h
gdb/xml-tdesc.c

index 05bddd2514c13a0ca9bd4a0e035a6e1083cd0e83..422b4add6bb574516c92f0a585fb63830ec730ee 100644 (file)
@@ -1,3 +1,28 @@
+2009-07-31  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * features/gdb-target.dtd (target): Accept optional
+       <compatible> elements.
+       (compatible): Define element.
+
+       * target-descriptions.h (tdesc_compatible_p): New.
+       (tdesc_add_compatible): New.
+       * target-descriptions.c (arch_p): New VEC_P type.
+       (struct target_desc): New member compatible.
+       (free_target_description): Handle it.
+       (maint_print_c_tdesc_cmd): Likewise.
+       (tdesc_compatible_p): New function.
+       (tdesc_add_compatible): New function.
+
+       * xml-tdesc.c (tdesc_end_compatible): New function.
+       (target_children): Handle <compatible> element.
+
+       * arch-utils.c (choose_architecture_for_target): Accept target
+       description instead of BFD architecture as input.  Query target
+       description for compatible architectures.
+       (gdbarch_info_fill): Update call.
+
+       * NEWS: Mention <compatible> element of target descriptions.
+
 2009-07-31  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * breakpoint.c (remove_breakpoints): If removing one breakpoint
index 1e359a0c05c5decfcd919f1079f522ae0a1b3df2..eccc56f1fd174a52fd9c31c0999071d0a29b59d4 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -203,6 +203,12 @@ add new commands to existing prefixes, e.g. "target".
 "Target Description Format" section in the user manual for more
 information.
 
+* Target descriptions can now describe "compatible" architectures
+to indicate that the target can execute applications for a different
+architecture in addition to those for the main target architecture.
+See the "Target Description Format" section in the user manual for
+more information.
+
 * New commands (for set/show, see "New options" below)
 
 find [/size-char] [/max-count] start-address, end-address|+search-space-size,
index f075922bf04596d73c1351a1d7bac18ff1ef9bc5..5cf4afd4f4c47a05497e8ab44fb22d9ae69efeed 100644 (file)
@@ -320,15 +320,24 @@ set_endian (char *ignore_args, int from_tty, struct cmd_list_element *c)
 }
 
 /* Given SELECTED, a currently selected BFD architecture, and
-   FROM_TARGET, a BFD architecture reported by the target description,
-   return what architecture to use.  Either may be NULL; if both are
-   specified, we use the more specific.  If the two are obviously
-   incompatible, warn the user.  */
+   TARGET_DESC, the current target description, return what
+   architecture to use.
+
+   SELECTED may be NULL, in which case we return the architecture
+   associated with TARGET_DESC.  If SELECTED specifies a variant
+   of the architecture associtated with TARGET_DESC, return the
+   more specific of the two.
+
+   If SELECTED is a different architecture, but it is accepted as
+   compatible by the target, we can use the target architecture.
+
+   If SELECTED is obviously incompatible, warn the user.  */
 
 static const struct bfd_arch_info *
-choose_architecture_for_target (const struct bfd_arch_info *selected,
-                               const struct bfd_arch_info *from_target)
+choose_architecture_for_target (const struct target_desc *target_desc,
+                               const struct bfd_arch_info *selected)
 {
+  const struct bfd_arch_info *from_target = tdesc_architecture (target_desc);
   const struct bfd_arch_info *compat1, *compat2;
 
   if (selected == NULL)
@@ -358,6 +367,11 @@ choose_architecture_for_target (const struct bfd_arch_info *selected,
 
   if (compat1 == NULL && compat2 == NULL)
     {
+      /* BFD considers the architectures incompatible.  Check our target
+        description whether it accepts SELECTED as compatible anyway.  */
+      if (tdesc_compatible_p (target_desc, selected))
+       return from_target;
+
       warning (_("Selected architecture %s is not compatible "
                 "with reported target architecture %s"),
               selected->printable_name, from_target->printable_name);
@@ -685,7 +699,7 @@ gdbarch_info_fill (struct gdbarch_info *info)
   /* From the target.  */
   if (info->target_desc != NULL)
     info->bfd_arch_info = choose_architecture_for_target
-      (info->bfd_arch_info, tdesc_architecture (info->target_desc));
+                          (info->target_desc, info->bfd_arch_info);
   /* From the default.  */
   if (info->bfd_arch_info == NULL)
     info->bfd_arch_info = default_bfd_arch;
index a544bc1f8fe8c277c3f1a3ad90e9e9855d1180f7..7afbca0479d3375fa8e5f604197876ec9a0d1868 100644 (file)
@@ -1,3 +1,7 @@
+2009-07-31  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * gdb.texinfo (Target Descriptions): Document <compatible> element.
+
 2009-07-28  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * gdb.texinfo (ARM Features): Document org.gnu.gdb.arm.vfp and
index 3bb35b60117fe8860ae2af49b992072191fefd1f..586f4598ba56125aef3e66b24ec29f32c2942e4b 100644 (file)
@@ -30807,6 +30807,7 @@ are explained further below.
 <target version="1.0">
   @r{[}@var{architecture}@r{]}
   @r{[}@var{osabi}@r{]}
+  @r{[}@var{compatible}@r{]}
   @r{[}@var{feature}@dots{}@r{]}
 </target>
 @end smallexample
@@ -30858,9 +30859,8 @@ An @samp{<architecture>} element has this form:
   <architecture>@var{arch}</architecture>
 @end smallexample
 
-@var{arch} is an architecture name from the same selection
-accepted by @code{set architecture} (@pxref{Targets, ,Specifying a
-Debugging Target}).
+@var{arch} is one of the architectures from the set accepted by
+@code{set architecture} (@pxref{Targets, ,Specifying a Debugging Target}).
 
 @subsection OS ABI
 @cindex @code{<osabi>}
@@ -30877,6 +30877,34 @@ An @samp{<osabi>} element has this form:
 @var{abi-name} is an OS ABI name from the same selection accepted by
 @w{@code{set osabi}} (@pxref{ABI, ,Configuring the Current ABI}).
 
+@subsection Compatible Architecture
+@cindex @code{<compatible>}
+
+This optional field was introduced in @value{GDBN} version 7.0.
+Previous versions of @value{GDBN} ignore it.
+
+A @samp{<compatible>} element has this form:
+
+@smallexample
+  <compatible>@var{arch}</compatible>
+@end smallexample
+
+@var{arch} is one of the architectures from the set accepted by
+@code{set architecture} (@pxref{Targets, ,Specifying a Debugging Target}).
+
+A @samp{<compatible>} element is used to specify that the target
+is able to run binaries in some other than the main target architecture
+given by the @samp{<architecture>} element.  For example, on the
+Cell Broadband Engine, the main architecture is @code{powerpc:common}
+or @code{powerpc:common64}, but the system is able to run binaries
+in the @code{spu} architecture as well.  The way to describe this
+capability with @samp{<compatible>} is as follows:
+
+@smallexample
+  <architecture>powerpc:common</architecture>
+  <compatible>spu</compatible>
+@end smallexample
+
 @subsection Features
 @cindex <feature>
 
index ff5d3d5b89b6f8fb9beb51dc69e05430213b39b9..d6e71092f8c08ced27e36ebc2ad387642068d55c 100644 (file)
@@ -6,10 +6,10 @@
 
 <!-- The root element of a GDB target description is <target>.  -->
 
-<!-- The osabi element was added post GDB 6.8.  The version wasn't
-     bumped, since older GDBs silently ignore unknown elements.  -->
+<!-- The osabi and compatible elements were added post GDB 6.8.  The version
+     wasn't bumped, since older GDBs silently ignore unknown elements.  -->
 
-<!ELEMENT target       (architecture?, osabi?, feature*)>
+<!ELEMENT target       (architecture?, osabi?, compatible*, feature*)>
 <!ATTLIST target
        version         CDATA   #FIXED "1.0">
 
@@ -17,6 +17,8 @@
 
 <!ELEMENT osabi        (#PCDATA)>
 
+<!ELEMENT compatible   (#PCDATA)>
+
 <!ELEMENT feature      ((vector | union)*, reg*)>
 <!ATTLIST feature
        name            ID      #REQUIRED>
index 024257b73400aff3f602fb64bd9a85b27ec69b60..b8bb48f6687a060bfeadad898ed878a0aa15614d 100644 (file)
@@ -158,6 +158,10 @@ typedef struct tdesc_feature
 } *tdesc_feature_p;
 DEF_VEC_P(tdesc_feature_p);
 
+/* A compatible architecture from a target description.  */
+typedef const struct bfd_arch_info *arch_p;
+DEF_VEC_P(arch_p);
+
 /* A target description.  */
 
 struct target_desc
@@ -169,6 +173,9 @@ struct target_desc
      otherwise.  */
   enum gdb_osabi osabi;
 
+  /* The list of compatible architectures reported by the target.  */
+  VEC(arch_p) *compatible;
+
   /* Any architecture-specific properties specified by the target.  */
   VEC(property_s) *properties;
 
@@ -326,6 +333,28 @@ target_current_description (void)
 
   return NULL;
 }
+
+/* Return non-zero if this target description is compatible
+   with the given BFD architecture.  */
+
+int
+tdesc_compatible_p (const struct target_desc *target_desc,
+                   const struct bfd_arch_info *arch)
+{
+  const struct bfd_arch_info *compat;
+  int ix;
+
+  for (ix = 0; VEC_iterate (arch_p, target_desc->compatible, ix, compat);
+       ix++)
+    {
+      if (compat == arch
+         || arch->compatible (arch, compat)
+         || compat->compatible (compat, arch))
+       return 1;
+    }
+
+  return 0;
+}
 \f
 
 /* Direct accessors for target descriptions.  */
@@ -1156,6 +1185,8 @@ free_target_description (void *arg)
     }
   VEC_free (property_s, target_desc->properties);
 
+  VEC_free (arch_p, target_desc->compatible);
+
   xfree (target_desc);
 }
 
@@ -1165,6 +1196,30 @@ make_cleanup_free_target_description (struct target_desc *target_desc)
   return make_cleanup (free_target_description, target_desc);
 }
 
+void
+tdesc_add_compatible (struct target_desc *target_desc,
+                     const struct bfd_arch_info *compatible)
+{
+  const struct bfd_arch_info *compat;
+  int ix;
+
+  /* If this instance of GDB is compiled without BFD support for the
+     compatible architecture, simply ignore it -- we would not be able
+     to handle it anyway.  */
+  if (compatible == NULL)
+    return;
+
+  for (ix = 0; VEC_iterate (arch_p, target_desc->compatible, ix, compat);
+       ix++)
+    if (compat == compatible)
+      internal_error (__FILE__, __LINE__,
+                     _("Attempted to add duplicate "
+                       "compatible architecture \"%s\""),
+                     compatible->printable_name);
+
+  VEC_safe_push (arch_p, target_desc->compatible, compatible);
+}
+
 void
 set_tdesc_property (struct target_desc *target_desc,
                    const char *key, const char *value)
@@ -1257,6 +1312,7 @@ static void
 maint_print_c_tdesc_cmd (char *args, int from_tty)
 {
   const struct target_desc *tdesc;
+  const struct bfd_arch_info *compatible;
   const char *filename, *inp;
   char *function, *outp;
   struct property *prop;
@@ -1313,6 +1369,16 @@ maint_print_c_tdesc_cmd (char *args, int from_tty)
       printf_unfiltered ("\n");
     }
 
+  for (ix = 0; VEC_iterate (arch_p, tdesc->compatible, ix, compatible);
+       ix++)
+    {
+      printf_unfiltered
+       ("  tdesc_add_compatible (result, bfd_scan_arch (\"%s\"));\n",
+        compatible->printable_name);
+    }
+  if (ix)
+    printf_unfiltered ("\n");
+
   for (ix = 0; VEC_iterate (property_s, tdesc->properties, ix, prop);
        ix++)
     {
index 899f1197e278c3ea1338857c3620966db19b4e19..3880260c6aa84c4a8648818ca668b942e1dcbee2 100644 (file)
@@ -134,6 +134,12 @@ const struct bfd_arch_info *tdesc_architecture
 
 enum gdb_osabi tdesc_osabi (const struct target_desc *);
 
+/* Return non-zero if this target description is compatible
+   with the given BFD architecture.  */
+
+int tdesc_compatible_p (const struct target_desc *,
+                       const struct bfd_arch_info *);
+
 /* Return the string value of a property named KEY, or NULL if the
    property was not specified.  */
 
@@ -186,6 +192,8 @@ void set_tdesc_architecture (struct target_desc *,
 void set_tdesc_osabi (struct target_desc *, enum gdb_osabi osabi);
 void set_tdesc_property (struct target_desc *,
                         const char *key, const char *value);
+void tdesc_add_compatible (struct target_desc *,
+                          const struct bfd_arch_info *);
 
 struct tdesc_feature *tdesc_create_feature (struct target_desc *tdesc,
                                            const char *name);
index 5fd8a412612d31d2c01eacf683ce62fb5a9db9d2..4fa78439bef061958de6b2fdca94a1b024fa2990 100644 (file)
@@ -124,6 +124,20 @@ tdesc_end_osabi (struct gdb_xml_parser *parser,
     set_tdesc_osabi (data->tdesc, osabi);
 }
 
+/* Handle the end of a <compatible> element and its value.  */
+
+static void
+tdesc_end_compatible (struct gdb_xml_parser *parser,
+                     const struct gdb_xml_element *element,
+                     void *user_data, const char *body_text)
+{
+  struct tdesc_parsing_data *data = user_data;
+  const struct bfd_arch_info *arch;
+
+  arch = bfd_scan_arch (body_text);
+  tdesc_add_compatible (data->tdesc, arch);
+}
+
 /* Handle the start of a <target> element.  */
 
 static void
@@ -334,6 +348,8 @@ static const struct gdb_xml_element target_children[] = {
     NULL, tdesc_end_arch },
   { "osabi", NULL, NULL, GDB_XML_EF_OPTIONAL,
     NULL, tdesc_end_osabi },
+  { "compatible", NULL, NULL, GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
+    NULL, tdesc_end_compatible },
   { "feature", feature_attributes, feature_children,
     GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
     tdesc_start_feature, NULL },