diff options
author | Pedro Alves <palves@redhat.com> | 2009-02-16 03:16:24 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2009-02-16 03:16:24 +0000 |
commit | 959b87241d85b42da82c45ecc4bc904895092730 (patch) | |
tree | 2907c74deb6dcb97ec313592635b253a0098f7a6 /gdb/corelow.c | |
parent | d0a63aa7a17ac9f0b3281c5f09f4ece637639141 (diff) | |
download | gdb-959b87241d85b42da82c45ecc4bc904895092730.zip gdb-959b87241d85b42da82c45ecc4bc904895092730.tar.gz gdb-959b87241d85b42da82c45ecc4bc904895092730.tar.bz2 |
* corelow.c (core_close): Don't hardcode the core's pid.
(core_open): Find core threads before calling
post_create_inferior.
(add_to_thread_list, get_core_register_section): Take into account
systems where the regset section names encode the pid of the
inferior.
* gdbarch.sh (core_reg_section_encodes_pid): New gdbarch setting.
* gdbarch.h, gdbarch.c: Regenerate.
* amd64-sol2-tdep.c (amd64_sol2_init_abi): Set it.
* i386-sol2-tdep.c (i386_sol2_init_abi): Set it.
* sparc-sol2-tdep.c (sparc32_sol2_init_abi): Set it.
* sparc64-sol2-tdep.c (sparc64_sol2_init_abi): Set it.
Diffstat (limited to 'gdb/corelow.c')
-rw-r--r-- | gdb/corelow.c | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/gdb/corelow.c b/gdb/corelow.c index 2d159b4..485e2c2 100644 --- a/gdb/corelow.c +++ b/gdb/corelow.c @@ -199,8 +199,9 @@ core_close (int quitting) if (core_bfd) { + int pid = ptid_get_pid (inferior_ptid); inferior_ptid = null_ptid; /* Avoid confusion from thread stuff */ - delete_inferior_silent (CORELOW_PID); + delete_inferior_silent (pid); /* Clear out solib state while the bfd is still open. See comments in clear_solib in solib.c. */ @@ -244,7 +245,15 @@ add_to_thread_list (bfd *abfd, asection *asect, void *reg_sect_arg) thread_id = atoi (bfd_section_name (abfd, asect) + 5); - ptid = ptid_build (ptid_get_pid (inferior_ptid), thread_id, 0); + if (core_gdbarch + && gdbarch_core_reg_section_encodes_pid (core_gdbarch)) + { + uint32_t merged_pid = thread_id; + ptid = ptid_build (merged_pid & 0xffff, + merged_pid >> 16, 0); + } + else + ptid = ptid_build (ptid_get_pid (inferior_ptid), thread_id, 0); if (ptid_get_lwp (inferior_ptid) == 0) /* The main thread has already been added before getting here, and @@ -374,16 +383,14 @@ core_open (char *filename, int from_tty) from ST to MT. */ add_thread_silent (inferior_ptid); - /* This is done first, before anything has a chance to query the - inferior for information such as symbols. */ - post_create_inferior (&core_ops, from_tty); - /* Build up thread list from BFD sections, and possibly set the current thread to the .reg/NN section matching the .reg section. */ bfd_map_over_sections (core_bfd, add_to_thread_list, bfd_get_section_by_name (core_bfd, ".reg")); + post_create_inferior (&core_ops, from_tty); + /* Now go through the target stack looking for threads since there may be a thread_stratum target loaded on top of target core by now. The layer above should claim threads found in the BFD @@ -453,7 +460,18 @@ get_core_register_section (struct regcache *regcache, char *contents; xfree (section_name); - if (ptid_get_lwp (inferior_ptid)) + + if (core_gdbarch + && gdbarch_core_reg_section_encodes_pid (core_gdbarch)) + { + uint32_t merged_pid; + + merged_pid = ptid_get_lwp (inferior_ptid); + merged_pid = merged_pid << 16 | ptid_get_pid (inferior_ptid); + + section_name = xstrprintf ("%s/%s", name, plongest (merged_pid)); + } + else if (ptid_get_lwp (inferior_ptid)) section_name = xstrprintf ("%s/%ld", name, ptid_get_lwp (inferior_ptid)); else section_name = xstrdup (name); |