2009-07-20 Pedro Alves <pedro@codesourcery.com>
authorPedro Alves <palves@redhat.com>
Mon, 20 Jul 2009 18:51:42 +0000 (18:51 +0000)
committerPedro Alves <palves@redhat.com>
Mon, 20 Jul 2009 18:51:42 +0000 (18:51 +0000)
* features/gdb-target.dtd (target): Accept an optional 'osabi'
element.
(osabi): Define element.
* features/mips-linux.xml (target): Add an osabi subelement set to
GNU/Linux.
* regformats/regdat.sh (xmlarch, xmlosabi): New variables.  Don't
write the architecture into $xmltarget.  Store it in $xmlarch.
Handle the 'osabi' type.  Handle outputting the osabi element of
the target description.
* regformats/reg-x86-64-linux.dat (osabi): Set to GNU/Linux.
* regformats/reg-i386-linux.dat (osabi): Set to GNU/Linux.

* target-descriptions.h (tdesc_osabi, set_tdesc_osabi): Declare.
* target-descriptions.c (struct target_desc) <osabi>: New field.
(tdesc_osabi): New function.
(set_tdesc_osabi): New function.
* xml-tdesc.c: Include osabi.h.
(tdesc_end_osabi): New.
(target_children): Parse "osabi" elements.
* arch-utils.c (gdbarch_info_fill): Try to get the osabi from the
target description if the user didn't override it or it is not
extractable from the bfd.  If that still fails, fallback to the
configured in default.
* osabi.h (osabi_from_tdesc_string): Declare.
* osabi.c (osabi_from_tdesc_string): New.
(gdbarch_lookup_osabi): Return GDB_OSABI_UNKNOWN instead of
GDB_OSABI_DEFAULT.

* NEWS: Mention that target descriptions can now describe the
target OS ABI.

2009-07-20  Pedro Alves  <pedro@codesourcery.com>

* gdb.texinfo (Target Description Format): Mention the new <osabi>
optional element.
(subsection OS ABI): New subsection.

15 files changed:
gdb/ChangeLog
gdb/NEWS
gdb/arch-utils.c
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/features/gdb-target.dtd
gdb/features/mips-linux.xml
gdb/osabi.c
gdb/osabi.h
gdb/regformats/reg-i386-linux.dat
gdb/regformats/reg-x86-64-linux.dat
gdb/regformats/regdat.sh
gdb/target-descriptions.c
gdb/target-descriptions.h
gdb/xml-tdesc.c

index 28a37db1e31057df24ac2b350b3eacec0b972e91..fccad0b66f0e39977e77a329f97a7f9165b084ca 100644 (file)
@@ -1,3 +1,36 @@
+2009-07-20  Pedro Alves  <pedro@codesourcery.com>
+
+       * features/gdb-target.dtd (target): Accept an optional 'osabi'
+       element.
+       (osabi): Define element.
+       * features/mips-linux.xml (target): Add an osabi subelement set to
+       GNU/Linux.
+       * regformats/regdat.sh (xmlarch, xmlosabi): New variables.  Don't
+       write the architecture into $xmltarget.  Store it in $xmlarch.
+       Handle the 'osabi' type.  Handle outputting the osabi element of
+       the target description.
+       * regformats/reg-x86-64-linux.dat (osabi): Set to GNU/Linux.
+       * regformats/reg-i386-linux.dat (osabi): Set to GNU/Linux.
+
+       * target-descriptions.h (tdesc_osabi, set_tdesc_osabi): Declare.
+       * target-descriptions.c (struct target_desc) <osabi>: New field.
+       (tdesc_osabi): New function.
+       (set_tdesc_osabi): New function.
+       * xml-tdesc.c: Include osabi.h.
+       (tdesc_end_osabi): New.
+       (target_children): Parse "osabi" elements.
+       * arch-utils.c (gdbarch_info_fill): Try to get the osabi from the
+       target description if the user didn't override it or it is not
+       extractable from the bfd.  If that still fails, fallback to the
+       configured in default.
+       * osabi.h (osabi_from_tdesc_string): Declare.
+       * osabi.c (osabi_from_tdesc_string): New.
+       (gdbarch_lookup_osabi): Return GDB_OSABI_UNKNOWN instead of
+       GDB_OSABI_DEFAULT.
+
+       * NEWS: Mention that target descriptions can now describe the
+       target OS ABI.
+
 2009-07-20  Mike Frysinger  <vapier@gentoo.org>
 
        * configure.ac (AC_CHECK_FUNCS): Check for pipe.
index 22757d92a6a2be8af81c16a7a41f4087f9521ab8..7dcc8fc7d3fffdd9e63cf8093c175b3b0ddd7c7b 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -194,6 +194,10 @@ add new commands to existing prefixes, e.g. "target".
   visible changes; see "New commands" and also "Removed commands"
   below.
 
