gdb/py: fix gdb.parameter('data-directory')
authorAndrew Burgess <andrew.burgess@embecosm.com>
Fri, 26 Mar 2021 17:14:26 +0000 (17:14 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Wed, 7 Apr 2021 10:14:26 +0000 (11:14 +0100)
commit79c024436b26a0de2f1b0ddc25f8987b4c9933b8
tree9e9f4445d57ce2e152e5da519b341ae68fde0572
parentb12389f219facfb4aa29b97fdcbc2664a5b0732a
gdb/py: fix gdb.parameter('data-directory')

It was reported on IRC that using gdb.parameter('data-directory')
doesn't work correctly.

The problem is that the data directory is stored in 'gdb_datadir',
however the set/show command is associated with a temporary
'staged_gdb_datadir'.

When the user does 'set data-directory VALUE', the VALUE is stored in
'staged_gdb_datadir' by GDB, then set_gdb_datadir is called.  This in
turn calls set_gdb_data_directory to copy the value from
staged_gdb_datadir into gdb_datadir.

However, set_gdb_data_directory will resolve relative paths, so the
value stored in gdb_datadir might not match the value in
staged_gdb_datadir.

The Python gdb.parameter API fetches the parameter values by accessing
the variable associated with the show command, so in this case
staged_gdb_datadir.  This causes two problems:

1. Initially staged_gdb_datadir is NULL, and remains as such until the
user does 'set data-directory VALUE' (which might never happen), but
gdb_datadir starts with GDB's default data-directory value.  So
initially from Python gdb.parameter('data-directory') will return the
empty string, even though at GDB's CLI 'show data-directory' prints a
real path.

2. If the user does 'set data-directory ./some/relative/path', GDB
will resolve the relative path, thus, 'show data-directory' at the CLI
will print an absolute path.  However, the value is staged_gdb_datadir
will still be the relative path, and gdb.parameter('data-directory')
from Python will return the relative path.

In this commit I fix both of these issues by:

1. Initialising the value in staged_gdb_datadir based on the initial
value in gdb_datadir, and

2. In set_gdb_datadir, after calling set_gdb_data_directory, I copy
the value in gdb_datadir back into staged_gdb_datadir.

With these two changes in place the value in staged_gdb_datadir should
always match the value in gdb_datadir, and accessing data-directory
from Python should now work correctly.

gdb/ChangeLog:

* top.c (staged_gdb_datadir): Update comment.
(set_gdb_datadir): Copy the value of gdb_datadir back into
staged_datadir.
(init_main): Initialise staged_gdb_datadir.

gdb/testsuite/ChangeLog:

* gdb.python/py-parameter.exp: Add test for reading data-directory
using gdb.parameter API.
gdb/ChangeLog
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-parameter.exp
gdb/top.c