* 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.
This commit is contained in:
parent
d0a63aa7a1
commit
959b87241d
@ -1,3 +1,20 @@
|
||||
2009-02-16 Pedro Alves <pedro@codesourcery.com>
|
||||
|
||||
* 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 <vladimir@codesourcery.com>
|
||||
|
||||
Include frame information for *stopped due to CLI commands.
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user