+* Target descriptions can now describe the target OS ABI.  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 188dc9b6f7766934845246e99b56d8a61de44d8d..458aa062190164c800858ecbd0e63cdc6b4d44d4 100644 (file)
@@ -710,8 +710,15 @@ gdbarch_info_fill (struct gdbarch_info *info)
   info->byte_order_for_code = info->byte_order;
 
   /* "(gdb) set osabi ...".  Handled by gdbarch_lookup_osabi.  */
+  /* From the manual override, or from file.  */
   if (info->osabi == GDB_OSABI_UNINITIALIZED)
     info->osabi = gdbarch_lookup_osabi (info->abfd);
+  /* From the target.  */
+  if (info->osabi == GDB_OSABI_UNKNOWN && info->target_desc != NULL)
+    info->osabi = tdesc_osabi (info->target_desc);
+  /* From the configured default.  */
+  if (info->osabi == GDB_OSABI_UNKNOWN)
+    info->osabi = GDB_OSABI_DEFAULT;
 
   /* Must have at least filled in the architecture.  */
   gdb_assert (info->bfd_arch_info != NULL);
index 01fb199aa33efa13cb8d1df3a1094a7c9b4b7622..c0279a7c376c9e69af8f116a6747d883cc73abee 100644 (file)
@@ -1,3 +1,9 @@
+2009-07-20  Pedro Alves  <pedro@codesourcery.com>
+
+       * gdb.texinfo (Target Description Format): Mention the new <osabi>
+       optional element.
+       (subsection OS ABI): New subsection.
+
 2009-07-14  Stan Shebs  <stan@codesourcery.com>
 
        * gdb.texinfo (Tracepoint Conditions): New section.
index 71ae4b52194b0200902fb89ecd483ec333e8b64c..c3693fae702632e5573ec385c068f09ce9f6446b 100644 (file)
@@ -30781,7 +30781,8 @@ their targets, we also describe the grammar here.
 
 Target descriptions can identify the architecture of the remote target
 and (for some architectures) provide information about custom register
-sets.  @value{GDBN} can use this information to autoconfigure for your
+sets.  They can also identify the OS ABI of the remote target.
+@value{GDBN} can use this information to autoconfigure for your
 target, or to warn you if you connect to an unsupported target.
 
 Here is a simple target description:
@@ -30805,6 +30806,7 @@ are explained further below.
 <!DOCTYPE target SYSTEM "gdb-target.dtd">
 <target version="1.0">
   @r{[}@var{architecture}@r{]}
+  @r{[}@var{osabi}@r{]}
   @r{[}@var{feature}@dots{}@r{]}
 </target>
 @end smallexample
@@ -30860,6 +30862,21 @@ An @samp{<architecture>} element has this form:
 accepted by @code{set architecture} (@pxref{Targets, ,Specifying a
 Debugging Target}).
 
+@subsection OS ABI
+@cindex @code{<osabi>}
+
+This optional field was introduced in @value{GDBN} version 7.0.
+Previous versions of @value{GDBN} ignore it.
+
+An @samp{<osabi>} element has this form:
+
+@smallexample
+  <osabi>@var{abi-name}</osabi>
+@end smallexample
+
+@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 Features
 @cindex <feature>
 
index 2b195de04af21a5732fc65a4554ec83fd630c136..ff5d3d5b89b6f8fb9beb51dc69e05430213b39b9 100644 (file)
@@ -6,12 +6,17 @@
 
 <!-- The root element of a GDB target description is <target>.  -->
 
