On 2026-08-06 02:15, Lewis Hyatt wrote:
On Wed, Aug 05, 2026 at 08:52:41AM +0200, Torbjorn SVENSSON wrote:


On 2026-08-05 02:06, Lewis Hyatt wrote:
On Tue, Aug 04, 2026 at 02:31:51PM +0200, Torbjorn SVENSSON wrote:
Hello,

The new gcc.dg/lto/pr80922 test appears to fail for all arm-none-eabi targets:

Testing gcc.dg/lto/pr80922-2, -O0 -flto -flto-partition=none -fuse-linker-plugin
doing compile
Executing on host: /build/r17-2833-g32657f29f91871/bin/arm-none-eabi-gcc   
-mthumb -march=armv6s-m -mcpu=cortex-m0 -mfloat-abi=soft -mfpu=auto   
-fdiagnostics-plain-output  -O0 -flto -flto-partition=none -fuse-linker-plugin  
-O2 -Wfree-nonheap-object -c     -o c_lto_pr80922-2_0.o 
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-2_0.c    (timeout = 800)
spawn -ignore SIGHUP /build/r17-2833-g32657f29f91871/bin/arm-none-eabi-gcc 
-mthumb -march=armv6s-m -mcpu=cortex-m0 -mfloat-abi=soft -mfpu=auto 
-fdiagnostics-plain-output -O0 -flto -flto-partition=none -fuse-linker-plugin 
-O2 -Wfree-nonheap-object -c -o c_lto_pr80922-2_0.o 
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-2_0.c
pid is 703324 -703324
pid is -1
output is  status 0
PASS: gcc.dg/lto/pr80922-2 c_lto_pr80922-2_0.o assemble, -O0 -flto 
-flto-partition=none -fuse-linker-plugin
doing compile
Executing on host: /build/r17-2833-g32657f29f91871/bin/arm-none-eabi-gcc   
-mthumb -march=armv6s-m -mcpu=cortex-m0 -mfloat-abi=soft -mfpu=auto   
-fdiagnostics-plain-output  -O0 -flto -flto-partition=none -fuse-linker-plugin  
-O2 -Wfree-nonheap-object -c     -o c_lto_pr80922-2_1.o 
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-2_1.c    (timeout = 800)
spawn -ignore SIGHUP /build/r17-2833-g32657f29f91871/bin/arm-none-eabi-gcc 
-mthumb -march=armv6s-m -mcpu=cortex-m0 -mfloat-abi=soft -mfpu=auto 
-fdiagnostics-plain-output -O0 -flto -flto-partition=none -fuse-linker-plugin 
-O2 -Wfree-nonheap-object -c -o c_lto_pr80922-2_1.o 
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-2_1.c
pid is 703370 -703370
pid is -1
output is  status 0
PASS: gcc.dg/lto/pr80922-2 c_lto_pr80922-2_1.o assemble, -O0 -flto 
-flto-partition=none -fuse-linker-plugin
doing compile
Executing on host: /build/r17-2833-g32657f29f91871/bin/arm-none-eabi-gcc   
-mthumb -march=armv6s-m -mcpu=cortex-m0 -mfloat-abi=soft -mfpu=auto   
-fdiagnostics-plain-output  -O0 -flto -flto-partition=none -fuse-linker-plugin  
-O2 -Wfree-nonheap-object -c     -o c_lto_pr80922-2_2.o 
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-2_2.c    (timeout = 800)
spawn -ignore SIGHUP /build/r17-2833-g32657f29f91871/bin/arm-none-eabi-gcc 
-mthumb -march=armv6s-m -mcpu=cortex-m0 -mfloat-abi=soft -mfpu=auto 
-fdiagnostics-plain-output -O0 -flto -flto-partition=none -fuse-linker-plugin 
-O2 -Wfree-nonheap-object -c -o c_lto_pr80922-2_2.o 
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-2_2.c
pid is 703406 -703406
pid is -1
output is  status 0
PASS: gcc.dg/lto/pr80922-2 c_lto_pr80922-2_2.o assemble, -O0 -flto 
-flto-partition=none -fuse-linker-plugin
doing compile
Executing on host: /build/r17-2833-g32657f29f91871/bin/arm-none-eabi-gcc  
c_lto_pr80922-2_1.o c_lto_pr80922-2_2.o  -mthumb -march=armv6s-m -mcpu=cortex-m0 
-mfloat-abi=soft -mfpu=auto   -dumpbase "" -fdiagnostics-plain-output  -r       
--specs=rdimon.specs -Wl,--start-group -lc -lm -Wl,--end-group --specs=nosys.specs 
-Wl,--allow-multiple-definition -Wl,-u,_isatty,-u,_fstat  -Wl,-wrap,exit -Wl,-wrap,_exit 
-Wl,-wrap,main -Wl,-wrap,abort -Wl,gcc_tg.o    -o c_lto_pr80922-2.o    (timeout = 800)
spawn -ignore SIGHUP /build/r17-2833-g32657f29f91871/bin/arm-none-eabi-gcc 
c_lto_pr80922-2_1.o c_lto_pr80922-2_2.o -mthumb -march=armv6s-m -mcpu=cortex-m0 
-mfloat-abi=soft -mfpu=auto -dumpbase  -fdiagnostics-plain-output -r 
--specs=rdimon.specs -Wl,--start-group -lc -lm -Wl,--end-group 
--specs=nosys.specs -Wl,--allow-multiple-definition -Wl,-u,_isatty,-u,_fstat 
-Wl,-wrap,exit -Wl,-wrap,_exit -Wl,-wrap,main -Wl,-wrap,abort -Wl,gcc_tg.o -o 
c_lto_pr80922-2.o
pid is 703440 -703440
/build/r17-2833-g32657f29f91871/arm-none-eabi/bin/ld: warning: incremental 
linking of LTO and non-LTO objects; using -flinker-output=nolto-rel which will 
bypass whole program optimization
In function 'myfree2',
      inlined from 'main' at 
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-1_1.c:8:3:
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-2_1.c:5:3: warning: 
'__builtin_free' called on unallocated object 'a' [-Wfree-nonheap-object]
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-1_1.c: In function 'main':
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-1_1.c:4:13: note: declared here
In function 'myfree2',
      inlined from 'main' at 
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-1_1.c:8:3:
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-2_1.c:10:3: warning: 
'__builtin_free' called on unallocated object 'c' [-Wfree-nonheap-object]
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-1_1.c: In function 'main':
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-1_1.c:4:19: note: declared here
pid is -1
output is /build/r17-2833-g32657f29f91871/arm-none-eabi/bin/ld: warning: 
incremental linking of LTO and non-LTO objects; using -flinker-output=nolto-rel 
which will bypass whole program optimization
In function 'myfree2',
      inlined from 'main' at 
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-1_1.c:8:3:
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-2_1.c:5:3: warning: 
'__builtin_free' called on unallocated object 'a' [-Wfree-nonheap-object]
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-1_1.c: In function 'main':
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-1_1.c:4:13: note: declared here
In function 'myfree2',
      inlined from 'main' at 
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-1_1.c:8:3:
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-2_1.c:10:3: warning: 
'__builtin_free' called on unallocated object 'c' [-Wfree-nonheap-object]
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-1_1.c: In function 'main':
/build/gcc_src/gcc/testsuite/gcc.dg/lto/pr80922-1_1.c:4:19: note: declared here
   status 0
