diff options
author | Andrew Burgess <andrew.burgess@embecosm.com> | 2021-02-09 21:41:30 +0000 |
---|---|---|
committer | Andrew Burgess <andrew.burgess@embecosm.com> | 2021-02-09 21:46:12 +0000 |
commit | 03642b7189bc0bfdf61354a6d9a3f3e46d82709c (patch) | |
tree | 4c18b49e25fceaab1b1a658fc868b55d61d4387f /gdb/gcore.c | |
parent | b61f78118a850a28a41a461fdaea4026ddc17658 (diff) | |
download | binutils-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.c | 136 |
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 () |