From 959b87241d85b42da82c45ecc4bc904895092730 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Mon, 16 Feb 2009 03:16:24 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 17 +++++++++++++++++ gdb/amd64-sol2-tdep.c | 4 ++++ gdb/corelow.c | 32 +++++++++++++++++++++++++------- gdb/gdbarch.c | 23 +++++++++++++++++++++++ gdb/gdbarch.h | 11 ++++++++++- gdb/gdbarch.sh | 7 +++++++ gdb/i386-sol2-tdep.c | 4 ++++ gdb/sparc-sol2-tdep.c | 4 ++++ gdb/sparc64-sol2-tdep.c | 4 ++++ 9 files changed, 98 insertions(+), 8 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f36c9adcea6..71c1f6a0e98 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,20 @@ +2009-02-16 Pedro Alves + + * 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. + 2009-02-14 Vladimir Prus Include frame information for *stopped due to CLI commands. diff --git a/gdb/amd64-sol2-tdep.c b/gdb/amd64-sol2-tdep.c index f580de58f10..6b3b5d77c59 100644 --- a/gdb/amd64-sol2-tdep.c +++ b/gdb/amd64-sol2-tdep.c @@ -113,6 +113,10 @@ amd64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) set_gdbarch_skip_solib_resolver (gdbarch, sol2_skip_solib_resolver); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); + + /* Solaris encodes the pid of the inferior in regset section + names. */ + set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1); } diff --git a/gdb/corelow.c b/gdb/corelow.c index 2d159b4df6e..485e2c2eb0b 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); diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index b8e825825ae..1b4a6f4d31b 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -223,6 +223,7 @@ struct gdbarch gdbarch_register_reggroup_p_ftype *register_reggroup_p; gdbarch_fetch_pointer_argument_ftype *fetch_pointer_argument; gdbarch_regset_from_core_section_ftype *regset_from_core_section; + int core_reg_section_encodes_pid; struct core_regset_section * core_regset_sections; gdbarch_core_xfer_shared_libraries_ftype *core_xfer_shared_libraries; int vtable_function_descriptors; @@ -356,6 +357,7 @@ struct gdbarch startup_gdbarch = default_register_reggroup_p, /* register_reggroup_p */ 0, /* fetch_pointer_argument */ 0, /* regset_from_core_section */ + 0, /* core_reg_section_encodes_pid */ 0, /* core_regset_sections */ 0, /* core_xfer_shared_libraries */ 0, /* vtable_function_descriptors */ @@ -609,6 +611,7 @@ verify_gdbarch (struct gdbarch *gdbarch) /* Skip verify of register_reggroup_p, invalid_p == 0 */ /* Skip verify of fetch_pointer_argument, has predicate */ /* Skip verify of regset_from_core_section, has predicate */ + /* Skip verify of core_reg_section_encodes_pid, invalid_p == 0 */ /* Skip verify of core_xfer_shared_libraries, has predicate */ /* Skip verify of vtable_function_descriptors, invalid_p == 0 */ /* Skip verify of vbit_in_delta, invalid_p == 0 */ @@ -735,6 +738,9 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) fprintf_unfiltered (file, "gdbarch_dump: core_read_description = <%s>\n", host_address_to_string (gdbarch->core_read_description)); + fprintf_unfiltered (file, + "gdbarch_dump: core_reg_section_encodes_pid = %s\n", + plongest (gdbarch->core_reg_section_encodes_pid)); fprintf_unfiltered (file, "gdbarch_dump: core_regset_sections = %s\n", host_address_to_string (gdbarch->core_regset_sections)); @@ -2899,6 +2905,23 @@ set_gdbarch_regset_from_core_section (struct gdbarch *gdbarch, gdbarch->regset_from_core_section = regset_from_core_section; } +int +gdbarch_core_reg_section_encodes_pid (struct gdbarch *gdbarch) +{ + gdb_assert (gdbarch != NULL); + /* Skip verify of core_reg_section_encodes_pid, invalid_p == 0 */ + if (gdbarch_debug >= 2) + fprintf_unfiltered (gdb_stdlog, "gdbarch_core_reg_section_encodes_pid called\n"); + return gdbarch->core_reg_section_encodes_pid; +} + +void +set_gdbarch_core_reg_section_encodes_pid (struct gdbarch *gdbarch, + int core_reg_section_encodes_pid) +{ + gdbarch->core_reg_section_encodes_pid = core_reg_section_encodes_pid; +} + struct core_regset_section * gdbarch_core_regset_sections (struct gdbarch *gdbarch) { diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h index 4f6db30bc32..2774966d5d3 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -638,6 +638,15 @@ typedef const struct regset * (gdbarch_regset_from_core_section_ftype) (struct g extern const struct regset * gdbarch_regset_from_core_section (struct gdbarch *gdbarch, const char *sect_name, size_t sect_size); extern void set_gdbarch_regset_from_core_section (struct gdbarch *gdbarch, gdbarch_regset_from_core_section_ftype *regset_from_core_section); +/* When creating core dumps, some systems encode the PID in addition + to the LWP id in core file register section names. In those cases, the + "XXX" in ".reg/XXX" is encoded as [LWPID << 16 | PID]. This setting + is set to true for such architectures; false if "XXX" represents an LWP + or thread id with no special encoding. */ + +extern int gdbarch_core_reg_section_encodes_pid (struct gdbarch *gdbarch); +extern void set_gdbarch_core_reg_section_encodes_pid (struct gdbarch *gdbarch, int core_reg_section_encodes_pid); + /* Supported register notes in a core file. */ extern struct core_regset_section * gdbarch_core_regset_sections (struct gdbarch *gdbarch); @@ -804,7 +813,7 @@ extern int gdbarch_target_signal_to_host (struct gdbarch *gdbarch, enum target_s extern void set_gdbarch_target_signal_to_host (struct gdbarch *gdbarch, gdbarch_target_signal_to_host_ftype *target_signal_to_host); /* Extra signal info inspection. - + Return a type suitable to inspect extra signal information. */ extern int gdbarch_get_siginfo_type_p (struct gdbarch *gdbarch); diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index bcca6c937d9..ac20d4bf25d 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -600,6 +600,13 @@ F:CORE_ADDR:fetch_pointer_argument:struct frame_info *frame, int argi, struct ty # name SECT_NAME and size SECT_SIZE. M:const struct regset *:regset_from_core_section:const char *sect_name, size_t sect_size:sect_name, sect_size +# When creating core dumps, some systems encode the PID in addition +# to the LWP id in core file register section names. In those cases, the +# "XXX" in ".reg/XXX" is encoded as [LWPID << 16 | PID]. This setting +# is set to true for such architectures; false if "XXX" represents an LWP +# or thread id with no special encoding. +v:int:core_reg_section_encodes_pid:::0:0::0 + # Supported register notes in a core file. v:struct core_regset_section *:core_regset_sections:const char *name, int len::::::host_address_to_string (gdbarch->core_regset_sections) diff --git a/gdb/i386-sol2-tdep.c b/gdb/i386-sol2-tdep.c index c30cd6da928..f9666f1f939 100644 --- a/gdb/i386-sol2-tdep.c +++ b/gdb/i386-sol2-tdep.c @@ -135,6 +135,10 @@ i386_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) set_gdbarch_skip_solib_resolver (gdbarch, sol2_skip_solib_resolver); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); + + /* Solaris encodes the pid of the inferior in regset section + names. */ + set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1); } diff --git a/gdb/sparc-sol2-tdep.c b/gdb/sparc-sol2-tdep.c index 1f9eb584e3e..b1255b672d6 100644 --- a/gdb/sparc-sol2-tdep.c +++ b/gdb/sparc-sol2-tdep.c @@ -231,6 +231,10 @@ sparc32_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) set_gdbarch_software_single_step (gdbarch, NULL); frame_unwind_append_unwinder (gdbarch, &sparc32_sol2_sigtramp_frame_unwind); + + /* Solaris encodes the pid of the inferior in regset section + names. */ + set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1); } diff --git a/gdb/sparc64-sol2-tdep.c b/gdb/sparc64-sol2-tdep.c index 4af28078865..e5800cc98e6 100644 --- a/gdb/sparc64-sol2-tdep.c +++ b/gdb/sparc64-sol2-tdep.c @@ -180,6 +180,10 @@ sparc64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) /* Solaris has kernel-assisted single-stepping support. */ set_gdbarch_software_single_step (gdbarch, NULL); + + /* Solaris encodes the pid of the inferior in regset section + names. */ + set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1); } -- 2.30.2