[Bug target/85606] New: Assembly file generated for ARM Cortex-M0 should not specify `.arch armv6-m` at all or use `.arch armv6s-m`
freddie_chopin at op dot pl
gcc-bugzilla@gcc.gnu.org
Wed May 2 10:17:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85606
Bug ID: 85606
Summary: Assembly file generated for ARM Cortex-M0 should not
specify `.arch armv6-m` at all or use `.arch armv6s-m`
Product: gcc
Version: 8.0.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: freddie_chopin at op dot pl
Target Milestone: ---
Target: arm-none-eabi
This issue is inspired by following bug report for GAS -
https://sourceware.org/bugzilla/show_bug.cgi?id=23126
Following test case works perfectly fine for GCC 5, 6 and 7, however it fails
with GCC 8.0.1 20180427:
-- >8 -- >8 -- >8 -- >8 -- >8 -- >8 -- >8 -- >8 -- >8 --
$ cat svc.cpp
__attribute__ ((naked))
int supervisorCall(int (& function)(int, int, int, int), const int argument1,
const int argument2, const int argument3,
const int argument4)
{
asm volatile
(
" mov r12, r0 \n"
" ldr r0, [sp] \n"
" svc 0 \n"
" \n"
" bx lr \n"
);
__builtin_unreachable();
// suppress warnings
(void)function;
(void)argument1;
(void)argument2;
(void)argument3;
(void)argument4;
}
$ arm-none-eabi-g++ -c svc.cpp -mcpu=cortex-m0 -save-temps
svc.s: Assembler messages:
svc.s:31: Error: SVC is not permitted on this architecture
$ diff -u svc-7.s svc.s
--- svc-7.s 2018-05-01 20:14:09.031910734 +0200
+++ svc.s 2018-05-01 20:16:36.751143427 +0200
@@ -12,6 +12,7 @@
.text
.align 1
.global _Z14supervisorCallRFiiiiiEiiii
+ .arch armv6-m
.syntax unified
.code 16
.thumb_func
@@ -37,4 +38,4 @@
.cantunwind
.fnend
.size _Z14supervisorCallRFiiiiiEiiii,
.-_Z14supervisorCallRFiiiiiEiiii
- .ident "GCC: (bleeding-edge-toolchain) 7.3.0"
+ .ident "GCC: (bleeding-edge-toolchain) 8.0.1 20180427 (prerelease)"
$ cat svc.s
.cpu cortex-m0
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 1
.eabi_attribute 30, 6
.eabi_attribute 34, 0
.eabi_attribute 18, 4
.file "svc.cpp"
.text
.align 1
.global _Z14supervisorCallRFiiiiiEiiii
.arch armv6-m
.syntax unified
.code 16
.thumb_func
.fpu softvfp
.type _Z14supervisorCallRFiiiiiEiiii, %function
_Z14supervisorCallRFiiiiiEiiii:
.fnstart
.LFB0:
@ Naked Function: prologue and epilogue provided by programmer.
@ args = 4, pretend = 0, frame = 0
@ frame_needed = 1, uses_anonymous_args = 0
.syntax divided
@ 12 "svc.cpp" 1
mov r12, r0
ldr r0, [sp]
svc 0
bx lr
@ 0 "" 2
.thumb
.syntax unified
.cantunwind
.fnend
.size _Z14supervisorCallRFiiiiiEiiii,
.-_Z14supervisorCallRFiiiiiEiiii
.ident "GCC: (bleeding-edge-toolchain) 8.0.1 20180427 (prerelease)"
-- >8 -- >8 -- >8 -- >8 -- >8 -- >8 -- >8 -- >8 -- >8 --
(svc-7.s is a temp file generated with GCC 7.3.0)
Nick Clifton in his comment
(https://sourceware.org/bugzilla/show_bug.cgi?id=23126#c4) to the mentioned GAS
bug report suggested that GCC 8 should either specify just `.cpu` (behaviour as
in previous versions) or specify `.arch armv6s-m` instead of `.arch armv6-m`.
Personally I think the first option should be more reliable in that case,
however this is just a guess.
More information about the Gcc-bugs
mailing list