I have an application which I compile using GCC v6.3, when I compile it with GCC v10.3 I find some functions use more stack size than what GCC v6.3 uses, for example this function uses zero stack for GCC v6.3 but uses 8 bytes for GCC v10.3
int func(int *x, int y, int z, int a)
{
switch (y) {
case 1:
*x = a;
y = z;
return y;
}
return 77; // UPDATE
}
GCC v6.3 assembly:
int func(int *x, int y, int z, int a)
{
switch (y) {
0: 2901 cmp r1, #1
2: d102 bne.n a <func+0xa>
case 1:
*x = a;
4: 6003 str r3, [r0, #0]
y = z;
return y;
6: 0010 movs r0, r2
}
return 77;
}
8: 4770 bx lr
return 77;
a: 204d movs r0, #77 ; 0x4d
c: e7fc b.n 8 <func+0x8>
and GCC v10.3 assembly:
int func(int *x, int y, int z, int a)
{
0: b510 push {r4, lr}
2: 0004 movs r4, r0
*x = a;
y = z;
return y;
}
return 77;
4: 204d movs r0, #77 ; 0x4d
switch (y) {
6: 2901 cmp r1, #1
8: d101 bne.n e <func+0xe>
return y;
a: 0010 movs r0, r2
*x = a;
c: 6023 str r3, [r4, #0]
}
e: bd10 pop {r4, pc}
In GCCv10.3, it push {r4, lr} which is not the case in GCC v6.3 so why does this happen?, it costs the application more stack area over the old compiler, so how to avoid it to get less stack size? also, why did it stack the lr although it's a leaf function? plus, why does it return z in all cases although the c code returns it inside the case condition? (UPDATE: This has been resolved by adding a return to the end of the function)
Notes:
- This function is a dummy one just to reproduce the issue, so don't consider rewriting it.
- Building flags are: arm-none-eabi-gcc -O0 -c -std=c99 -fmessage-length=0 -fomit-frame-pointer -Wno-aggressive-loop-optimizations -Werror -Werror=strict-prototypes -pedantic-errors -Wconversion -pedantic -Wall -Wextra -Wno-unused-function -Wextra -Wpointer-arith -Wsign-compare -Wswitch -Wno-maybe-uninitialized -fno-strict-aliasing -fshort-wchar -mfix-cortex-m3-ldrd -gdwarf-3 -gstrict-dwarf -mabi=aapcs -mthumb -mcpu=Cortex-M0 -g3 -Os -mthumb -ffunction-sections -fdata-sections -MMD -MP -MF"xyz.d" -MT"xyz.o"