https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77882
--- Comment #9 from Elad Lahav <e2lahav at gmail dot com> ---
While trying to write a simple test to demonstrate that the suggested patch
works I ran into a couple of issues. First, here is the test code:

#include <stdio.h>
#include <stdlib.h>

#if defined(__aarch64__)
static long __attribute__((naked))
add_one(long a)
{
    __asm__ __volatile__("add x0, x0, #1; ret");
}
#elif defined(__arm__)
static long __attribute__((naked))
add_one(long a)
{
    __asm__ __volatile__("add r0, r0, #1; bx lr");
}
#endif

int
main(int argc, char **argv)
{
    long a = 0;
    if (argc > 1) {
        a = strtol(argv[1], NULL, 0);
    }

    a = add_one(a);
    printf("a=%ld\n", a);
    return 0;
}

1. GCC emits a warning:
   /home/elahav/src/projects/aarch64_naked/aarch64_naked.c:15:1: warning: no
return statement in function returning non-void [-Wreturn-type]
 }
 This is true for ARMv7 as well. I would not expect such a warning in a naked
function.
2. With -O0 GCC puts an instruction before 'add':
   0000000000000000 <add_one>:
     0:   f90007e0        str     x0, [sp, #8]
     4:   91000400        add     x0, x0, #0x1
     8:   d65f03c0        ret
     c:   d503201f        nop

 The ARMv7 version is better, though still has extra baggage:
   00000000 <add_one>:
     0:   f100 0001       add.w   r0, r0, #1
     4:   4770            bx      lr
     6:   bf00            nop
     8:   4618            mov     r0, r3

 With -O2 I get the expected results:
  0000000000000000 <add_one>:
     0:   91000400        add     x0, x0, #0x1
     4:   d65f03c0        ret

Reply via email to