From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1062) id 88BDE3858291; Thu, 1 Jun 2023 00:33:29 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 88BDE3858291 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Alan Modra To: bfd-cvs@sourceware.org Subject: [binutils-gdb] bfd_close and target free_cached_memory X-Act-Checkin: binutils-gdb X-Git-Author: Alan Modra X-Git-Refname: refs/heads/master X-Git-Oldrev: 90fd5049bde965ad217a013398ffc722f298de82 X-Git-Newrev: 8261abd51344cb4c454514fba1389a9292f9652b Message-Id: <20230601003329.88BDE3858291@sourceware.org> Date: Thu, 1 Jun 2023 00:33:29 +0000 (GMT) X-BeenThere: binutils-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 01 Jun 2023 00:33:29 -0000 https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3D8261abd51344= cb4c454514fba1389a9292f9652b commit 8261abd51344cb4c454514fba1389a9292f9652b Author: Alan Modra Date: Wed May 31 21:17:48 2023 +0930 bfd_close and target free_cached_memory =20 bfd_free_cached_info is used in just one place in archive.c, which means most times we reach bfd_close the function isn't called. On the other hand, if bfd_free_cached_info is called we can't do much on the bfd since it loses all its obj_alloc memory. This restricts what can be done in a target _close_and_cleanup. In particular you can't look at sections, which leads to duplication of code in target close_and_cleanup and free_cached_info, eg. elfnn-aarch64.c. =20 * opncls.c (_bfd_delete_bfd): Call bfd_free_cached_info. * elfnn-aarch64.c (elfNN_aarch64_close_and_cleanup): Delete. (bfd_elfNN_close_and_cleanup): Don't define. * som.c (som_bfd_free_cached_info): Don't call _bfd_generic_close_and_cleanup here. (som_close_and_cleanup): Define as _bfd_generic_close_and_clean= up. Diff: --- bfd/elfnn-aarch64.c | 13 ------------- bfd/opncls.c | 5 +++++ bfd/som.c | 6 ++++-- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 32799b6b009..3ad5cb95b40 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -8735,16 +8735,6 @@ unrecord_section_via_map_over_sections (bfd *abfd AT= TRIBUTE_UNUSED, unrecord_section_with_aarch64_elf_section_data (sec); } =20 -static bool -elfNN_aarch64_close_and_cleanup (bfd *abfd) -{ - if (abfd->sections) - bfd_map_over_sections (abfd, - unrecord_section_via_map_over_sections, NULL); - - return _bfd_elf_close_and_cleanup (abfd); -} - static bool elfNN_aarch64_bfd_free_cached_info (bfd *abfd) { @@ -10263,9 +10253,6 @@ const struct elf_size_info elfNN_aarch64_size_info = =3D #define ELF_MAXPAGESIZE 0x10000 #define ELF_COMMONPAGESIZE 0x1000 =20 -#define bfd_elfNN_close_and_cleanup \ - elfNN_aarch64_close_and_cleanup - #define bfd_elfNN_bfd_free_cached_info \ elfNN_aarch64_bfd_free_cached_info =20 diff --git a/bfd/opncls.c b/bfd/opncls.c index f0064954bf3..b0c23b4201c 100644 --- a/bfd/opncls.c +++ b/bfd/opncls.c @@ -156,6 +156,11 @@ _bfd_new_bfd_contained_in (bfd *obfd) static void _bfd_delete_bfd (bfd *abfd) { + /* Give the target _bfd_free_cached_info a chance to free memory. */ + if (abfd->memory) + bfd_free_cached_info (abfd); + + /* The target _bfd_free_cached_info may not have done anything.. */ if (abfd->memory) { bfd_hash_table_free (&abfd->section_htab); diff --git a/bfd/som.c b/bfd/som.c index 0780b235e0e..ef1f6dc3eb6 100644 --- a/bfd/som.c +++ b/bfd/som.c @@ -6813,7 +6813,9 @@ som_bfd_free_cached_info (bfd *abfd) #undef FREE } =20 - return _bfd_generic_close_and_cleanup (abfd); + /* Do not call _bfd_free_cached_info here. som_write_armap needs + to access the bfd obj_alloc memory. */ + return true; } =20 /* End of miscellaneous support functions. */ @@ -6828,7 +6830,7 @@ som_bfd_link_split_section (bfd *abfd ATTRIBUTE_UNUSE= D, asection *sec) =20 #define som_find_line _bfd_nosymbols_find_line #define som_get_symbol_version_string _bfd_nosymbols_get_symbol_version_s= tring -#define som_close_and_cleanup som_bfd_free_cached_info +#define som_close_and_cleanup _bfd_generic_close_and_cleanup #define som_read_ar_hdr _bfd_generic_read_ar_hdr #define som_write_ar_hdr _bfd_generic_write_ar_hdr #define som_openr_next_archived_file bfd_generic_openr_next_archived_file