GCC v10.3 use more stack size than GCC v6.3 for a function

Viewed 116

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:

  1. This function is a dummy one just to reproduce the issue, so don't consider rewriting it.
  2. 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"
0 Answers
Related