gdb: revert "gdb: unify parts of the Linux and FreeBSD core dumping code"

This reverts commit 82a1fd3a49.

It was pointed out:

  https://sourceware.org/pipermail/gdb-patches/2021-February/175750.html

that commit 82a1fd3a49 caused GDB to have an unconditional
dependency on ELF specific parts of BFD.  What this means is that if
GDB and BFD are built for a non-elf target then there will be
undefined symbol references within GDB.

The right solution isn't immediately obvious.  So rather than rush a
fix in I'm reverting this commit for now, and will bring it back once
I have a good solution.

gdb/ChangeLog:

	* gcore.c (struct gcore_collect_regset_section_cb_data): Delete.
	(gcore_collect_regset_section_cb): Delete.
	(gcore_collect_thread_registers): Delete.
	(gcore_build_thread_register_notes): Delete.
	(gcore_find_signalled_thread): Delete.
	* gcore.h: Remove 'gdbsupport/gdb_signals.h' include and delete
	'gdbarch' and 'thread_info' declarations.
	(gcore_build_thread_register_notes): Delete declaration.
	(gcore_find_signalled_thread): Likewise.
	* fbsd-tdep.c: Remove 'gcore.h' include.
	(struct fbsd_collect_regset_section_cb_data): New struct.
	(fbsd_collect_regset_section_cb): New function.
	(fbsd_collect_thread_registers): New function.
	(struct fbsd_corefile_thread_data): New struct.
	(fbsd_corefile_thread): New function.
	(fbsd_make_corefile_notes): Call FreeBSD specific code.
	* linux-tdep.c: Remove 'gcore.h' include.
	(struct linux_collect_regset_section_cb_data): New struct.
	(linux_collect_regset_section_cb): New function.
	(linux_collect_thread_registers): New function.
	(linux_corefile_thread): Call Linux specific code.
	(find_signalled_thread): New function.
	(linux_make_corefile_notes): Call find_signalled_thread.
This commit is contained in:
Andrew Burgess 2021-02-09 21:41:30 +00:00
parent b61f78118a
commit 03642b7189
5 changed files with 288 additions and 170 deletions

View file

@ -32,7 +32,6 @@
#include "elf-bfd.h"
#include "fbsd-tdep.h"
#include "gcore.h"
/* This enum is derived from FreeBSD's <sys/signal.h>. */
@ -584,6 +583,129 @@ find_signalled_thread (struct thread_info *info, void *data)
return 0;
}
/* Structure for passing information from
fbsd_collect_thread_registers via an iterator to
fbsd_collect_regset_section_cb. */
struct fbsd_collect_regset_section_cb_data
{
fbsd_collect_regset_section_cb_data (const struct regcache *regcache,
bfd *obfd,
gdb::unique_xmalloc_ptr<char> &note_data,
int *note_size,
unsigned long lwp,
gdb_signal stop_signal)
: regcache (regcache),
obfd (obfd),
note_data (note_data),
note_size (note_size),
lwp (lwp),
stop_signal (stop_signal)
{}
const struct regcache *regcache;
bfd *obfd;
gdb::unique_xmalloc_ptr<char> &note_data;
int *note_size;
unsigned long lwp;
enum gdb_signal stop_signal;
bool abort_iteration = false;
};
static void
fbsd_collect_regset_section_cb (const char *sect_name, int supply_size,
int collect_size, const struct regset *regset,
const char *human_name, void *cb_data)
{
char *buf;
struct fbsd_collect_regset_section_cb_data *data
= (struct fbsd_collect_regset_section_cb_data *) cb_data;
if (data->abort_iteration)
return;
gdb_assert (regset->collect_regset);
buf = (char *) xmalloc (collect_size);
regset->collect_regset (regset, data->regcache, -1, buf, collect_size);
/* PRSTATUS still needs to be treated specially. */
if (strcmp (sect_name, ".reg") == 0)
data->note_data.reset (elfcore_write_prstatus
(data->obfd, data->note_data.release (),
data->note_size, data->lwp,
gdb_signal_to_host (data->stop_signal),
buf));
else
data->note_data.reset (elfcore_write_register_note
(data->obfd, data->note_data.release (),
data->note_size, sect_name, buf,
collect_size));
xfree (buf);
if (data->note_data == NULL)
data->abort_iteration = true;
}
/* Records the thread's register state for the corefile note
section. */
static void
fbsd_collect_thread_registers (const struct regcache *regcache,
ptid_t ptid, bfd *obfd,
gdb::unique_xmalloc_ptr<char> &note_data,
int *note_size,
enum gdb_signal stop_signal)
{
fbsd_collect_regset_section_cb_data data (regcache, obfd, note_data,
note_size, ptid.lwp (),
stop_signal);
gdbarch_iterate_over_regset_sections (regcache->arch (),
fbsd_collect_regset_section_cb,
&data, regcache);
}
struct fbsd_corefile_thread_data
{
fbsd_corefile_thread_data (struct gdbarch *gdbarch,
bfd *obfd,
gdb::unique_xmalloc_ptr<char> &note_data,
int *note_size,
gdb_signal stop_signal)
: gdbarch (gdbarch),
obfd (obfd),
note_data (note_data),
note_size (note_size),
stop_signal (stop_signal)
{}
struct gdbarch *gdbarch;
bfd *obfd;
gdb::unique_xmalloc_ptr<char> &note_data;
int *note_size;
enum gdb_signal stop_signal;
};
/* Records the thread's register state for the corefile note
section. */
static void
fbsd_corefile_thread (struct thread_info *info,
struct fbsd_corefile_thread_data *args)
{
struct regcache *regcache;
regcache = get_thread_arch_regcache (info->inf->process_target (),
info->ptid, args->gdbarch);
target_fetch_registers (regcache, -1);
fbsd_collect_thread_registers (regcache, info->ptid, args->obfd,
args->note_data, args->note_size,
args->stop_signal);
}
/* Return a byte_vector containing the contents of a core dump note
for the target object of type OBJECT. If STRUCTSIZE is non-zero,
the data is prefixed with a 32-bit integer size to match the format
@ -660,17 +782,16 @@ fbsd_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size)
signalled_thr = curr_thr;
}
gcore_build_thread_register_notes (gdbarch, signalled_thr,
signalled_thr->suspend.stop_signal,
obfd, &note_data, note_size);
fbsd_corefile_thread_data thread_args (gdbarch, obfd, note_data, note_size,
signalled_thr->suspend.stop_signal);
fbsd_corefile_thread (signalled_thr, &thread_args);
for (thread_info *thr : current_inferior ()->non_exited_threads ())
{
if (thr == signalled_thr)
continue;
gcore_build_thread_register_notes (gdbarch, thr,
signalled_thr->suspend.stop_signal,
obfd, &note_data, note_size);
fbsd_corefile_thread (thr, &thread_args);
}
/* Auxiliary vector. */