Re: [PATCH 5/5] lto: Support #pragma GCC diagnostic [PR80922] [PR106823] [PR107936]

Lewis Hyatt <[email protected]> Wed, 5 Aug 2026 20:15:57 -0400
Newsgroups gmane.comp.gcc.patches
Message-ID <[email protected]>
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!

-Lewis
0001-lto-testsuite-Fix-incr-link-tests-on-wrapped-targets.txt (text/plain, 1.8 KB)
[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]
     }