[Bug c/57838] New: GCC does not obey #pragma long_calls with builtins and -Os on cortexM3
zgtamuam84 at snkmail dot com
gcc-bugzilla@gcc.gnu.org
Sat Jul 6 17:19:00 GMT 2013
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57838
Bug ID: 57838
Summary: GCC does not obey #pragma long_calls with builtins and
-Os on cortexM3
Product: gcc
Version: 4.7.3
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: zgtamuam84 at snkmail dot com
Created attachment 30470
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=30470&action=edit
C code
I am compiling an application for the cortexM3 where stdlib is in ROM and the
applictaion runs in RAM. To call ROM from RAM I need to use long-calls.
so I build as follows:
gcc -mcpu=cortex-m3 -mthumb -Wall -Wextra -std=gnu99 -Os -c test.c
The resulting disassembly shows that memset wasn't called via a long-call
method:
test.o: file format elf32-littlearm
Disassembly of section .text.startup:
Disassembly of section .text.startup:
00000000 <main>:
0: b508 push {r3, lr}
2: f7ff fffe bl 0 <tfunc>
6: 2100 movs r1, #0
8: 2264 movs r2, #100 ; 0x64
a: 4802 ldr r0, [pc, #8] ; (14 <main+0x14>)
c: f7ff fffe bl 0 <memset>
10: 2000 movs r0, #0
12: bd08 pop {r3, pc}
14: 00000000 .word 0x00000000
The tfunc() call is a short-jump as expected, but the memset() call is also
short which is not expected.
removing -Os, or compiling with -fno-builtin or removing the #pragma
no_long_calls all work-around the issue and generate a long-call to memset().
In my application, I want non standard-lib functions to use short-calls (thus
the '#pragma no_long_calls' after header inclusion), and I want builtins to be
used when possible (thus I don't want to use -fno-builtin)
I have tested on gcc 4.6.2 and 4.7.3, both of which exhibit this behavior.
More information about the Gcc-bugs
mailing list