% cat thumb.i int _start(void) { extern int f(void); return f(); } % cat arm.i int f(void) { int ret; asm ("\tmov %0, #0x200\n" : "=r"(ret)); return ret; } % /usr/local/arm-elf-eabi-cvs/bin/arm-elf-eabi-gcc -O -flto -mthumb-interwork thumb.i -c -mthumb % /usr/local/arm-elf-eabi-cvs/bin/arm-elf-eabi-gcc -O -flto -mthumb-interwork arm.i -c % /usr/local/arm-elf-eabi-cvs/bin/arm-elf-eabi-gcc -O -flto -mthumb-interwork arm.o thumb.o -lgcc -nostdlib /tmp/cc6zNKqK.s: Assembler messages: /tmp/cc6zNKqK.s:20: Error: invalid immediate: 512 is out of range lto-wrapper: /usr/local/arm-elf-eabi-cvs/bin/arm-elf-eabi-gcc returned 1 exit status collect2: lto-wrapper returned 1 exit status % /usr/local/arm-elf-eabi-cvs/bin/arm-elf-eabi-gcc -O -flto -mthumb-interwork arm.o thumb.o -lgcc -nostdlib -mthumb /tmp/ccIIQlpY.s: Assembler messages: /tmp/ccIIQlpY.s:20: Error: invalid immediate: 512 is out of range lto-wrapper: /usr/local/arm-elf-eabi-cvs/bin/arm-elf-eabi-gcc returned 1 exit status collect2: lto-wrapper returned 1 exit status % /usr/local/arm-elf-eabi-cvs/bin/arm-elf-eabi-gcc -O -flto -mthumb-interwork arm.o thumb.o -lgcc -nostdlib -mno-thumb % /usr/local/arm-elf-eabi-cvs/bin/arm-elf-eabi-gcc -v Using built-in specs. COLLECT_GCC=/usr/local/arm-elf-eabi-cvs/bin/arm-elf-eabi-gcc COLLECT_LTO_WRAPPER=/usr/local/arm-elf-eabi-cvs/libexec/gcc/arm-elf-eabi/4.6.0/lto-wrapper Target: arm-elf-eabi Configured with: ../gcc-4.6-20100918/configure --prefix=/usr/local/arm-elf-eabi-cvs --target=arm-elf-eabi --enable-lto --enable-languages=c --disable-docs --disable-libssp Thread model: single gcc version 4.6.0 20100918 (experimental) (GCC) I am not sure what is wrong here: If -mthumb is not specified during linking, I would expect -flto to generate ARM code which is interworked properly with existing thumb code If -mthumb is explicited, I would expect -flto to generate Thumb code which is interworked properly with existing ARM code Linking with -mno-thumb on a larger binary (rockbox) shows that the binary is using both Thumb and ARM, does it mean that -flto doesn't regenerate assembler for every file from the GIMPLE representation?
Unfortunately, LTO does not officially work on ARM yet. There are many LTO failures in the gcc testsuite at the moment. Can you retry without LTO so we can diagnose the interworking problems?
(In reply to comment #1) > Can you retry without LTO so we can diagnose the interworking problems? It works fine without LTO so I guess this bug can be closed
Is LTO playing well with thumb as far as 4.8.3 is concerned or still not supported? Got the following when mixing "-mthumb" with "-flto=8 -fuse-linker-plugin": | /tmp/ccQ4Z3ej.s: Assembler messages: | /tmp/ccQ4Z3ej.s:21: Error: lo register required -- `str lr,[sp,#4]' | /tmp/ccQ4Z3ej.s:31: Error: lo register required -- `str lr,[sp,#4]' ... | /tmp/ccQ4Z3ej.s:1134: Error: lo register required -- `ldr lr,[sp,#0x38]' | /tmp/ccQ4Z3ej.s:1158: Error: instruction not supported in Thumb16 mode -- `adds r3,#5' | /tmp/ccQ4Z3ej.s:1173: Error: lo register required -- `ldr r10,[r1,#60]' | /tmp/ccQ4Z3ej.s:1174: Error: lo register required -- `ldr r3,[r10,#0]' | /tmp/ccQ4Z3ej.s:1186: Error: instruction not supported in Thumb16 mode -- `adds r3,#5' | /tmp/ccQ4Z3ej.s:1201: Error: lo register required -- `ldr r10,[r1,#60]' | /tmp/ccQ4Z3ej.s:1202: Error: lo register required -- `ldr r3,[r10,#0]' | /tmp/ccQ4Z3ej.s:1216: Error: instruction not supported in Thumb16 mode -- `adds r3,#5' | /tmp/ccQ4Z3ej.s:1234: Error: lo register required -- `ldr r10,[r1,#60]' | /tmp/ccQ4Z3ej.s:1241: Error: dest must overlap one source register -- `mul r2,r3,r0' | /tmp/ccQ4Z3ej.s:1242: Error: instruction not supported in Thumb16 mode -- `lsls r0,r0,#3' | /tmp/ccQ4Z3ej.s:1245: Error: unshifted register required -- `add r3,r5,r0,lsl#0' | /tmp/ccQ4Z3ej.s:1247: Error: instruction not supported in Thumb16 mode -- `subs r4,r4,#32' | /tmp/ccQ4Z3ej.s:1249: Error: unshifted register required -- `add r3,r5,r0,lsl#0' | /tmp/ccQ4Z3ej.s:1252: Error: unshifted register required -- `mvn r3,#7' | /tmp/ccQ4Z3ej.s:1253: Error: instruction not supported in Thumb16 mode -- `adds r0,r3' | /tmp/ccQ4Z3ej.s:1261: Error: instruction not supported in Thumb16 mode -- `lsls r0,r0,#3' | /tmp/ccQ4Z3ej.s:1262: Error: instruction not supported in Thumb16 mode -- `subs r0,r5,r0' Removing LTO or -mthumb makes the problem go away. $ ld --version GNU ld (crosstool-NG 1.19.0 - 4.8-2014.10-x86_64) 2.24.0.20140311 Linaro 2014.03 Copyright 2013 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or (at your option) a later version. This program has absolutely no warranty. $ gcc --version gcc-original (crosstool-NG 1.19.0 - 4.8-2014.10-x86_64) 4.8.3 20140401 (prerelease) Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
need to add __attribute__((noinline)) for f(void) to make sure it is compiled in arm mode, otherwise it takes the mode of the caller