2015-03-24 22:05:44 +08:00
|
|
|
/* Native-dependent code for GNU/Linux x86 (i386 and x86-64).
|
|
|
|
|
2018-01-01 12:43:02 +08:00
|
|
|
Copyright (C) 1999-2018 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/>. */
|
|
|
|
|
|
|
|
#include "common-defs.h"
|
|
|
|
#include "x86-linux.h"
|
2015-03-24 22:05:45 +08:00
|
|
|
#include "x86-linux-dregs.h"
|
2015-03-24 22:05:44 +08:00
|
|
|
|
|
|
|
/* Per-thread arch-specific data we want to keep. */
|
|
|
|
|
|
|
|
struct arch_lwp_info
|
|
|
|
{
|
|
|
|
/* Non-zero if our copy differs from what's recorded in the
|
|
|
|
thread. */
|
|
|
|
int debug_registers_changed;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* See nat/x86-linux.h. */
|
|
|
|
|
|
|
|
void
|
|
|
|
lwp_set_debug_registers_changed (struct lwp_info *lwp, int value)
|
|
|
|
{
|
|
|
|
if (lwp_arch_private_info (lwp) == NULL)
|
|
|
|
lwp_set_arch_private_info (lwp, XCNEW (struct arch_lwp_info));
|
|
|
|
|
|
|
|
lwp_arch_private_info (lwp)->debug_registers_changed = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* See nat/x86-linux.h. */
|
|
|
|
|
|
|
|
int
|
|
|
|
lwp_debug_registers_changed (struct lwp_info *lwp)
|
|
|
|
{
|
|
|
|
struct arch_lwp_info *info = lwp_arch_private_info (lwp);
|
|
|
|
|
|
|
|
/* NULL means either that this is the main thread still going
|
|
|
|
through the shell, or that no watchpoint has been set yet.
|
|
|
|
The debug registers are unchanged in either case. */
|
|
|
|
if (info == NULL)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
return info->debug_registers_changed;
|
|
|
|
}
|
2015-03-24 22:05:45 +08:00
|
|
|
|
|
|
|
/* See nat/x86-linux.h. */
|
|
|
|
|
|
|
|
void
|
|
|
|
x86_linux_new_thread (struct lwp_info *lwp)
|
|
|
|
{
|
|
|
|
lwp_set_debug_registers_changed (lwp, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* See nat/x86-linux.h. */
|
|
|
|
|
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
|
|
|
void
|
|
|
|
x86_linux_delete_thread (struct arch_lwp_info *arch_lwp)
|
|
|
|
{
|
|
|
|
xfree (arch_lwp);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* See nat/x86-linux.h. */
|
|
|
|
|
2015-03-24 22:05:45 +08:00
|
|
|
void
|
|
|
|
x86_linux_prepare_to_resume (struct lwp_info *lwp)
|
|
|
|
{
|
|
|
|
x86_linux_update_debug_registers (lwp);
|
|
|
|
}
|