diff options
author | Simon Marchi <simon.marchi@efficios.com> | 2020-07-20 16:40:35 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@efficios.com> | 2020-08-05 15:40:20 -0400 |
commit | 2dd1cd011c097c6c754c2317fef678bd92efdf72 (patch) | |
tree | 226eb5f8f10e59d8f46727782ab469177ce6afd7 /gdb/target-float.h | |
parent | 7e17ef8ca40d21202fc79cf08726d5b475b175d8 (diff) | |
download | binutils-2dd1cd011c097c6c754c2317fef678bd92efdf72.zip binutils-2dd1cd011c097c6c754c2317fef678bd92efdf72.tar.gz binutils-2dd1cd011c097c6c754c2317fef678bd92efdf72.tar.bz2 |
gdb: pass target to thread_ptid_changed observable
I noticed what I think is a potential bug. I did not observe it nor was
I able to reproduce it using actual debugging. It's quite unlikely,
because it involves multi-target and ptid clashes. I added selftests
that demonstrate it though.
The thread_ptid_changed observer says that thread with OLD_PTID now has
NEW_PTID. Now, if for some reason we happen to have two targets
defining a thread with OLD_PTID, the observers don't know which thread
this is about.
regcache::regcache_thread_ptid_changed changes all regcaches with
OLD_PTID. If there is a regcache for a thread with ptid OLD_PTID, but
that belongs to a different target, this regcache will be erroneously
changed.
Similarly, infrun_thread_ptid_changed updates inferior_ptid if
inferior_ptid matches OLD_PTID. But if inferior_ptid currently refers
not to the thread is being changed, but to a thread with the same ptid
belonging to a different target, then inferior_ptid will erroneously be
changed.
This patch adds a `process_stratum_target *` parameter to the
`thread_ptid_changed` observable and makes the two observers use it.
Tests for both are added, which would fail if the corresponding fix
wasn't done.
gdb/ChangeLog:
* observable.h (thread_ptid_changed): Add parameter
`process_stratum_target *`.
* infrun.c (infrun_thread_ptid_changed): Add parameter
`process_stratum_target *` and use it.
(selftests): New namespace.
(infrun_thread_ptid_changed): New function.
(_initialize_infrun): Register selftest.
* regcache.c (regcache_thread_ptid_changed): Add parameter
`process_stratum_target *` and use it.
(regcache_thread_ptid_changed): New function.
(_initialize_regcache): Register selftest.
* thread.c (thread_change_ptid): Pass target to
thread_ptid_changed observable.
Change-Id: I0599e61224b6d154a7b55088a894cb88298c3c71
Diffstat (limited to 'gdb/target-float.h')
0 files changed, 0 insertions, 0 deletions