FAIL: gcc.dg/lto/pr80922-2 c_lto_pr80922-2_2.o-c_lto_pr80922-2_2.o link, 
incr-link
doing compile
Executing on host: /build/r17-2833-g32657f29f91871/bin/arm-none-eabi-gcc  
c_lto_pr80922-2_0.o c_lto_pr80922-2.o  -mthumb -march=armv6s-m -mcpu=cortex-m0 
-mfloat-abi=soft -mfpu=auto   -dumpbase "" -fdiagnostics-plain-output  -O0 
-flto -flto-partition=none -fuse-linker-plugin -O2 -Wfree-nonheap-object       
--specs=rdimon.specs -Wl,--start-group -lc -lm -Wl,--end-group --specs=nosys.specs 
-Wl,--allow-multiple-definition -Wl,-u,_isatty,-u,_fstat  -Wl,-wrap,exit -Wl,-wrap,_exit 
-Wl,-wrap,main -Wl,-wrap,abort -Wl,gcc_tg.o   -T qemu.ld -o gcc-dg-lto-pr80922-2-01.exe   
 (timeout = 800)
spawn -ignore SIGHUP /build/r17-2833-g32657f29f91871/bin/arm-none-eabi-gcc 
c_lto_pr80922-2_0.o c_lto_pr80922-2.o -mthumb -march=armv6s-m -mcpu=cortex-m0 
-mfloat-abi=soft -mfpu=auto -dumpbase  -fdiagnostics-plain-output -O0 -flto 
-flto-partition=none -fuse-linker-plugin -O2 -Wfree-nonheap-object 
--specs=rdimon.specs -Wl,--start-group -lc -lm -Wl,--end-group 
--specs=nosys.specs -Wl,--allow-multiple-definition -Wl,-u,_isatty,-u,_fstat 
-Wl,-wrap,exit -Wl,-wrap,_exit -Wl,-wrap,main -Wl,-wrap,abort -Wl,gcc_tg.o -T 
qemu.ld -o gcc-dg-lto-pr80922-2-01.exe
pid is 703533 -703533
pid is -1
output is  status 0
FAIL: gcc.dg/lto/pr80922-2  (test for LTO warnings, pr80922-2_0.c line 10 -O0 
-flto -flto-partition=none -fuse-linker-plugin)
FAIL: gcc.dg/lto/pr80922-2  (test for LTO warnings, pr80922-2_0.c line 15 -O0 
-flto -flto-partition=none -fuse-linker-plugin)
FAIL: gcc.dg/lto/pr80922-2  (test for LTO warnings, pr80922-2_1.c line 5 -O0 
-flto -flto-partition=none -fuse-linker-plugin)
FAIL: gcc.dg/lto/pr80922-2  (test for LTO warnings, pr80922-2_1.c line 10 -O0 
-flto -flto-partition=none -fuse-linker-plugin)
PASS: gcc.dg/lto/pr80922-2 c_lto_pr80922-2_0.o-c_lto_pr80922-2.o link, -O0 
-flto -flto-partition=none -fuse-linker-plugin


