diff options
-rw-r--r-- | gdb/ChangeLog | 33 | ||||
-rw-r--r-- | gdb/NEWS | 4 | ||||
-rw-r--r-- | gdb/arch-utils.c | 7 | ||||
-rw-r--r-- | gdb/doc/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/doc/gdb.texinfo | 19 | ||||
-rw-r--r-- | gdb/features/gdb-target.dtd | 7 | ||||
-rw-r--r-- | gdb/features/mips-linux.xml | 1 | ||||
-rw-r--r-- | gdb/osabi.c | 38 | ||||
-rw-r--r-- | gdb/osabi.h | 4 | ||||
-rw-r--r-- | gdb/regformats/reg-i386-linux.dat | 1 | ||||
-rw-r--r-- | gdb/regformats/reg-x86-64-linux.dat | 1 | ||||
-rwxr-xr-x | gdb/regformats/regdat.sh | 20 | ||||
-rw-r--r-- | gdb/target-descriptions.c | 20 | ||||
-rw-r--r-- | gdb/target-descriptions.h | 6 | ||||
-rw-r--r-- | gdb/xml-tdesc.c | 21 |
15 files changed, 175 insertions, 13 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 28a37db..fccad0b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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. @@ -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, diff --git a/gdb/arch-utils.c b/gdb/arch-utils.c index 188dc9b..458aa06 100644 --- a/gdb/arch-utils.c +++ b/gdb/arch-utils.c @@ -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); diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 01fb199..c0279a7 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -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. diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 71ae4b5..c3693fa 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -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> diff --git a/gdb/features/gdb-target.dtd b/gdb/features/gdb-target.dtd index 2b195de..ff5d3d5 100644 --- a/gdb/features/gdb-target.dtd +++ b/gdb/features/gdb-target.dtd @@ -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> diff --git a/gdb/features/mips-linux.xml b/gdb/features/mips-linux.xml index 274f3d9..9772c82 100644 --- a/gdb/features/mips-linux.xml +++ b/gdb/features/mips-linux.xml @@ -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"/> diff --git a/gdb/osabi.c b/gdb/osabi.c index 778dedc..a8ecc8c 100644 --- a/gdb/osabi.c +++ b/gdb/osabi.c @@ -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; } diff --git a/gdb/osabi.h b/gdb/osabi.h index c1aa336..0b4a382 100644 --- a/gdb/osabi.h +++ b/gdb/osabi.h @@ -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 *); diff --git a/gdb/regformats/reg-i386-linux.dat b/gdb/regformats/reg-i386-linux.dat index 8ea3d11..33452ac 100644 --- a/gdb/regformats/reg-i386-linux.dat +++ b/gdb/regformats/reg-i386-linux.dat @@ -1,5 +1,6 @@ name:i386_linux xmlarch:i386 +osabi:GNU/Linux expedite:ebp,esp,eip 32:eax 32:ecx diff --git a/gdb/regformats/reg-x86-64-linux.dat b/gdb/regformats/reg-x86-64-linux.dat index 656f72a..6121db9 100644 --- a/gdb/regformats/reg-x86-64-linux.dat +++ b/gdb/regformats/reg-x86-64-linux.dat @@ -1,5 +1,6 @@ name:x86_64_linux xmlarch:i386:x86-64 +osabi:GNU/Linux expedite:rbp,rsp,rip 64:rax 64:rbx diff --git a/gdb/regformats/regdat.sh b/gdb/regformats/regdat.sh index e75beea..b04df7f 100755 --- a/gdb/regformats/regdat.sh +++ b/gdb/regformats/regdat.sh @@ -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 diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c index 741ea65..88cc7e0 100644 --- a/gdb/target-descriptions.c +++ b/gdb/target-descriptions.c @@ -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; +} + /* 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; +} static struct cmd_list_element *tdesc_set_cmdlist, *tdesc_show_cmdlist; diff --git a/gdb/target-descriptions.h b/gdb/target-descriptions.h index e6842d7..6553fc3 100644 --- a/gdb/target-descriptions.h +++ b/gdb/target-descriptions.h @@ -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); diff --git a/gdb/xml-tdesc.c b/gdb/xml-tdesc.c index 6987bee..5fd8a41 100644 --- a/gdb/xml-tdesc.c +++ b/gdb/xml-tdesc.c @@ -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 }, |