diff options
author | Simon Marchi <simon.marchi@efficios.com> | 2020-02-13 16:27:51 -0500 |
---|---|---|
committer | Simon Marchi <simon.marchi@efficios.com> | 2020-02-13 16:27:51 -0500 |
commit | feacfcacaac9f7e62f467a33c4ae54c56501ed18 (patch) | |
tree | 0e083366350e9fd279bec8c7b12413c90b9f255d /gdbserver/dll.cc | |
parent | 06b3c5bdb018262d7c09cda9d4637015c7ebe779 (diff) | |
download | gdb-feacfcacaac9f7e62f467a33c4ae54c56501ed18.zip gdb-feacfcacaac9f7e62f467a33c4ae54c56501ed18.tar.gz gdb-feacfcacaac9f7e62f467a33c4ae54c56501ed18.tar.bz2 |
gdbserver: rename source files to .cc
For the same reasons outlined in the previous patch, this patch renames
gdbserver source files to .cc.
I have moved the "-x c++" switch to only those rules that require it.
gdbserver/ChangeLog:
* Makefile.in: Rename source files from .c to .cc.
* %.c: Rename to %.cc.
* configure.ac: Rename server.c to server.cc.
* configure: Re-generate.
Diffstat (limited to 'gdbserver/dll.cc')
-rw-r--r-- | gdbserver/dll.cc | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/gdbserver/dll.cc b/gdbserver/dll.cc new file mode 100644 index 0000000..fdc7bec --- /dev/null +++ b/gdbserver/dll.cc @@ -0,0 +1,80 @@ +/* Copyright (C) 2002-2020 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include "server.h" +#include "dll.h" + +#include <algorithm> + +/* 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. */ + +void +loaded_dll (const char *name, CORE_ADDR base_addr) +{ + all_dlls.emplace_back (name != NULL ? name : "", base_addr); + dlls_changed = 1; +} + +/* Record that the DLL with NAME and BASE_ADDR has been unloaded. */ + +void +unloaded_dll (const char *name, CORE_ADDR base_addr) +{ + auto pred = [&] (const dll_info &dll) + { + if (base_addr != UNSPECIFIED_CORE_ADDR + && base_addr == dll.base_addr) + return true; + + if (name != NULL && dll.name == name) + return true; + + return false; + }; + + auto iter = std::find_if (all_dlls.begin (), all_dlls.end (), pred); + + if (iter == 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. + + This has been observed when running 32bit executables on Windows64 + (i.e. through WOW64, the interface between the 32bits and 64bits + worlds). In that case, the inferior always does some strange + unloading of unnamed dll. */ + return; + else + { + /* DLL has been found so remove the entry and free associated + resources. */ + all_dlls.erase (iter); + dlls_changed = 1; + } +} + +void +clear_dlls (void) +{ + all_dlls.clear (); +} |