diff options
author | Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> | 2021-03-16 19:36:39 +0100 |
---|---|---|
committer | Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> | 2021-03-22 09:18:04 +0100 |
commit | d171632faa9f563f47224e0f6214f8860ed7bcc4 (patch) | |
tree | 1a817528568a6d8840199f132491314996f1ae16 /gdbserver/dll.cc | |
parent | 2aaf2ce843e4078b158cdfb61435217621ba1803 (diff) | |
download | fsf-binutils-gdb-d171632faa9f563f47224e0f6214f8860ed7bcc4.zip fsf-binutils-gdb-d171632faa9f563f47224e0f6214f8860ed7bcc4.tar.gz fsf-binutils-gdb-d171632faa9f563f47224e0f6214f8860ed7bcc4.tar.bz2 |
gdbserver: convert the global dll list into a process_info field
The 'all_dlls' list is global. This would cause the complete dll list
to be reported for individual processes. Move the list into the
process_info struct.
Currently the dll list is used only by the win32-low target, which
does not support the multi-process feature. Therefore, it practically
does not matter whether the list is global or per-process. However,
there may be targets that are outside the binutils-gdb repo (e.g. we,
at Intel, have such a target) that have multi-process and use the dll
list. So, it makes sense to do the right thing.
gdbserver/ChangeLog:
2021-03-22 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
* inferiors.h (struct process_info) <all_dlls, dlls_changed>: New
fields.
* dll.h (loaded_dll)
(unloaded_dll): Declare an overloaded version that takes a proc
parameter.
* dll.cc (loaded_dll)
(unloaded_dll): Implement the overloaded versions.
(clear_dlls): Clear all process' dll lists.
(all_dlls, dlls_changed): Remove the global variables.
* remote-utils.cc (prepare_resume_reply): Update to consider a dll
list per proc.
* server.cc (handle_qxfer_libraries): Ditto.
(handle_v_attach): Ditto.
(captured_main): Ditto.
Diffstat (limited to 'gdbserver/dll.cc')
-rw-r--r-- | gdbserver/dll.cc | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/gdbserver/dll.cc b/gdbserver/dll.cc index cb9d91f..e86b0a2 100644 --- a/gdbserver/dll.cc +++ b/gdbserver/dll.cc @@ -23,23 +23,40 @@ /* An "unspecified" CORE_ADDR, for match_dll. */ #define UNSPECIFIED_CORE_ADDR (~(CORE_ADDR) 0) -std::list<dll_info> all_dlls; -int dlls_changed; - -/* Record a newly loaded DLL at BASE_ADDR. */ +/* Record a newly loaded DLL at BASE_ADDR for the current process. */ void loaded_dll (const char *name, CORE_ADDR base_addr) { - all_dlls.emplace_back (name != NULL ? name : "", base_addr); - dlls_changed = 1; + loaded_dll (current_process (), name, base_addr); +} + +/* Record a newly loaded DLL at BASE_ADDR for PROC. */ + +void +loaded_dll (process_info *proc, const char *name, CORE_ADDR base_addr) +{ + gdb_assert (proc != nullptr); + proc->all_dlls.emplace_back (name != nullptr ? name : "", base_addr); + proc->dlls_changed = true; } -/* Record that the DLL with NAME and BASE_ADDR has been unloaded. */ +/* Record that the DLL with NAME and BASE_ADDR has been unloaded + from the current process. */ void unloaded_dll (const char *name, CORE_ADDR base_addr) { + unloaded_dll (current_process (), name, base_addr); +} + +/* Record that the DLL with NAME and BASE_ADDR has been unloaded + from PROC. */ + +void +unloaded_dll (process_info *proc, const char *name, CORE_ADDR base_addr) +{ + gdb_assert (proc != nullptr); auto pred = [&] (const dll_info &dll) { if (base_addr != UNSPECIFIED_CORE_ADDR @@ -52,9 +69,10 @@ unloaded_dll (const char *name, CORE_ADDR base_addr) return false; }; - auto iter = std::find_if (all_dlls.begin (), all_dlls.end (), pred); + auto iter = std::find_if (proc->all_dlls.begin (), proc->all_dlls.end (), + pred); - if (iter == all_dlls.end ()) + if (iter == proc->all_dlls.end ()) /* For some inferiors we might get unloaded_dll events without having a corresponding loaded_dll. In that case, the dll cannot be found in ALL_DLL, and there is nothing further for us to do. @@ -68,13 +86,16 @@ unloaded_dll (const char *name, CORE_ADDR base_addr) { /* DLL has been found so remove the entry and free associated resources. */ - all_dlls.erase (iter); - dlls_changed = 1; + proc->all_dlls.erase (iter); + proc->dlls_changed = true; } } void clear_dlls (void) { - all_dlls.clear (); + for_each_process ([] (process_info *proc) + { + proc->all_dlls.clear (); + }); } |