]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
aarch64: Tidy syscall error check
authorRichard Henderson <rth@redhat.com>
Tue, 20 May 2014 18:40:22 +0000 (14:40 -0400)
committerRichard Henderson <rth@redhat.com>
Sun, 25 May 2014 16:46:50 +0000 (12:46 -0400)
Move the error branch from the PSEUDO_RET macro to the PSEUDO macro.
This is in line with other architectures, and will enable further improvments.

ChangeLog
sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h
sysdeps/unix/sysv/linux/aarch64/sysdep.h

index e7a7deca5c1829524acda5f894fde10990a8e7c8..4fcaa2845031b4b874dd58d765c3245a592d4641 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2014-05-25  Richard Henderson  <rth@twiddle.net>
 
+       * sysdeps/unix/sysv/linux/aarch64/sysdep.h (PSEUDO_RET): Move
+       branch to syscall error ...
+       (PSEUDO): ... here.
+       [NOT_IN_libc] (SYSCALL_ERROR_HANDLER): Rename the label
+       from __local_syscall_error to .Lsyscall_error.
+       [!NOT_IN_libc] (SYSCALL_ERROR_HANDLER): Branch to __syscall_error.
+       (SYSCALL_ERROR): Update label name.
+
        * sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h (PSEUDO):
        Do not use DOARGS/UNDOARGS.
        * sysdeps/unix/sysv/linux/aarch64/sysdep.h (DO_CALL): Likewise.
index 957bb995993d996a35c4e53dfa5eb6045371230d..2d0ae5b93944d96902b1a789deaa8f72582236d7 100644 (file)
@@ -33,6 +33,7 @@
     cfi_startproc;                                                     \
     DO_CALL (syscall_name, args);                                      \
     cmn x0, 4095;                                                      \
+    b.cs .Lsyscall_error;                                              \
     PSEUDO_RET;                                                                \
     cfi_endproc;                                                       \
     .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel;   \
@@ -41,6 +42,7 @@
     bne .Lpseudo_cancel;                                               \
     DO_CALL (syscall_name, 0);                                         \
     cmn x0, 4095;                                                      \
+    b.cs .Lsyscall_error;                                              \
     PSEUDO_RET;                                                                \
   .Lpseudo_cancel:                                                     \
     DOCARGS_##args;    /* save syscall args etc. around CENABLE.  */   \
@@ -58,7 +60,8 @@
     ldr x30, [sp], 16;                                                 \
     cfi_adjust_cfa_offset (-16);                                       \
     cfi_restore (x30);                                                 \
-    cmn x0, 4095;
+    cmn x0, 4095;                                                      \
+    b.cs .Lsyscall_error;
 
 # define DOCARGS_0                                                     \
        str x30, [sp, -16]!;                                            \
index cffd0083425882ee2826b4f281e3a2e2d1b5cd73..0e91f83c88bacdcb9b85c5943a977183e3f4d1c3 100644 (file)
   .text;                                                                     \
   ENTRY (name);                                                                      \
     DO_CALL (syscall_name, args);                                            \
-    cmn x0, #4095;
+    cmn x0, #4095;                                                           \
+    b.cs .Lsyscall_error;
 
 /* Notice the use of 'RET' instead of 'ret' the assembler is case
    insensitive and eglibc already uses the preprocessor symbol 'ret'
    so we use the upper case 'RET' to force through a ret instruction
    to the assembler */
 # define PSEUDO_RET                                                          \
-    b.cs 1f;                                                                 \
-    RET;                                                                     \
-    1:                                                                        \
-    b SYSCALL_ERROR
+    RET;
 # undef ret
 # define ret PSEUDO_RET
 
 # define ret_ERRVAL PSEUDO_RET_NOERRNO
 
 # if NOT_IN_libc
-#  define SYSCALL_ERROR __local_syscall_error
+#  define SYSCALL_ERROR  .Lsyscall_error
 #  if RTLD_PRIVATE_ERRNO
 #   define SYSCALL_ERROR_HANDLER                               \
-__local_syscall_error:                                         \
+.Lsyscall_error:                                               \
        adrp    x1, C_SYMBOL_NAME(rtld_errno);                  \
        neg     w0, w0;                                         \
        str     w0, [x1, :lo12:C_SYMBOL_NAME(rtld_errno)];      \
@@ -124,7 +122,7 @@ __local_syscall_error:                                              \
 #  else
 
 #   define SYSCALL_ERROR_HANDLER                               \
-__local_syscall_error:                                         \
+.Lsyscall_error:                                               \
        stp     x29, x30, [sp, -32]!;                           \
        cfi_adjust_cfa_offset (32);                             \
        cfi_rel_offset (x29, 0);                                \
@@ -143,8 +141,10 @@ __local_syscall_error:                                             \
        RET;
 #  endif
 # else
-#  define SYSCALL_ERROR_HANDLER        /* Nothing here; code in sysdep.S is used.  */
 #  define SYSCALL_ERROR __syscall_error
+#  define SYSCALL_ERROR_HANDLER                                 \
+.Lsyscall_error:                                                \
+       b       __syscall_error;
 # endif
 
 /* Linux takes system call args in registers: