2015-03-24 22:05:44 +08:00
|
|
|
/* Native-dependent code for GNU/Linux x86 (i386 and x86-64).
|
|
|
|
|
2019-01-01 14:01:51 +08:00
|
|
|
Copyright (C) 1999-2019 Free Software Foundation, Inc.
|
2015-03-24 22:05:44 +08:00
|
|
|
|
|
|
|
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/>. */
|
|
|
|
|
2019-01-28 03:51:36 +08:00
|
|
|
#ifndef NAT_X86_LINUX_H
|
|
|
|
#define NAT_X86_LINUX_H
|
2015-03-24 22:05:44 +08:00
|
|
|
|
|
|
|
#include "nat/linux-nat.h"
|
|
|
|
|
|
|
|
/* Set whether our local mirror of LWP's debug registers has been
|
|
|
|
changed since the values were last written to the thread. Nonzero
|
|
|
|
indicates that a change has been made, zero indicates no change. */
|
|
|
|
|
|
|
|
extern void lwp_set_debug_registers_changed (struct lwp_info *lwp,
|
|
|
|
int value);
|
|
|
|
|
|
|
|
/* Return nonzero if our local mirror of LWP's debug registers has
|
|
|
|
been changed since the values were last written to the thread,
|
|
|
|
zero otherwise. */
|
|
|
|
|
|
|
|
extern int lwp_debug_registers_changed (struct lwp_info *lwp);
|
|
|
|
|
2015-03-24 22:05:45 +08:00
|
|
|
/* Function to call when a new thread is detected. */
|
|
|
|
|
|
|
|
extern void x86_linux_new_thread (struct lwp_info *lwp);
|
|
|
|
|
lwp_info: Make the arch code free arch_lwp_info
I have the goal of "poisoning" the XNEW/xfree-family of functions, so
that we catch their usages with non-POD types. A few things need to be
fixed in the mean time, this is one.
The common lwp code in linux-nat.c and gdbserver/linux-low.c xfrees the
private lwp data of type arch_lwp_info. However, that type is opaque
from its point of view, as its defined differently in each arch-specific
implementation. This trips on the std::is_pod<T> check, since the
compiler can't tell whether the type is POD or not if it doesn't know
about it.
My initial patch [1] made a class hierarchy with a virtual destructor.
However, as Pedro pointed out, we only have one native architecture at
the time built in gdb and gdbserver, so that's overkill. Instead, we
can move the responsibility of free'ing arch_lwp_info to the arch code
(which is also the one that allocated it in the first place). This is
what this patch does.
Also, I had the concern that if we wanted to use C++ features in these
structures, we would have a problem with the one-definition rule.
However, since a build will only have one version of arch_lwp_info,
that's not a problem.
There are changes in arch-specific files, I was only able to built-test
this patch with the following cross-compilers:
aarch64-linux-gnu
alpha-linux-gnu
arm-linux-gnueabihf
hppa-linux-gnu
m68k-linux-gnu
mips64el-linux-gnuabi64
powerpc64-linux-gnu
s390x-linux-gnu
sh4-linux-gnu
sparc64-linux-gnu
x86_64-linux-gnu
x86_64-w64-mingw32
A buildbot run didn't find any regression.
[1] https://sourceware.org/ml/gdb-patches/2017-08/msg00255.html
gdb/ChangeLog:
* linux-nat.h (linux_nat_set_delete_thread): New declaration.
* linux-nat.c (linux_nat_delete_thread): New variable.
(lwp_free): Invoke linux_nat_delete_thread if set.
(linux_nat_set_delete_thread): New function.
* aarch64-linux-nat.c (_initialize_aarch64_linux_nat): Assign
thread delete callback.
* arm-linux-nat.c (arm_linux_delete_thread): New function.
(_initialize_arm_linux_nat): Assign thread delete callback.
* s390-linux-nat.c (s390_delete_thread): New function.
(_initialize_s390_nat): Assign thread delete callback.
* x86-linux-nat.c (x86_linux_add_target): Likewise.
* nat/aarch64-linux.c (aarch64_linux_delete_thread): New
function.
* nat/aarch64-linux.h (aarch64_linux_delete_thread): New
declaration.
* nat/x86-linux.c (x86_linux_delete_thread): New function.
* nat/x86-linux.h (x86_linux_delete_thread): New declaration.
gdb/gdbserver/ChangeLog:
* linux-aarch64-low.c (the_low_target): Add thread delete
callback.
* linux-arm-low.c (arm_delete_thread): New function.
(the_low_target): Add thread delete callback.
* linux-bfin-low.c (the_low_target): Likewise.
* linux-crisv32-low.c (the_low_target): Likewise.
* linux-low.c (delete_lwp): Invoke delete_thread callback if
set.
* linux-low.h (struct linux_target_ops) <delete_thread>: New
field.
* linux-m32r-low.c (the_low_target): Add thread delete callback.
* linux-mips-low.c (mips_linux_delete_thread): New function.
(the_low_target): Add thread delete callback.
* linux-ppc-low.c (the_low_target): Likewise.
* linux-s390-low.c (the_low_target): Likewise.
* linux-sh-low.c (the_low_target): Likewise.
* linux-tic6x-low.c (the_low_target): Likewise.
* linux-tile-low.c (the_low_target): Likewise.
* linux-x86-low.c (the_low_target): Likewise.
* linux-xtensa-low.c (the_low_target): Likewise.
2017-10-13 04:48:22 +08:00
|
|
|
/* Function to call when a thread is being deleted. */
|
|
|
|
|
|
|
|
extern void x86_linux_delete_thread (struct arch_lwp_info *arch_lwp);
|
|
|
|
|
2015-03-24 22:05:45 +08:00
|
|
|
/* Function to call prior to resuming a thread. */
|
|
|
|
|
|
|
|
extern void x86_linux_prepare_to_resume (struct lwp_info *lwp);
|
|
|
|
|
2019-01-28 03:51:36 +08:00
|
|
|
#endif /* NAT_X86_LINUX_H */
|