aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2020-06-09 19:00:55 +0100
committerAndrew Burgess <andrew.burgess@embecosm.com>2020-06-23 22:17:18 +0100
commit20821f4ed1c3b93344a8a40e9344fe356c2605c2 (patch)
tree16263c07fa21f32c878d88c10b8b2bf9370b588f
parent1fb5ee620365501977d0d6cd9d90c277c67c38e3 (diff)
downloadgdb-20821f4ed1c3b93344a8a40e9344fe356c2605c2.zip
gdb-20821f4ed1c3b93344a8a40e9344fe356c2605c2.tar.gz
gdb-20821f4ed1c3b93344a8a40e9344fe356c2605c2.tar.bz2
gdb: Allow target description to be dumped even when it is remote
The maintenance command 'maintenance print c-tdesc' can only print the target description if it was loaded from a local file, or if the local filename is passed to the maintenance command as an argument. Sometimes it would be nice to know what target description GDB was given by the remote, however, if I connect to a remote target and try this command I see this: (gdb) maintenance print c-tdesc The current target description did not come from an XML file. (gdb) Which is not very helpful. This commit changes things so that if the description came from the remote end then GDB will use a fake filename 'fetched from target' as the filename for the description, GDB will then create the C description of the target as though it came from this file. Example output would look like this (I snipped the feature creation from the middle as that hasn't changed): (gdb) maintenance print c-tdesc /* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: Original: fetched from target */ #include "defs.h" #include "osabi.h" #include "target-descriptions.h" struct target_desc *tdesc_fetched_from_target; static void initialize_tdesc_fetched_from_target (void) { struct target_desc *result = allocate_target_description (); struct tdesc_feature *feature; /* ... features created here ... */ tdesc_fetched_from_target = result; } (gdb) In order to support using 'fetched from target' I had to update the print_c_tdesc code to handle filenames that include a space. This has the benefit that we can now print out real files with spaces in the name, for example the file 'with space.xml': (gdb) maint print c-tdesc with space.xml I originally added this functionality so I could inspect the description passed to GDB by the remote target. After using this for a while I realised that actually having GDB recreate the XML would be even better, so a later commit will add that functionality too. Still, given how small this patch is I thought it might be nice to include this in GDB anyway. While I was working on this anyway I've added filename command completion to this command. gdb/ChangeLog: * target-descriptions.c (print_c_tdesc::print_c_tdesc): Change whitespace to underscore. (maint_print_c_tdesc_cmd): Use fake filename for target descriptions that came from the target. (_initialize_target_descriptions): Add filename command completion for 'maint print c-tdesc'.
-rw-r--r--gdb/ChangeLog9
-rw-r--r--gdb/target-descriptions.c11
2 files changed, 16 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 08e4d31..3e914eb 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,12 @@
+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
+ descriptions that came from the target.
+ (_initialize_target_descriptions): Add filename command completion
+ for 'maint print c-tdesc'.
+
2020-06-23 Simon Marchi <simon.marchi@efficios.com>
* dwarf2/loc.c (decode_debug_loclists_addresses): Add empty
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 20a3a64..da6cb76 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -1270,6 +1270,8 @@ public:
break;
else if (*inp == '-')
*outp++ = '_';
+ else if (*inp == ' ')
+ *outp++ = '_';
else
*outp++ = *inp;
*outp = '\0';
@@ -1680,7 +1682,7 @@ maint_print_c_tdesc_cmd (const char *args, int from_tty)
error (_("There is no target description to print."));
if (filename == NULL)
- error (_("The current target description did not come from an XML file."));
+ filename = "fetched from target";
std::string filename_after_features (filename);
auto loc = filename_after_features.rfind ("/features/");
@@ -1811,6 +1813,8 @@ void _initialize_target_descriptions ();
void
_initialize_target_descriptions ()
{
+ cmd_list_element *cmd;
+
tdesc_data = gdbarch_data_register_pre_init (tdesc_data_init);
add_basic_prefix_cmd ("tdesc", class_maintenance, _("\
@@ -1842,11 +1846,10 @@ Unset the file to read for an XML target description.\n\
When unset, GDB will read the description from the target."),
&tdesc_unset_cmdlist);
- add_cmd ("c-tdesc", class_maintenance, maint_print_c_tdesc_cmd, _("\
+ cmd = add_cmd ("c-tdesc", class_maintenance, maint_print_c_tdesc_cmd, _("\
Print the current target description as a C source file."),
&maintenanceprintlist);
-
- cmd_list_element *cmd;
+ set_cmd_completer (cmd, filename_completer);
cmd = add_cmd ("xml-descriptions", class_maintenance,
maintenance_check_xml_descriptions, _("\