From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp.gentoo.org (woodpecker.gentoo.org [140.211.166.183]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id E8FE415808A for ; Wed, 06 Aug 2025 13:19:57 +0000 (UTC) Received: from lists.gentoo.org (bobolink.gentoo.org [140.211.166.189]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: relay-lists.gentoo.org@gentoo.org) by smtp.gentoo.org (Postfix) with ESMTPSA id C08CD34203F for ; Wed, 06 Aug 2025 13:19:57 +0000 (UTC) Received: from bobolink.gentoo.org (localhost [127.0.0.1]) by bobolink.gentoo.org (Postfix) with ESMTP id BEFB811036D; Wed, 06 Aug 2025 13:19:56 +0000 (UTC) Received: from smtp.gentoo.org (mail.gentoo.org [IPv6:2001:470:ea4a:1:5054:ff:fec7:86e4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) by bobolink.gentoo.org (Postfix) with ESMTPS id B637611036D for ; Wed, 06 Aug 2025 13:19:56 +0000 (UTC) Received: from oystercatcher.gentoo.org (oystercatcher.gentoo.org [148.251.78.52]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 58A51342003 for ; Wed, 06 Aug 2025 13:19:56 +0000 (UTC) Received: from localhost.localdomain (localhost [IPv6:::1]) by oystercatcher.gentoo.org (Postfix) with ESMTP id C07A1322F for ; Wed, 06 Aug 2025 13:19:54 +0000 (UTC) From: "Sam James" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Sam James" Message-ID: <1754486385.d7e8dae1a4f7e3e1492b1ce05b8d20a14d40648e.sam@gentoo> Subject: [gentoo-commits] proj/toolchain/binutils-patches:master commit in: 9999/ X-VCS-Repository: proj/toolchain/binutils-patches X-VCS-Files: 9999/0006-strip-Don-t-treat-fat-IR-objects-as-plugin-object.patch X-VCS-Directories: 9999/ X-VCS-Committer: sam X-VCS-Committer-Name: Sam James X-VCS-Revision: d7e8dae1a4f7e3e1492b1ce05b8d20a14d40648e X-VCS-Branch: master Date: Wed, 06 Aug 2025 13:19:54 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Archives-Salt: 90ebd936-8f2c-4ca6-9c5e-17504302460f X-Archives-Hash: f1f6560b4bbe1eeec9151a09290c04b9 commit: d7e8dae1a4f7e3e1492b1ce05b8d20a14d40648e Author: Sam James gentoo org> AuthorDate: Wed Aug 6 13:19:45 2025 +0000 Commit: Sam James gentoo org> CommitDate: Wed Aug 6 13:19:45 2025 +0000 URL: https://gitweb.gentoo.org/proj/toolchain/binutils-patches.git/commit/?id=d7e8dae1 9999: drop patch merged upstream Signed-off-by: Sam James gentoo.org> ...n-t-treat-fat-IR-objects-as-plugin-object.patch | 474 --------------------- 1 file changed, 474 deletions(-) diff --git a/9999/0006-strip-Don-t-treat-fat-IR-objects-as-plugin-object.patch b/9999/0006-strip-Don-t-treat-fat-IR-objects-as-plugin-object.patch deleted file mode 100644 index ca9a282..0000000 --- a/9999/0006-strip-Don-t-treat-fat-IR-objects-as-plugin-object.patch +++ /dev/null @@ -1,474 +0,0 @@ -https://inbox.sourceware.org/binutils/20250806040426.3697458-1-hjl.tools@gmail.com/T/#u - -From 2d6b40ce9b89f5e6b2497071910baab839d8e60b Mon Sep 17 00:00:00 2001 -Message-ID: <2d6b40ce9b89f5e6b2497071910baab839d8e60b.1754453238.git.sam@gentoo.org> -From: "H.J. Lu" -Date: Tue, 5 Aug 2025 21:04:26 -0700 -Subject: [PATCH] strip: Don't treat fat IR objects as plugin object - -Fat IR objects contains both regular sections and IR sections. After - -commit 717a38e9a02109fcbcb18bb2ec3aa251e2ad0a0d -Author: H.J. Lu -Date: Sun May 4 05:12:46 2025 +0800 - - strip: Add GCC LTO IR support - -"strip --strip-debug" no longer strips debug sections in fat IR objects -since fat IR objects are recognized as plugin object and copied as unknown -objects. Add a is_strip_input field to bfd to indicate called from strip. -Update bfd_check_format_matches not to treat archive member nor standalone -fat IR object as IR object so that strip can remove debug and IR sections -in fat IR object. For archive member, it is copied as an unknown object -if the plugin target is in use or it is a slim IR object. For standalone -fat IR object, it is copied as non-IR object. - -bfd/ - - PR binutils/33246 - * archive.c: Include "plugin-api.h" and "plugin.h" if plugin is - enabled. - (_bfd_compute_and_write_armap): Don't complain plugin is needed - when the plugin target is in use. - * bfd-in2.h: Regenerated. - * bfd.c (bfd): Add is_strip_input. - * format.c (bfd_set_lto_type): If there is .llvm.lto section, - set LTO type to lto_fat_ir_object. - (bfd_check_format_matches): Don't set LTO type when setting - format. When called from strip, don't treat archive member nor - standalone fat IR object as an IR object. - * plugin.c (bfd_plugin_get_symbols_in_object_only): Copy LTO - type derived from input sections. - -nm/ - - PR binutils/33246 - * nm.c (filter_symbols): Don't complain plugin is needed when - the plugin target is in use. - (display_rel_file): Likewise. - * objcopy.c (copy_archive): Set the BFD is_strip_input field of - archive member to 1 to indicate called from strip. Also copy - slim IR archive member as unknown object. - (copy_file): Set the BFD is_strip_input field of input bfd to - 1 to indicate called from strip. - (strip_main): Keep .gnu.debuglto_* sections unless all GCC LTO - sections will be removed. - -ld/ - - PR binutils/33246 - * testsuite/ld-plugin/lto-binutils.exp (run_pr33246_test): New. - Run binutils/33246 tests with GCC and Clang. - * testsuite/ld-plugin/pr33246.c: New file. - -Signed-off-by: H.J. Lu ---- - bfd/archive.c | 10 ++ - bfd/bfd-in2.h | 3 + - bfd/bfd.c | 3 + - bfd/format.c | 25 +++- - bfd/plugin.c | 3 + - binutils/nm.c | 9 +- - binutils/objcopy.c | 13 +- - ld/testsuite/ld-plugin/lto-binutils.exp | 175 ++++++++++++++++++++++++ - ld/testsuite/ld-plugin/pr33246.c | 4 + - 9 files changed, 238 insertions(+), 7 deletions(-) - create mode 100644 ld/testsuite/ld-plugin/pr33246.c - -diff --git a/bfd/archive.c b/bfd/archive.c -index c61d4b12658..697b2ed23f2 100644 ---- a/bfd/archive.c -+++ b/bfd/archive.c -@@ -141,6 +141,10 @@ SUBSECTION - #include "hashtab.h" - #include "filenames.h" - #include "bfdlink.h" -+#if BFD_SUPPORTS_PLUGINS -+#include "plugin-api.h" -+#include "plugin.h" -+#endif - - #ifndef errno - extern int errno; -@@ -2343,6 +2347,9 @@ _bfd_compute_and_write_armap (bfd *arch, unsigned int elength) - long src_count; - - if (bfd_get_lto_type (current) == lto_slim_ir_object -+#if BFD_SUPPORTS_PLUGINS -+ && !bfd_plugin_target_p (current->xvec) -+#endif - && report_plugin_err) - { - report_plugin_err = false; -@@ -2400,6 +2407,9 @@ _bfd_compute_and_write_armap (bfd *arch, unsigned int elength) - - if (bfd_lto_slim_symbol_p (current, - syms[src_count]->name) -+#if BFD_SUPPORTS_PLUGINS -+ && !bfd_plugin_target_p (current->xvec) -+#endif - && report_plugin_err) - { - report_plugin_err = false; -diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h -index b013ef954da..12512a3962c 100644 ---- a/bfd/bfd-in2.h -+++ b/bfd/bfd-in2.h -@@ -2131,6 +2131,9 @@ struct bfd - /* Set if this is the linker input BFD. */ - unsigned int is_linker_input : 1; - -+ /* Set if this is the strip input BFD. */ -+ unsigned int is_strip_input : 1; -+ - /* If this is an input for a compiler plug-in library. */ - ENUM_BITFIELD (bfd_plugin_format) plugin_format : 2; - -diff --git a/bfd/bfd.c b/bfd/bfd.c -index 858ab5ce017..4aded6809bb 100644 ---- a/bfd/bfd.c -+++ b/bfd/bfd.c -@@ -296,6 +296,9 @@ CODE_FRAGMENT - . {* Set if this is the linker input BFD. *} - . unsigned int is_linker_input : 1; - . -+. {* Set if this is the strip input BFD. *} -+. unsigned int is_strip_input : 1; -+. - . {* If this is an input for a compiler plug-in library. *} - . ENUM_BITFIELD (bfd_plugin_format) plugin_format : 2; - . -diff --git a/bfd/format.c b/bfd/format.c -index d2bc318977c..bd9fa8d6c33 100644 ---- a/bfd/format.c -+++ b/bfd/format.c -@@ -389,6 +389,11 @@ bfd_set_lto_type (bfd *abfd ATTRIBUTE_UNUSED) - abfd->object_only_section = sec; - break; - } -+ else if (strcmp (sec->name, ".llvm.lto") == 0) -+ { -+ type = lto_fat_ir_object; -+ break; -+ } - else if (lsection.major_version == 0 - && startswith (sec->name, ".gnu.lto_.lto.") - && bfd_get_section_contents (abfd, sec, &lsection, 0, -@@ -453,10 +458,7 @@ bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching) - } - - if (abfd->format != bfd_unknown) -- { -- bfd_set_lto_type (abfd); -- return abfd->format == format; -- } -+ return abfd->format == format; - - if (matching != NULL || *bfd_associated_vector != NULL) - { -@@ -510,7 +512,20 @@ bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching) - - cleanup = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd)); - -- if (cleanup) -+ /* When called from strip, don't treat archive member nor -+ standalone fat IR object as an IR object. For archive -+ member, it will be copied as an unknown object if the -+ plugin target is in use or it is a slim IR object. For -+ standalone fat IR object, it will be copied as non-IR -+ object. */ -+ if (cleanup -+#if BFD_SUPPORTS_PLUGINS -+ && (!abfd->is_strip_input -+ || !bfd_plugin_target_p (abfd->xvec) -+ || (abfd->lto_type != lto_fat_ir_object -+ && abfd->my_archive == NULL)) -+#endif -+ ) - goto ok_ret; - - /* For a long time the code has dropped through to check all -diff --git a/bfd/plugin.c b/bfd/plugin.c -index ebdf2505cbc..43ca444e7a1 100644 ---- a/bfd/plugin.c -+++ b/bfd/plugin.c -@@ -206,6 +206,9 @@ bfd_plugin_get_symbols_in_object_only (bfd *abfd) - bfd_close (nbfd); - return; - } -+ -+ /* Copy LTO type derived from input sections. */ -+ abfd->lto_type = nbfd->lto_type; - } - else - { -diff --git a/binutils/nm.c b/binutils/nm.c -index a5d56311dde..d44083dcc94 100644 ---- a/binutils/nm.c -+++ b/binutils/nm.c -@@ -802,6 +802,9 @@ filter_symbols (bfd *abfd, bool is_dynamic, void *minisyms, - continue; - - if (bfd_lto_slim_symbol_p (abfd, sym->name) -+#if BFD_SUPPORTS_PLUGINS -+ && !bfd_plugin_target_p (abfd->xvec) -+#endif - && report_plugin_err) - { - report_plugin_err = false; -@@ -1484,7 +1487,11 @@ display_rel_file (bfd *abfd, bfd *archive_bfd) - - /* lto_type is set to lto_non_ir_object when a bfd is loaded with a - compiler LTO plugin. */ -- if (bfd_get_lto_type (abfd) == lto_slim_ir_object) -+ if (bfd_get_lto_type (abfd) == lto_slim_ir_object -+#if BFD_SUPPORTS_PLUGINS -+ && !bfd_plugin_target_p (abfd->xvec) -+#endif -+ ) - { - report_plugin_err = false; - non_fatal (_("%s: plugin needed to handle lto object"), -diff --git a/binutils/objcopy.c b/binutils/objcopy.c -index 8bd523aba13..3404bec1d08 100644 ---- a/binutils/objcopy.c -+++ b/binutils/objcopy.c -@@ -3689,6 +3689,8 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target, - bool ok_object; - const char *element_name; - -+ this_element->is_strip_input = 1; -+ - element_name = bfd_get_filename (this_element); - /* PR binutils/17533: Do not allow directory traversal - outside of the current directory tree by archive members. */ -@@ -3769,7 +3771,9 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target, - - #if BFD_SUPPORTS_PLUGINS - /* Copy LTO IR file as unknown object. */ -- if (bfd_plugin_target_p (this_element->xvec)) -+ if ((!lto_sections_removed -+ && this_element->lto_type == lto_slim_ir_object) -+ || bfd_plugin_target_p (this_element->xvec)) - ok_object = false; - else - #endif -@@ -3966,6 +3970,8 @@ copy_file (const char *input_filename, const char *output_filename, int ofd, - break; - } - -+ ibfd->is_strip_input = 1; -+ - if (bfd_check_format (ibfd, bfd_archive)) - { - bool force_output_target; -@@ -5072,6 +5078,11 @@ strip_main (int argc, char *argv[]) - SECTION_CONTEXT_REMOVE) - || !!find_section_list (".llvm.lto", false, - SECTION_CONTEXT_REMOVE)); -+ /* NB: Must keep .gnu.debuglto_* sections unless all GCC LTO sections -+ will be removed to avoid undefined references to symbols in GCC LTO -+ debug sections. */ -+ if (!lto_sections_removed) -+ find_section_list (".gnu.debuglto_*", true, SECTION_CONTEXT_KEEP); - #endif - - i = optind; -diff --git a/ld/testsuite/ld-plugin/lto-binutils.exp b/ld/testsuite/ld-plugin/lto-binutils.exp -index 88d35171045..de017f0b946 100644 ---- a/ld/testsuite/ld-plugin/lto-binutils.exp -+++ b/ld/testsuite/ld-plugin/lto-binutils.exp -@@ -355,3 +355,178 @@ run_cc_link_tests [list \ - "tmpdir/libstrip-1b-fat-s.a" \ - ] \ - ] -+ -+proc run_pr33246_test { llvm fat } { -+ global srcdir -+ global subdir -+ global plug_opt -+ global llvm_plug_opt -+ global ar -+ global CLANG_FOR_TARGET -+ global CC_FOR_TARGET -+ global NM -+ global READELF -+ global strip -+ -+ set strip_flags "--strip-debug --enable-deterministic-archives" -+ -+ set test pr33246 -+ set testname "${test}${llvm}${fat} with $strip_flags" -+ -+ if { "$llvm" == "-llvm" } { -+ # Skip native x32 and i?86 targets since system LLVMgold.so may -+ # not be compatible with native x32 and i?86 targets binutils. -+ if { [istarget "x86_64-*-linux*-gnux32"] -+ || [istarget "i?86-*-*"] -+ || ![info exists CLANG_FOR_TARGET] -+ || [string match "" $llvm_plug_opt] } then { -+ untested $testname -+ return -+ } -+ set CC $CLANG_FOR_TARGET -+ set binutils_plug_opt "$llvm_plug_opt" -+ } else { -+ if { ![info exists CC_FOR_TARGET] -+ || [string match "" $plug_opt] } then { -+ untested $testname -+ return -+ } -+ set CC $CC_FOR_TARGET -+ set binutils_plug_opt "$plug_opt" -+ } -+ -+ append strip_flags " $binutils_plug_opt" -+ -+ set src $srcdir/$subdir/${test}.c -+ set obj tmpdir/${test}${llvm}${fat}.o -+ set archive tmpdir/${test}${llvm}${fat}.a -+ set CFLAGS "-c -g -O2 -flto" -+ if { "$fat" == "-fat" } { -+ append CFLAGS " -ffat-lto-objects" -+ } else { -+ append CFLAGS " -fno-fat-lto-objects" -+ } -+ -+ set cmd "$CC $CFLAGS -o $obj $src" -+ send_log "$cmd\n" -+ verbose "$cmd" 1 -+ catch "exec $cmd" got -+ if ![string match "" $got] then { -+ send_log "$got\n" -+ verbose "$got" 1 -+ fail "$testname ($obj)" -+ return -+ } -+ -+ set cmd "$strip $strip_flags $obj -o ${obj}.strip" -+ send_log "$cmd\n" -+ verbose "$cmd" 1 -+ catch "exec $cmd" got -+ if ![string match "" $got] then { -+ send_log "$got\n" -+ verbose "$got" 1 -+ fail "$testname (strip $obj)" -+ return -+ } -+ -+ set cmd "$NM $binutils_plug_opt ${obj}.strip" -+ send_log "$cmd\n" -+ verbose "$cmd" 1 -+ catch "exec $cmd" got -+ if ![regexp "0+ T foo" $got] then { -+ send_log "$got\n" -+ verbose "$got" 1 -+ fail "$testname (strip $obj)" -+ return -+ } -+ -+ if { "$fat" == "-fat" } { -+ set cmd "$READELF -SW ${obj}.strip" -+ send_log "$cmd\n" -+ verbose "$cmd" 1 -+ catch "exec $cmd" got -+ if [regexp " \.debug_" $got] then { -+ send_log "$got\n" -+ verbose "$got" 1 -+ fail "$testname (strip $obj)" -+ return -+ } -+ } else { -+ set cmd "cmp $obj ${obj}.strip" -+ send_log "$cmd\n" -+ verbose "$cmd" 1 -+ catch "exec $cmd" got -+ if ![string match "" $got] then { -+ send_log "$got\n" -+ verbose "$got" 1 -+ fail "$testname (strip $obj)" -+ return -+ } -+ } -+ -+ pass "$testname (strip $obj)" -+ -+ set cmd "$ar $binutils_plug_opt -D -s -r -c $archive $obj" -+ send_log "$cmd\n" -+ verbose "$cmd" 1 -+ catch "exec $cmd" got -+ if ![string match "" $got] then { -+ send_log "$got\n" -+ verbose "$got" 1 -+ fail "$testname ($archive)" -+ return -+ } -+ -+ set cmd "$strip $strip_flags $archive -o ${archive}.strip" -+ send_log "$cmd\n" -+ verbose "$cmd" 1 -+ catch "exec $cmd" got -+ if ![string match "" $got] then { -+ send_log "$got\n" -+ verbose "$got" 1 -+ fail "$testname (strip $archive)" -+ return -+ } -+ -+ set cmd "$NM $binutils_plug_opt ${archive}.strip" -+ send_log "$cmd\n" -+ verbose "$cmd" 1 -+ catch "exec $cmd" got -+ if ![regexp "0+ T foo" $got] then { -+ send_log "$got\n" -+ verbose "$got" 1 -+ fail "$testname (strip $archive)" -+ return -+ } -+ -+ if { "$fat" == "-fat" } { -+ set cmd "$READELF -SW ${archive}.strip" -+ send_log "$cmd\n" -+ verbose "$cmd" 1 -+ catch "exec $cmd" got -+ if [regexp " \.debug_" $got] then { -+ send_log "$got\n" -+ verbose "$got" 1 -+ fail "$testname (strip $archive)" -+ return -+ } -+ } else { -+ set cmd "cmp $archive ${archive}.strip" -+ send_log "$cmd\n" -+ verbose "$cmd" 1 -+ catch "exec $cmd" got -+ if ![string match "" $got] then { -+ send_log "$got\n" -+ verbose "$got" 1 -+ fail "$testname (strip $archive)" -+ return -+ } -+ } -+ -+ pass "$testname (strip $archive)" -+} -+ -+run_pr33246_test "" "" -+run_pr33246_test "" "-fat" -+run_pr33246_test "-llvm" "" -+run_pr33246_test "-llvm" "-fat" -diff --git a/ld/testsuite/ld-plugin/pr33246.c b/ld/testsuite/ld-plugin/pr33246.c -new file mode 100644 -index 00000000000..cd0130cacdf ---- /dev/null -+++ b/ld/testsuite/ld-plugin/pr33246.c -@@ -0,0 +1,4 @@ -+void -+foo (void) -+{ -+} - -base-commit: d6e93eedfb9e75846c3083f49f9015eda1a2be33 --- -2.50.1 -