[binutils-gdb] lto: Don't check format of IR dummy file

"H.J. Lu via Binutils-cvs" <[email protected]>
Newsgroups gmane.comp.gnu.binutils.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=d658ddcc389085970ac025414cae7ad908f40726

commit d658ddcc389085970ac025414cae7ad908f40726
Author: H.J. Lu <[email protected]>
Date:   Fri Aug 28 09:08:39 2026 +0800

    lto: Don't check format of IR dummy file
    
    1. Don't check format of IR dummy file in lang_check.
    2. Allow empty DESTLIST in lang_list_remove_tail.
    
            PR ld/34572
            * ldlang.c (lang_check): Don't check format of IR dummy file.
            (debug_file_chain): New.
            (debug_input_files): Use debug_file_chain.
            (lang_list_remove_tail): Also check empty DESTLIST.
            * testsuite/ld-plugin/dummy.s: Add .note.GNU-stack section.
            * testsuite/ld-plugin/lto.exp: Add PR ld/34572 tests.
            * testsuite/ld-plugin/pr34572.rd: New file.
            * testsuite/ld-plugin/pr34572a.c: Likewise.
            * testsuite/ld-plugin/pr34572b.c: Likewise.
    
    Signed-off-by: H.J. Lu <[email protected]>

Diff:
---
 ld/ldlang.c                       | 19 ++++++++++---
 ld/testsuite/ld-plugin/dummy.s    |  2 +-
 ld/testsuite/ld-plugin/lto.exp    | 57 +++++++++++++++++++++++++++++++++++++++
 ld/testsuite/ld-plugin/pr34572.rd |  6 +++++
 ld/testsuite/ld-plugin/pr34572a.c |  8 ++++++
 ld/testsuite/ld-plugin/pr34572b.c |  4 +++
 6 files changed, 91 insertions(+), 5 deletions(-)

diff --git a/ld/ldlang.c b/ld/ldlang.c
index 65494acca00..2e4f9fffbee 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -7617,6 +7617,9 @@ lang_check (void)
       if (file->flags.claimed)
 	continue;
       input_bfd = file->the_bfd;
+      /* Don't check format of IR dummy file.  */
+      if ((input_bfd->flags & BFD_PLUGIN) != 0)
+	continue;
       compatible
 	= bfd_arch_get_compatible (input_bfd, link_info.output_bfd,
 				   command_line.accept_unknown_input_arch);
@@ -7926,11 +7929,11 @@ lang_set_flags (lang_memory_region_type *ptr, const char *flags, int invert)
 }
 
 static void
-debug_input_files (void)
+debug_file_chain (lang_statement_list_type *chain)
 {
   lang_input_statement_type *f;
 
-  for (f = &input_file_chain.head->input_statement;
+  for (f = &chain->head->input_statement;
        f != NULL;
        f = f->next_real_file)
     if (f->the_bfd)
@@ -7939,6 +7942,12 @@ debug_input_files (void)
       fprintf (stderr, "input: %s\n", f->filename);
 }
 
+static void
+debug_input_files (void)
+{
+  debug_file_chain (&input_file_chain);
+}
+
 /* Call a function on each real input file.  This function will be
    called on an archive, but not on the elements.  */
 
@@ -8392,8 +8401,10 @@ lang_list_remove_tail (lang_statement_list_type *destlist,
 		       lang_statement_list_type *origlist)
 {
   union lang_statement_union **savetail;
-  /* Check that ORIGLIST really is an earlier state of DESTLIST.  */
-  ASSERT (origlist->head == destlist->head);
+  /* Check that ORIGLIST really is an earlier state of DESTLIST or an
+     empty list.  */
+  ASSERT ((origlist->head == NULL && origlist->tail == &destlist->head)
+	  || origlist->head == destlist->head);
   savetail = origlist->tail;
   origlist->head = *(savetail);
   origlist->tail = destlist->tail;
diff --git a/ld/testsuite/ld-plugin/dummy.s b/ld/testsuite/ld-plugin/dummy.s
index 8b137891791..0f5ab47ca42 100644
--- a/ld/testsuite/ld-plugin/dummy.s
+++ b/ld/testsuite/ld-plugin/dummy.s
@@ -1 +1 @@
-
+	.section	.note.GNU-stack,"",%progbits
diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp
index 4504fd4be01..1e3fe182e14 100644
--- a/ld/testsuite/ld-plugin/lto.exp
+++ b/ld/testsuite/ld-plugin/lto.exp
@@ -1385,4 +1385,61 @@ if { [check_lto_fat_available] } {
     }
 }
 
+# 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] } {
+    set CC_FOR_TARGET_saved "$CC_FOR_TARGET"
+    set CC_FOR_TARGET "$CLANG_FOR_TARGET"
+    run_cc_link_tests [list \
+	[list \
+	    "Build pr34572a.o" \
+	    "" \
+	    "-flto" \
+	    {pr34572a.c} \
+	] \
+	[list \
+	    "Build pr34572b.o" \
+	    "" \
+	    "-flto" \
+	    {pr34572b.c} \
+	] \
+	[list \
+	    "Build pr34572a.exe" \
+	    "-flto -Wl,--start-lib tmpdir/pr34572a.o -Wl,--end-lib" \
+	    "" \
+	    {dummy.s} \
+	    {} \
+	    "pr34572a.exe"
+	] \
+    ]
+
+    if { [isnative] } {
+	if {[file exists tmpdir/pr34572a.exe]} {
+	    set exec_output [run_host_cmd "tmpdir/pr34572a.exe" ""]
+	    if [string match "PASS\n" $exec_output] then {
+		pass "Run pr34572a.exe"
+	    } else {
+		fail "Run pr34572a.exe"
+	    }
+	}
+    }
+
+    run_ld_link_tests [list \
+	[list \
+	    "Build pr34572b.exe" \
+	    "$llvm_plug_opt --start-lib tmpdir/pr34572b.o --end-lib" \
+	    "" \
+	    "" \
+	    {dummy.s} \
+	    {{readelf {-sW} pr34572.rd}} \
+	    "pr34572b.exe" \
+	] \
+    ]
+
+    set CC_FOR_TARGET "$CC_FOR_TARGET_saved"
+}
+
 restore_notify
diff --git a/ld/testsuite/ld-plugin/pr34572.rd b/ld/testsuite/ld-plugin/pr34572.rd
new file mode 100644
index 00000000000..dcf0d108a83
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr34572.rd
@@ -0,0 +1,6 @@
+#...
+Symbol table '\.symtab' contains [0-9]+ entries:
+ +Num: +Value +Size Type +Bind +Vis +Ndx Name
+#...
+ +[0-9]+: +[0-9a-f]+ +[0-9]+ +FUNC +GLOBAL +DEFAULT .*[0-9]+ _start
+#pass
diff --git a/ld/testsuite/ld-plugin/pr34572a.c b/ld/testsuite/ld-plugin/pr34572a.c
new file mode 100644
index 00000000000..4e63772629e
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr34572a.c
@@ -0,0 +1,8 @@
+#include <stdio.h>
+
+int
+main (void)
+{
+  printf ("PASS\n");
+  return 0;
+}
diff --git a/ld/testsuite/ld-plugin/pr34572b.c b/ld/testsuite/ld-plugin/pr34572b.c
new file mode 100644
index 00000000000..ca92bf15a24
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr34572b.c
@@ -0,0 +1,4 @@
+void
+_start (void)
+{
+}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.