[cfe-dev] Bug in ARM Thumb inline asm?

James Molloy james at jamesmolloy.co.uk
Tue Feb 10 14:39:47 PST 2015


Hi Richard,

My belief is that we don't fully support this syntax. I believe, and I'm
sure Renato on CC will tell me if I'm wrong as he implemented it, that we
only support this for non-allocatable registers, such as SP or FP.

Cheers,

James
On Tue, 10 Feb 2015 at 21:29, Richard Pennington <rich at pennware.com> wrote:

> I'm porting the musl C library to ARM Thumb. It looks like inline asm is
> failing in some cases. Here's one:
>
> The lseek system call looks like this:
> ...
>          off_t result;
>          return syscall(SYS__llseek, fd, offset>>32, offset, &result,
> whence) ? -1 : result;
> ...
>
> Which eventually goes through this macro:
>
> static inline long __syscall5(long n, long a, long b, long c, long d,
> long e)
> {
>          register long r7 __asm__("r7") = n;
>          register long r0 __asm__("r0") = a;
>          register long r1 __asm__("r1") = b;
>          register long r2 __asm__("r2") = c;
>          register long r3 __asm__("r3") = d;
>          register long r4 __asm__("r4") = e;
>          __asm_syscall("r"(r7), "0"(r0), "r"(r1), "r"(r2), "r"(r3),
> "r"(r4));
> }
>
> And then this macro:
> #define __asm_syscall(...) do { \
>          __asm__ __volatile__ ( "svc 0" \
>          : "=r"(r0) : __VA_ARGS__ : "memory"); \
>          return r0; \
>          } while (0)
>
> Gives:
> Disassembly of section .text:
>
> 00000000 <lseek>:
>     0:   b590            push    {r4, r7, lr}
>     2:   af01            add     r7, sp, #4
>     4:   b083            sub     sp, #12
>     6:   278c            movs    r7, #140        ; 0x8c
>     8:   46ec            mov     ip, sp
>     a:   4619            mov     r1, r3
>     c:   68bc            ldr     r4, [r7, #8]    ; XXX r7 is clobbered
> here.
>     e:   4663            mov     r3, ip
>    10:   df00            svc     0
>    12:   f7ff fffe       bl      0 <__syscall_ret>
>    16:   9a00            ldr     r2, [sp, #0]
>    18:   9901            ldr     r1, [sp, #4]
>    1a:   2800            cmp     r0, #0
>    1c:   bf1c            itt     ne
>    1e:   f04f 32ff       movne.w r2, #4294967295 ; 0xffffffff
>    22:   f04f 31ff       movne.w r1, #4294967295 ; 0xffffffff
>    26:   4610            mov     r0, r2
>    28:   b003            add     sp, #12
>    2a:   bd90            pop     {r4, r7, pc}
>
> The question is, does the line
>
> register long r7 __asm__("r7") = n;
>
> make any guarantee about the value of r7 in the asm block?
>
> Adding the -fomit-frame-pointer flag fixes it, but is the bug in the
> code or in the compiler?
>
> -Rich
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150210/d8c1fbdf/attachment.html>


More information about the cfe-dev mailing list