Kind regards,
Torbjörn

Thanks, so the test is expecting an LTO-only partial link, and it gets
tripped up because this target adds an extra non-LTO wrapper object to every
link. The attached patch disables the test using
check_effective_target_unwrapped, which I think is the way to go for now? It
works fine on x86-64, fwiw, in that the incr-link test still runs as
before. I don't think I have a way to test on arm-none-eabi myself, unless
there is a cfarm machine I have not found for that...

I've tested below patch on top of r17-2833-g32657f29f91871 and it appears to do 
the job. I do, however, not know if there is any better solution than disabling 
the incr-link.
What impact do you think it would have to compile the testglue.c from dejagnu 
with -flto? Would that be a better solution?
If think it's possible to add -flto when building testglue.c by adding

set_board_info wrap_compile_flags "-flto"

to the board definition. Perhaps, this is something that the harness in GCC 
should do?


The incr-link step is combining two objects together into one, and then the
combined object is later linked normally. So I think what needs to happen is
just that the wrapper object should be omitted from the arguments when doing
the partial link step, since it will be included on the final link. I was
able to test the attached patch locally on x86-64 (temporarily enabling the
test glue wrapper in unix.exp) and it works right for me -- could I trouble
you to try it on arm-none-eabi as well please? (This is instead of the other
patch I sent, not in addition to it.) Thanks!

Thanks for taking another look at this.
I took the new patch for a spin on top of r17-2833-g32657f29f91871 and all the 
tests in lto.exp is now passing for all the arm-none-eabi targets that I 
usually test.
I think this patch is ok, but you need someone with authority to actually 
approve it.

Kind regards,
Torbjörn


-Lewis


0001-lto-testsuite-Fix-incr-link-tests-on-wrapped-targets.txt

[PATCH] lto: testsuite: Fix incr-link tests on wrapped targets

For targets that use a gluefile wrapper object, the extra object should not
be included in the link for the new LTO incr-link mode.

gcc/testsuite/ChangeLog:

        * lib/lto.exp (lto-link-and-maybe-run): Unset gluefile for the
        incremental link step, since the wrapper is not needed there and
        does not contain LTO sections.
---
  gcc/testsuite/lib/lto.exp | 15 ++++++++++++++-
  1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/gcc/testsuite/lib/lto.exp b/gcc/testsuite/lib/lto.exp
index 7243547a52d..a6532e22076 100644
--- a/gcc/testsuite/lib/lto.exp
+++ b/gcc/testsuite/lib/lto.exp
@@ -375,6 +375,7 @@ proc lto-link-and-maybe-run { testname objlist dest optall 
optfile optstr } {
      global tool
      global compile_type
      global board_info
+    global gluefile
upvar dg-messages-by-file dg-messages-by-file @@ -408,16 +409,28 @@ proc lto-link-and-maybe-run { testname objlist dest optall optfile optstr } {
        set board_info($target_board,ldscript) ""
      }
+ set is_incr_link [string equal "incr-link" $optstr]
+    if { $is_incr_link && [info exists gluefile] } {
+       set sav_gluefile $gluefile
+       # Setting gluefile to an empty string arranges that we still pass the 
needed
+       # -wrap flags to the linker, but we don't include the object file.
+       set gluefile ""
+    }
+
      # Link the objects into an executable.
      set comp_output [${tool}_target_compile "$objlist" $dest executable \
                     "$options"]
+ if { [info exists sav_gluefile] } {
+       set gluefile $sav_gluefile
+    }
+
      if { $relocatable } {
        set board_info($target_board,ldscript) $saved_ldscript
      }
# Check for diagnostics specified by directives
-    if { ! [string equal "incr-link" $optstr] } {
+    if { ! $is_incr_link } {
        set comp_output [lto_handle_diagnostics $comp_output $optstr]
      }

Reply via email to