-<!ELEMENT target       (architecture?, feature*)>
+<!-- The osabi element was added post GDB 6.8.  The version wasn't
+     bumped, since older GDBs silently ignore unknown elements.  -->
+
+<!ELEMENT target       (architecture?, osabi?, feature*)>
 <!ATTLIST target
        version         CDATA   #FIXED "1.0">
 
 <!ELEMENT architecture (#PCDATA)>
 
+<!ELEMENT osabi        (#PCDATA)>
+
 <!ELEMENT feature      ((vector | union)*, reg*)>
 <!ATTLIST feature
        name            ID      #REQUIRED>
index 274f3d9f511adafc01c76c416c0eb21b5af95dd8..9772c82b8d40cbbee4fa72e597c6874f80c34976 100644 (file)
@@ -8,6 +8,7 @@
 <!DOCTYPE target SYSTEM "gdb-target.dtd">
 <target>
   <architecture>mips</architecture>
+  <osabi>GNU/Linux</osabi>
   <xi:include href="mips-cpu.xml"/>
   <xi:include href="mips-cp0.xml"/>
   <xi:include href="mips-fpu.xml"/>
index 778dedcf4b6f502ba911cc5ea5b51926c02f3826..a8ecc8c48232bbdfb9f19e99bdb591a1868d076b 100644 (file)
@@ -87,6 +87,30 @@ gdbarch_osabi_name (enum gdb_osabi osabi)
   return gdb_osabi_names[GDB_OSABI_INVALID];
 }
 
+/* Lookup the OS ABI corresponding to the specified target description
+   string.  */
+
+enum gdb_osabi
+osabi_from_tdesc_string (const char *name)
+{
+  int i;
+
+  for (i = 0; i < ARRAY_SIZE (gdb_osabi_names); i++)
+    if (strcmp (name, gdb_osabi_names[i]) == 0)
+      {
+       /* See note above: the name table matches the indices assigned
+          to enum gdb_osabi.  */
+       enum gdb_osabi osabi = (enum gdb_osabi) i;
+
+       if (osabi == GDB_OSABI_INVALID)
+         return GDB_OSABI_UNKNOWN;
+       else
+         return osabi;
+      }
+
+  return GDB_OSABI_UNKNOWN;
+}
+
 /* Handler for a given architecture/OS ABI pair.  There should be only
    one handler for a given OS ABI each architecture family.  */
 struct gdb_osabi_handler  
@@ -205,10 +229,11 @@ gdbarch_lookup_osabi (bfd *abfd)
   if (user_osabi_state == osabi_user)
     return user_selected_osabi;
 
-  /* If we don't have a binary, return the default OS ABI (if set) or
-     unknown (otherwise).  */
+  /* If we don't have a binary, just return unknown.  The caller may
+     have other sources the OSABI can be extracted from, e.g., the
+     target description.  */
   if (abfd == NULL) 
-    return GDB_OSABI_DEFAULT;
+    return GDB_OSABI_UNKNOWN;
 
   match = GDB_OSABI_UNKNOWN;
   match_specific = 0;
@@ -269,12 +294,7 @@ gdbarch_lookup_osabi (bfd *abfd)
        }
     }
 
-  /* If we didn't find a match, but a default was specified at configure
-     time, return the default.  */
-  if (GDB_OSABI_DEFAULT != GDB_OSABI_UNKNOWN && match == GDB_OSABI_UNKNOWN)
-    return GDB_OSABI_DEFAULT;
-  else
-    return match;
+  return match;
 }
 
 
