From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by sourceware.org (Postfix) with ESMTP id 56521383F85D for ; Wed, 22 Jul 2020 00:59:25 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 56521383F85D Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-186-riWo-LYRMiudvgP4cfhlSA-1; Tue, 21 Jul 2020 20:59:21 -0400 X-MC-Unique: riWo-LYRMiudvgP4cfhlSA-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id DDEAB1005504 for ; Wed, 22 Jul 2020 00:59:20 +0000 (UTC) Received: from f32-1.lan (ovpn-112-21.phx2.redhat.com [10.3.112.21]) by smtp.corp.redhat.com (Postfix) with ESMTP id AE8E769314; Wed, 22 Jul 2020 00:59:20 +0000 (UTC) From: Kevin Buettner To: gdb-patches@sourceware.org Subject: [PATCH v5 07/14] Add new gdbarch method, read_core_file_mappings Date: Tue, 21 Jul 2020 17:58:25 -0700 Message-Id: <20200722005832.863276-8-kevinb@redhat.com> In-Reply-To: <20200722005832.863276-1-kevinb@redhat.com> References: <20200722005832.863276-1-kevinb@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-13.0 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 Jul 2020 00:59:26 -0000 The new gdbarch method, read_core_file_mappings, will be used for reading file-backed mappings from a core file. It'll be used for two purposes: 1) to construct a table of file-backed mappings in corelow.c, and 2) for display of core file mappings. For Linux, I tried a different approach in which knowledge of the note format was placed directly in corelow.c. This seemed okay at first; it was only one note format and the note format was fairly simple. After looking at FreeBSD's note/mapping reading code, I concluded that it's best to leave architecture specific details for decoding the note in (architecture specific) tdep files. With regard to display of core file mappings, I experimented with placing the mappings display code in corelow.c. It has access to the file-backed mappings which were read in when the core file was loaded. And, better, still common code could be used for all architectures. But, again, the FreeBSD mapping code convinced me that this was not the best approach since it has even more mapping info than Linux. Display code which would work well for Linux will leave out mappings as well as protection info for mappings. So, for these reasons, I'm introducing a new gdbarch method for reading core file mappings. gdb/ChangeLog: * 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. --- gdb/arch-utils.c | 16 ++++++++++++++++ gdb/arch-utils.h | 12 ++++++++++++ gdb/gdbarch.c | 23 +++++++++++++++++++++++ gdb/gdbarch.h | 6 ++++++ gdb/gdbarch.sh | 3 +++ 5 files changed, 60 insertions(+) diff --git a/gdb/arch-utils.c b/gdb/arch-utils.c index 13ba50abe6..12e3b8dbbb 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 + pre_loop_cb, + gdb::function_view + loop_cb) +{ +} + void _initialize_gdbarch_utils (); void _initialize_gdbarch_utils () diff --git a/gdb/arch-utils.h b/gdb/arch-utils.h index 43d64b1f4f..8cb0db04c8 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 + pre_loop_cb, + gdb::function_view + loop_cb); #endif /* ARCH_UTILS_H */ diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index 21ee840e88..bdf6977f7c 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"), @@ -1281,6 +1284,9 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) fprintf_unfiltered (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)); @@ -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 pre_loop_cb,gdb::function_view 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 0940156aeb..7143b78f1d 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -1628,6 +1628,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 pre_loop_cb,gdb::function_view loop_cb); +extern void gdbarch_read_core_file_mappings (struct gdbarch *gdbarch, struct bfd *cbfd,gdb::function_view pre_loop_cb,gdb::function_view 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 41e7b8d5cc..95497f32fb 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -1177,6 +1177,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 pre_loop_cb,gdb::function_view loop_cb;cbfd, pre_loop_cb, loop_cb;;default_read_core_file_mappings;;0 + EOF } -- 2.26.2