Bug 45729 - -flto conflicts with -mthumb
Summary: -flto conflicts with -mthumb
Status: RESOLVED INVALID
Alias: None
Product: gcc
Classification: Unclassified
Component: lto (show other bugs)
Version: 4.6.0
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on: 52144
Blocks:
  Show dependency treegraph
 
Reported: 2010-09-19 19:09 UTC by Rafaël Carré
Modified: 2015-06-22 08:19 UTC (History)
3 users (show)

See Also:
Host:
Target: arm-elf-eabi
Build:
Known to work:
Known to fail:
Last reconfirmed: 2010-09-21 15:30:17


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Rafaël Carré 2010-09-19 19:09:12 UTC
% 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?
Comment 1 Ian Bolton 2010-09-21 15:30:17 UTC
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?
Comment 2 Rafaël Carré 2010-09-29 17:58:18 UTC
(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
Comment 3 André Goddard Rosa 2014-10-22 21:15:08 UTC
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.
Comment 4 chrbr 2015-06-22 08:19:27 UTC
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