Am 08.05.26 um 11:53 schrieb Richard Biener:
On Thu, May 7, 2026 at 2:36 PM Georg-Johann Lay <[email protected]> wrote:
This patch fixes -mno-call-main which did not work with LTO.
Instead of emitting .global __call_main + __call_main=0 in some
module, it uses a %{mno-call-main: --defsym __call_main=0} spec.
The problem with the old implementation is that avr_no_call_main_p was
set by cc1[plus] (in avr_insert_attributes) but used by lto1 (in
avr_file_end).
The new approach uses --defsym __call_main=0 in order to avoid link
fails due to multiple definitions of __call_main in *.o and lib<mcu>.a.
In the patch the avr.opt and the avr_insert_attributes hunk shouldn't
be necessary?
The avr.opt change is according to
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125194#c1
Some avr_insert_attributes hunk is needed because avr_no_call_main_p
has been removed, since it is no more needed.
And I added "used" to main because otherwise, LTO optimized out main.
That said, even w/o the patch the LTRANS invocations with -flto
should see -mno-call-main, but avr_insert_attributes might not
be called at LTO time.
That's not a problem imho. The hook just adds section(".init9")
and used, and they will survive as attributes.
So if in avr_file_end you check
avropt_call_main instead of avr_no_call_main_p you should
get the .global emitted. Of course in every LTRANS object,
but I suppose the linker should merge multiple defs?
Like mentioned, I am getting multiple symbol definitions error
from ld when emitting .global __call_main=0. Therefore, I
switched to --defsym __call_main=0 which works fine.
Johann
This is for trunk. If you agree, I would also packport it.
Johann
--
AVR: target/125194 - Make -mno-call-main work with -flto.
Instead of emitting .global __call_main + __call_main=0 in some module,
use a %{mno-call-main: --defsym __call_main=0} spec.
The problem with the old implementation is that avr_no_call_main_p was set
by cc1[plus] (in avr_insert_attributes) but used by lto1 (in avr_file_end).
The new approach uses --defsym __call_main=0 in order to avoid link
fails due to multiple definitions of __call_main in *.o and lib<mcu>.a.
PR target/125194
gcc/
* config/avr/avr.cc (avr_no_call_main_p): Remove variable...
(avr_file_end): ...and code that uses it.
(avr_insert_attributes): Same. Add "used" to main attributes
when -mno-call-main.
* config/avr/avr.opt (-mcall-main): Add Save option flag.
* config/avr/gen-avr-mmcu-specs.cc (print_mcu): Emit code
for link_no_call_main specs.
* config/avr/specs.h (LINK_SPEC): Add %(link_no_call_main).