summaryrefslogtreecommitdiff
path: root/gdb/gcore.c
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2021-02-09 21:41:30 +0000
committerAndrew Burgess <andrew.burgess@embecosm.com>2021-02-09 21:46:12 +0000
commit03642b7189bc0bfdf61354a6d9a3f3e46d82709c (patch)
tree4c18b49e25fceaab1b1a658fc868b55d61d4387f /gdb/gcore.c
parentb61f78118a850a28a41a461fdaea4026ddc17658 (diff)
downloadbinutils-gdb-03642b7189bc0bfdf61354a6d9a3f3e46d82709c.tar.gz
gdb: revert "gdb: unify parts of the Linux and FreeBSD core dumping code"
This reverts commit 82a1fd3a4935fe665cf08bc6820942c4a091184c. It was pointed out: https://sourceware.org/pipermail/gdb-patches/2021-February/175750.html that commit 82a1fd3a4935 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.
Diffstat (limited to 'gdb/gcore.c')
-rw-r--r--gdb/gcore.c136
1 files changed, 0 insertions, 136 deletions
diff --git a/gdb/gcore.c b/gdb/gcore.c
index d62aa3a7109..73ac6b09c70 100644
--- a/gdb/gcore.c
+++ b/gdb/gcore.c
@@ -579,142 +579,6 @@ gcore_memory_sections (bfd *obfd)
return 1;
}
-/* Structure for passing information from GCORE_COLLECT_THREAD_REGISTERS
- via an iterator to GCORE_COLLECT_REGSET_SECTION_CB. */
-
-struct gcore_collect_regset_section_cb_data
-{
- gcore_collect_regset_section_cb_data (struct gdbarch *gdbarch,
- const struct regcache *regcache,
- bfd *obfd, ptid_t ptid,
- gdb_signal stop_signal,
- gdb::unique_xmalloc_ptr<char> *note_data,
- int *note_size)
-
- : gdbarch (gdbarch), regcache (regcache), obfd (obfd),
- note_data (note_data), note_size (note_size),
- stop_signal (stop_signal)
- {
- /* The LWP is often not available for bare metal target, in which case
- use the tid instead. */
- if (ptid.lwp_p ())
- lwp = ptid.lwp ();
- else
- lwp = ptid.tid ();
- }
-
- struct gdbarch *gdbarch;
- 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;
-};
-
-/* Callback for ITERATE_OVER_REGSET_SECTIONS that records a single
- regset in the core file note section. */
-
-static void
-gcore_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)
-{
- struct gcore_collect_regset_section_cb_data *data
- = (struct gcore_collect_regset_section_cb_data *) cb_data;
- bool variable_size_section = (regset != NULL
- && regset->flags & REGSET_VARIABLE_SIZE);
-
- gdb_assert (variable_size_section || supply_size == collect_size);
-
- if (data->abort_iteration)
- return;
-
- gdb_assert (regset != nullptr && regset->collect_regset != nullptr);
-
- /* This is intentionally zero-initialized by using std::vector, so
- that any padding bytes in the core file will show as 0. */
- std::vector<gdb_byte> buf (collect_size);
-
- regset->collect_regset (regset, data->regcache, -1, buf.data (),
- 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.data ()));
- else
- data->note_data->reset (elfcore_write_register_note
- (data->obfd, data->note_data->release (),
- data->note_size, sect_name, buf.data (),
- collect_size));
-
- if (data->note_data == nullptr)
- data->abort_iteration = true;
-}
-
-/* Records the register state of thread PTID out of REGCACHE into the note
- buffer represented by *NOTE_DATA and NOTE_SIZE. OBFD is the bfd into
- which the core file is being created, and STOP_SIGNAL is the signal that
- cause thread PTID to stop. */
-
-static void
-gcore_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)
-{
- struct gdbarch *gdbarch = regcache->arch ();
- gcore_collect_regset_section_cb_data data (gdbarch, regcache, obfd, ptid,
- stop_signal, note_data,
- note_size);
- gdbarch_iterate_over_regset_sections (gdbarch,
- gcore_collect_regset_section_cb,
- &data, regcache);
-}
-
-/* See gcore.h. */
-
-void
-gcore_build_thread_register_notes
- (struct gdbarch *gdbarch, struct thread_info *info, gdb_signal stop_signal,
- bfd *obfd, gdb::unique_xmalloc_ptr<char> *note_data, int *note_size)
-{
- struct regcache *regcache
- = get_thread_arch_regcache (info->inf->process_target (),
- info->ptid, gdbarch);
- target_fetch_registers (regcache, -1);
- gcore_collect_thread_registers (regcache, info->ptid, obfd, note_data,
- note_size, stop_signal);
-}
-
-/* See gcore.h. */
-
-thread_info *
-gcore_find_signalled_thread ()
-{
- thread_info *curr_thr = inferior_thread ();
- if (curr_thr->state != THREAD_EXITED
- && curr_thr->suspend.stop_signal != GDB_SIGNAL_0)
- return curr_thr;
-
- for (thread_info *thr : current_inferior ()->non_exited_threads ())
- if (thr->suspend.stop_signal != GDB_SIGNAL_0)
- return thr;
-
- /* Default to the current thread, unless it has exited. */
- if (curr_thr->state != THREAD_EXITED)
- return curr_thr;
-
- return nullptr;
-}
-
void _initialize_gcore ();
void
_initialize_gcore ()