diff options
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/arch-utils.c | 16 | ||||
-rw-r--r-- | gdb/arch-utils.h | 12 | ||||
-rw-r--r-- | gdb/gdbarch.c | 23 | ||||
-rw-r--r-- | gdb/gdbarch.h | 6 | ||||
-rwxr-xr-x | gdb/gdbarch.sh | 3 |
6 files changed, 67 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2c7506e..f5925c6 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,12 @@ 2020-07-22 Kevin Buettner <kevinb@redhat.com> + * arch-utils.c (default_read_core_file_mappings): New function. + * arch-utils.c (default_read_core_file_mappings): Declare. + * gdbarch.sh (read_core_file_mappings): New gdbarch method. + * gdbarch.h, gdbarch.c: Regenerate. + +2020-07-22 Kevin Buettner <kevinb@redhat.com> + PR corefiles/25631 * corelow.c (core_target:xfer_partial): Revise TARGET_OBJECT_MEMORY case to consider non-SEC_HAS_CONTENTS diff --git a/gdb/arch-utils.c b/gdb/arch-utils.c index 13ba50a..12e3b8d 100644 --- a/gdb/arch-utils.c +++ b/gdb/arch-utils.c @@ -1036,6 +1036,22 @@ default_get_pc_address_flags (frame_info *frame, CORE_ADDR pc) return ""; } +/* See arch-utils.h. */ +void +default_read_core_file_mappings (struct gdbarch *gdbarch, + struct bfd *cbfd, + gdb::function_view<void (ULONGEST count)> + pre_loop_cb, + gdb::function_view<void (int num, + ULONGEST start, + ULONGEST end, + ULONGEST file_ofs, + const char *filename, + const void *other)> + loop_cb) +{ +} + void _initialize_gdbarch_utils (); void _initialize_gdbarch_utils () diff --git a/gdb/arch-utils.h b/gdb/arch-utils.h index 43d64b1..8cb0db0 100644 --- a/gdb/arch-utils.h +++ b/gdb/arch-utils.h @@ -280,4 +280,16 @@ extern ULONGEST default_type_align (struct gdbarch *gdbarch, extern std::string default_get_pc_address_flags (frame_info *frame, CORE_ADDR pc); +/* Default implementation of gdbarch read_core_file_mappings method. */ +extern void default_read_core_file_mappings (struct gdbarch *gdbarch, + struct bfd *cbfd, + gdb::function_view<void (ULONGEST count)> + pre_loop_cb, + gdb::function_view<void (int num, + ULONGEST start, + ULONGEST end, + ULONGEST file_ofs, + const char *filename, + const void *other)> + loop_cb); #endif /* ARCH_UTILS_H */ diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index fd5b030..f8fe03c 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -348,6 +348,7 @@ struct gdbarch const disasm_options_and_args_t * valid_disassembler_options; gdbarch_type_align_ftype *type_align; gdbarch_get_pc_address_flags_ftype *get_pc_address_flags; + gdbarch_read_core_file_mappings_ftype *read_core_file_mappings; }; /* Create a new ``struct gdbarch'' based on information provided by @@ -464,6 +465,7 @@ gdbarch_alloc (const struct gdbarch_info *info, gdbarch->addressable_memory_unit_size = default_addressable_memory_unit_size; gdbarch->type_align = default_type_align; gdbarch->get_pc_address_flags = default_get_pc_address_flags; + gdbarch->read_core_file_mappings = default_read_core_file_mappings; /* gdbarch_alloc() */ return gdbarch; @@ -712,6 +714,7 @@ verify_gdbarch (struct gdbarch *gdbarch) /* Skip verify of valid_disassembler_options, invalid_p == 0 */ /* Skip verify of type_align, invalid_p == 0 */ /* Skip verify of get_pc_address_flags, invalid_p == 0 */ + /* Skip verify of read_core_file_mappings, invalid_p == 0 */ if (!log.empty ()) internal_error (__FILE__, __LINE__, _("verify_gdbarch: the following are invalid ...%s"), @@ -1276,6 +1279,9 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) "gdbarch_dump: ravenscar_ops = %s\n", host_address_to_string (gdbarch->ravenscar_ops)); fprintf_unfiltered (file, + "gdbarch_dump: read_core_file_mappings = <%s>\n", + host_address_to_string (gdbarch->read_core_file_mappings)); + fprintf_unfiltered (file, "gdbarch_dump: gdbarch_read_pc_p() = %d\n", gdbarch_read_pc_p (gdbarch)); fprintf_unfiltered (file, @@ -5137,6 +5143,23 @@ set_gdbarch_get_pc_address_flags (struct gdbarch *gdbarch, gdbarch->get_pc_address_flags = get_pc_address_flags; } +void +gdbarch_read_core_file_mappings (struct gdbarch *gdbarch, struct bfd *cbfd,gdb::function_view<void (ULONGEST count)> pre_loop_cb,gdb::function_view<void (int num, ULONGEST start, ULONGEST end, ULONGEST file_ofs, const char *filename, const void *other)> loop_cb) +{ + gdb_assert (gdbarch != NULL); + gdb_assert (gdbarch->read_core_file_mappings != NULL); + if (gdbarch_debug >= 2) + fprintf_unfiltered (gdb_stdlog, "gdbarch_read_core_file_mappings called\n"); + gdbarch->read_core_file_mappings (gdbarch, cbfd, pre_loop_cb, loop_cb); +} + +void +set_gdbarch_read_core_file_mappings (struct gdbarch *gdbarch, + gdbarch_read_core_file_mappings_ftype read_core_file_mappings) +{ + gdbarch->read_core_file_mappings = read_core_file_mappings; +} + /* Keep a registry of per-architecture data-pointers required by GDB modules. */ diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h index 6c125d1..7a3060e 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -1627,6 +1627,12 @@ typedef std::string (gdbarch_get_pc_address_flags_ftype) (frame_info *frame, COR extern std::string gdbarch_get_pc_address_flags (struct gdbarch *gdbarch, frame_info *frame, CORE_ADDR pc); extern void set_gdbarch_get_pc_address_flags (struct gdbarch *gdbarch, gdbarch_get_pc_address_flags_ftype *get_pc_address_flags); +/* Read core file mappings */ + +typedef void (gdbarch_read_core_file_mappings_ftype) (struct gdbarch *gdbarch, struct bfd *cbfd,gdb::function_view<void (ULONGEST count)> pre_loop_cb,gdb::function_view<void (int num, ULONGEST start, ULONGEST end, ULONGEST file_ofs, const char *filename, const void *other)> loop_cb); +extern void gdbarch_read_core_file_mappings (struct gdbarch *gdbarch, struct bfd *cbfd,gdb::function_view<void (ULONGEST count)> pre_loop_cb,gdb::function_view<void (int num, ULONGEST start, ULONGEST end, ULONGEST file_ofs, const char *filename, const void *other)> loop_cb); +extern void set_gdbarch_read_core_file_mappings (struct gdbarch *gdbarch, gdbarch_read_core_file_mappings_ftype *read_core_file_mappings); + extern struct gdbarch_tdep *gdbarch_tdep (struct gdbarch *gdbarch); diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index 5adfd29..6d3c5c8 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -1176,6 +1176,9 @@ m;ULONGEST;type_align;struct type *type;type;;default_type_align;;0 # Return a string containing any flags for the given PC in the given FRAME. f;std::string;get_pc_address_flags;frame_info *frame, CORE_ADDR pc;frame, pc;;default_get_pc_address_flags;;0 +# Read core file mappings +m;void;read_core_file_mappings;struct bfd *cbfd,gdb::function_view<void (ULONGEST count)> pre_loop_cb,gdb::function_view<void (int num, ULONGEST start, ULONGEST end, ULONGEST file_ofs, const char *filename, const void *other)> loop_cb;cbfd, pre_loop_cb, loop_cb;;default_read_core_file_mappings;;0 + EOF } |