index c1aa33671e7eabfaa9d2e050f19514f5aabb53b1..0b4a3826c71b9e9c4926a871f2243a8f1cb06fff 100644 (file)
@@ -40,6 +40,10 @@ void gdbarch_register_osabi (enum bfd_architecture, unsigned long,
 /* Lookup the OS ABI corresponding to the specified BFD.  */
 enum gdb_osabi gdbarch_lookup_osabi (bfd *);
 
+/* Lookup the OS ABI corresponding to the specified target description
+   string.  */
+enum gdb_osabi osabi_from_tdesc_string (const char *text);
+
 /* Initialize the gdbarch for the specified OS ABI variant.  */
 void gdbarch_init_osabi (struct gdbarch_info, struct gdbarch *);
 
index 8ea3d1167df8f2a460e1abd51ca03f439ab68f13..33452ac3f74a461ea9fdc66d1003d745dcb83474 100644 (file)
@@ -1,5 +1,6 @@
 name:i386_linux
 xmlarch:i386
+osabi:GNU/Linux
 expedite:ebp,esp,eip
 32:eax
 32:ecx
index 656f72aba671b0997ac61e5fa8b2e18e094bf640..6121db9844c6b346efb5c4a8817ee836bdcfb708 100644 (file)
@@ -1,5 +1,6 @@
 name:x86_64_linux
 xmlarch:i386:x86-64
+osabi:GNU/Linux
 expedite:rbp,rsp,rip
 64:rax
 64:rbx
index e75beea8dee622295e885bc138d309e520e2cd1e..b04df7fb4976fc99f6d2200c9b3d5d54d50e2a38 100755 (executable)
@@ -128,6 +128,8 @@ offset=0
 i=0
 name=x
 xmltarget=x
+xmlarch=x
+xmlosabi=x
 expedite=x
 exec < $1
 while do_read
@@ -140,7 +142,10 @@ do
     xmltarget="${entry}"
     continue
   elif test "${type}" = "xmlarch"; then
-    xmltarget="@<target><architecture>${entry}</architecture></target>"
+    xmlarch="${entry}"
+    continue
+  elif test "${type}" = "osabi"; then
+    xmlosabi="${entry}"
     continue
   elif test "${type}" = "expedite"; then
     expedite="${entry}"
@@ -159,7 +164,18 @@ echo "};"
 echo
 echo "const char *expedite_regs_${name}[] = { \"`echo ${expedite} | sed 's/,/", "/g'`\", 0 };"
 if test "${xmltarget}" = x; then
-  echo "const char *xmltarget_${name} = 0;"
+  if test "${xmlarch}" = x && test "${xmlosabi}" = x; then
+    echo "const char *xmltarget_${name} = 0;"
+  else
+    echo "const char *xmltarget_${name} = \"@<target>\\"
+    if test "${xmlarch}" != x; then
+      echo "<architecture>${xmlarch}</architecture>\\"
+    fi
+    if test "${xmlosabi}" != x; then
+      echo "<osabi>${xmlosabi}</osabi>\\"
+    fi
+    echo "</target>\";"
+  fi
 else
   echo "const char *xmltarget_${name} = \"${xmltarget}\";"
 fi
index 741ea655b8ae60ed45a746f8ff0b0b72331f12c1..88cc7e0442d66fa7692ee2c94d5bca5c3b5a84f3 100644 (file)
@@ -165,6 +165,10 @@ struct target_desc
   /* The architecture reported by the target, if any.  */
   const struct bfd_arch_info *arch;
 
+  /* The osabi reported by the target, if any; GDB_OSABI_UNKNOWN
+     otherwise.  */
+  enum gdb_osabi osabi;
+
   /* Any architecture-specific properties specified by the target.  */
   VEC(property_s) *properties;
 
@@ -351,6 +355,16 @@ tdesc_architecture (const struct target_desc *target_desc)
 {
   return target_desc->arch;
 }
+
+/* Return the OSABI associated with this target description, or
+   GDB_OSABI_UNKNOWN if no osabi was specified.  */
+
+enum gdb_osabi
+tdesc_osabi (const struct target_desc *target_desc)
+{
+  return target_desc->osabi;
+}
+
 \f
 
 /* Return 1 if this target description includes any registers.  */
@@ -1161,6 +1175,12 @@ set_tdesc_architecture (struct target_desc *target_desc,
 {
   target_desc->arch = arch;
 }
+
+void
+set_tdesc_osabi (struct target_desc *target_desc, enum gdb_osabi osabi)
+{
+  target_desc->osabi = osabi;
+}
 \f
 
 static struct cmd_list_element *tdesc_set_cmdlist, *tdesc_show_cmdlist;
index e6842d70c9b9dcbfb409416097d626fd01d3e709..6553fc3440a077b41d25fa8eac1b37226847c1b7 100644 (file)
@@ -123,6 +123,11 @@ int tdesc_numbered_register_choices (const struct tdesc_feature *feature,
 const struct bfd_arch_info *tdesc_architecture
   (const struct target_desc *);
 
+/* Return the OSABI associated with this target description, or
+   GDB_OSABI_UNKNOWN if no osabi was specified.  */
+
+enum gdb_osabi tdesc_osabi (const struct target_desc *);
+
 /* Return the string value of a property named KEY, or NULL if the
    property was not specified.  */
 
@@ -167,6 +172,7 @@ struct target_desc *allocate_target_description (void);
 struct cleanup *make_cleanup_free_target_description (struct target_desc *);
 void set_tdesc_architecture (struct target_desc *,
                             const struct bfd_arch_info *);
+void set_tdesc_osabi (struct target_desc *, enum gdb_osabi osabi);
 void set_tdesc_property (struct target_desc *,
                         const char *key, const char *value);
 
index 6987beee71a3a47678ba29e6e5862fe5e73eb96e..5fd8a412612d31d2c01eacf683ce62fb5a9db9d2 100644 (file)
@@ -24,6 +24,7 @@
 #include "target-descriptions.h"
 #include "xml-support.h"
 #include "xml-tdesc.h"
+#include "osabi.h"
 
 #include "filenames.h"
 
@@ -105,6 +106,24 @@ tdesc_end_arch (struct gdb_xml_parser *parser,
   set_tdesc_architecture (data->tdesc, arch);
 }
 
+/* Handle the end of an <osabi> element and its value.  */
+
+static void
+tdesc_end_osabi (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;
+  enum gdb_osabi osabi;
+
+  osabi = osabi_from_tdesc_string (body_text);
+  if (osabi == GDB_OSABI_UNKNOWN)
+    warning (_("Target description specified unknown osabi \"%s\""),
+            body_text);
+  else
+    set_tdesc_osabi (data->tdesc, osabi);
+}
+
 /* Handle the start of a <target> element.  */
 
 static void
@@ -313,6 +332,8 @@ static const struct gdb_xml_attribute target_attributes[] = {
 static const struct gdb_xml_element target_children[] = {
   { "architecture", NULL, NULL, GDB_XML_EF_OPTIONAL,
     NULL, tdesc_end_arch },
+  { "osabi", NULL, NULL, GDB_XML_EF_OPTIONAL,
+    NULL, tdesc_end_osabi },
   { "feature", feature_attributes, feature_children,
     GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE,
     tdesc_start_feature, NULL },
This page took 0.050357 seconds and 4 git commands to generate.