diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 28a37db1e31..fccad0b66f0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,36 @@ +2009-07-20 Pedro Alves + + * 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) : 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 * configure.ac (AC_CHECK_FUNCS): Check for pipe. diff --git a/gdb/NEWS b/gdb/NEWS index 22757d92a6a..7dcc8fc7d3f 100644 --- 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, diff --git a/gdb/arch-utils.c b/gdb/arch-utils.c index 188dc9b6f77..458aa062190 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 01fb199aa33..c0279a7c376 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,9 @@ +2009-07-20 Pedro Alves + + * gdb.texinfo (Target Description Format): Mention the new + optional element. + (subsection OS ABI): New subsection. + 2009-07-14 Stan Shebs * gdb.texinfo (Tracepoint Conditions): New section. diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 71ae4b52194..c3693fae702 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. @r{[}@var{architecture}@r{]} + @r{[}@var{osabi}@r{]} @r{[}@var{feature}@dots{}@r{]} @end smallexample @@ -30860,6 +30862,21 @@ An @samp{} element has this form: accepted by @code{set architecture} (@pxref{Targets, ,Specifying a Debugging Target}). +@subsection OS ABI +@cindex @code{} + +This optional field was introduced in @value{GDBN} version 7.0. +Previous versions of @value{GDBN} ignore it. + +An @samp{} element has this form: + +@smallexample + @var{abi-name} +@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 diff --git a/gdb/features/gdb-target.dtd b/gdb/features/gdb-target.dtd index 2b195de04af..ff5d3d5b89b 100644 --- a/gdb/features/gdb-target.dtd +++ b/gdb/features/gdb-target.dtd @@ -6,12 +6,17 @@ - + + + + + diff --git a/gdb/features/mips-linux.xml b/gdb/features/mips-linux.xml index 274f3d9f511..9772c82b8d4 100644 --- a/gdb/features/mips-linux.xml +++ b/gdb/features/mips-linux.xml @@ -8,6 +8,7 @@ mips + GNU/Linux diff --git a/gdb/osabi.c b/gdb/osabi.c index 778dedcf4b6..a8ecc8c4823 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 c1aa33671e7..0b4a3826c71 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 8ea3d1167df..33452ac3f74 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 656f72aba67..6121db9844c 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 e75beea8dee..b04df7fb497 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="@${entry}" + 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} = \"@\\" + if test "${xmlarch}" != x; then + echo "${xmlarch}\\" + fi + if test "${xmlosabi}" != x; then + echo "${xmlosabi}\\" + fi + echo "\";" + fi else echo "const char *xmltarget_${name} = \"${xmltarget}\";" fi diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c index 741ea655b8a..88cc7e0442d 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 e6842d70c9b..6553fc3440a 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 6987beee71a..5fd8a412612 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 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 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 },