[Bug c/87400] New: GCC doesn't produce valid frames for stack traces with Thumb-2 (Cortex-M3+)
alexkalmuk at gmail dot com
gcc-bugzilla@gcc.gnu.org
Mon Sep 24 08:07:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87400
Bug ID: 87400
Summary: GCC doesn't produce valid frames for stack traces with
Thumb-2 (Cortex-M3+)
Product: gcc
Version: 7.3.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: alexkalmuk at gmail dot com
Target Milestone: ---
Target: arm-none-eabi
GCC generates special frames for doing stack traces on ARM. These frames can be
generated for ARM instruction set using `-mapcs-frame`:
Example of the produced frame:
$ arm-none-eabi-gcc -marm -mcpu=arm926ej-s -march=armv5te -mapcs-frame
--specs=nosys.specs -o test test.c
000081f8 <my_func>:
81f8: e1a0c00d mov ip, sp
81fc: e92dd800 push {fp, ip, lr, pc}
This type of prologue can be also generated for Cortex-M (thumb instruction
set) using `-mthumb -mcpu=cortex-m1 -mtpcs-frame -mtpcs-leaf-frame`:
$ arm-none-eabi-gcc -mthumb -mcpu=cortex-m1 -mtpcs-frame -mtpcs-leaf-frame
--specs=nosys.specs -o test test.c
In that case function prologue will look like:
00008104 <my_func>:
8104: b084 sub sp, #16
8106: b580 push {r7, lr}
8108: aa06 add r2, sp, #24
810a: 9203 str r2, [sp, #12]
810c: 467a mov r2, pc
810e: 9205 str r2, [sp, #20]
8110: 465a mov r2, fp
8112: 9202 str r2, [sp, #8]
It's the same thing like for ARM instruction set, but since Thumb doesn't allow
to push high registers, GCC produces it through mov/str instructions.
But in case of `-mcpu=cortex-m3` (instead of `-mcpu=cortex-m1`), we do not get
such prologue. After investigating gcc/config/arm/arm.c, I figured out that
these prologues are generated only for Thumb-1 (Cortex-M0/M1) and ARM
instruction sets, but ingnored for Thumb-2 (Cortex-M3+). It is a bug, or there
is some reason do not generate these prologues for Thumb-2?
More information about the Gcc-bugs
mailing list