mips: Fix argument passing for inlined syscalls on Linux [BZ #25523]
authorWANG Xuerui <git@xen0n.name>
Wed, 12 Feb 2020 16:57:03 +0000 (00:57 +0800)
committerJoseph Myers <joseph@codesourcery.com>
Wed, 12 Feb 2020 22:13:59 +0000 (22:13 +0000)
According to [gcc documentation][1], temporary variables must be used for
the desired content to not be call-clobbered.

Fix the Linux inline syscall templates by adding temporary variables,
much like what x86 did before
(commit 381a0c26d73e0f074c962e0ab53b99a6c327066d).

Tested with gcc 9.2.0, both cross-compiled and natively on Loongson
3A4000.

[1]: https://gcc.gnu.org/onlinedocs/gcc/Local-Register-Variables.html

sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h
sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h

index 5cdac96..0c6a83e 100644 (file)
@@ -178,10 +178,11 @@ union __mips_syscall_return
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long int _arg1 = (long int) (arg1);                             \
        register long int __s0 asm ("$16") __attribute__ ((unused))     \
          = (number);                                                   \
        register long int __v0 asm ("$2");                              \
-       register long int __a0 asm ("$4") = (long int) (arg1);          \
+       register long int __a0 asm ("$4") = _arg1;                      \
        register long int __a3 asm ("$7");                              \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
@@ -202,11 +203,13 @@ union __mips_syscall_return
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long int _arg1 = (long int) (arg1);                             \
+       long int _arg2 = (long int) (arg2);                             \
        register long int __s0 asm ("$16") __attribute__ ((unused))     \
          = (number);                                                   \
        register long int __v0 asm ("$2");                              \
-       register long int __a0 asm ("$4") = (long int) (arg1);          \
-       register long int __a1 asm ("$5") = (long int) (arg2);          \
+       register long int __a0 asm ("$4") = _arg1;                      \
+       register long int __a1 asm ("$5") = _arg2;                      \
        register long int __a3 asm ("$7");                              \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
@@ -228,12 +231,15 @@ union __mips_syscall_return
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long int _arg1 = (long int) (arg1);                             \
+       long int _arg2 = (long int) (arg2);                             \
+       long int _arg3 = (long int) (arg3);                             \
        register long int __s0 asm ("$16") __attribute__ ((unused))     \
          = (number);                                                   \
        register long int __v0 asm ("$2");                              \
-       register long int __a0 asm ("$4") = (long int) (arg1);          \
-       register long int __a1 asm ("$5") = (long int) (arg2);          \
-       register long int __a2 asm ("$6") = (long int) (arg3);          \
+       register long int __a0 asm ("$4") = _arg1;                      \
+       register long int __a1 asm ("$5") = _arg2;                      \
+       register long int __a2 asm ("$6") = _arg3;                      \
        register long int __a3 asm ("$7");                              \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
@@ -255,13 +261,17 @@ union __mips_syscall_return
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long int _arg1 = (long int) (arg1);                             \
+       long int _arg2 = (long int) (arg2);                             \
+       long int _arg3 = (long int) (arg3);                             \
+       long int _arg4 = (long int) (arg4);                             \
        register long int __s0 asm ("$16") __attribute__ ((unused))     \
          = (number);                                                   \
        register long int __v0 asm ("$2");                              \
-       register long int __a0 asm ("$4") = (long int) (arg1);          \
-       register long int __a1 asm ("$5") = (long int) (arg2);          \
-       register long int __a2 asm ("$6") = (long int) (arg3);          \
-       register long int __a3 asm ("$7") = (long int) (arg4);          \
+       register long int __a0 asm ("$4") = _arg1;                      \
+       register long int __a1 asm ("$5") = _arg2;                      \
+       register long int __a2 asm ("$6") = _arg3;                      \
+       register long int __a3 asm ("$7") = _arg4;                      \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        v0_init                                                         \
index bbc6891..4a9d705 100644 (file)
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long long int _arg1 = ARGIFY (arg1);                            \
        register long long int __s0 asm ("$16") __attribute__ ((unused))\
          = (number);                                                   \
        register long long int __v0 asm ("$2");                         \
-       register long long int __a0 asm ("$4") = ARGIFY (arg1);         \
+       register long long int __a0 asm ("$4") = _arg1;                 \
        register long long int __a3 asm ("$7");                         \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long long int _arg1 = ARGIFY (arg1);                            \
+       long long int _arg2 = ARGIFY (arg2);                            \
        register long long int __s0 asm ("$16") __attribute__ ((unused))\
          = (number);                                                   \
        register long long int __v0 asm ("$2");                         \
-       register long long int __a0 asm ("$4") = ARGIFY (arg1);         \
-       register long long int __a1 asm ("$5") = ARGIFY (arg2);         \
+       register long long int __a0 asm ("$4") = _arg1;                 \
+       register long long int __a1 asm ("$5") = _arg2;                 \
        register long long int __a3 asm ("$7");                         \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long long int _arg1 = ARGIFY (arg1);                            \
+       long long int _arg2 = ARGIFY (arg2);                            \
+       long long int _arg3 = ARGIFY (arg3);                            \
        register long long int __s0 asm ("$16") __attribute__ ((unused))\
          = (number);                                                   \
        register long long int __v0 asm ("$2");                         \
-       register long long int __a0 asm ("$4") = ARGIFY (arg1);         \
-       register long long int __a1 asm ("$5") = ARGIFY (arg2);         \
-       register long long int __a2 asm ("$6") = ARGIFY (arg3);         \
+       register long long int __a0 asm ("$4") = _arg1;                 \
+       register long long int __a1 asm ("$5") = _arg2;                 \
+       register long long int __a2 asm ("$6") = _arg3;                 \
        register long long int __a3 asm ("$7");                         \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long long int _arg1 = ARGIFY (arg1);                            \
+       long long int _arg2 = ARGIFY (arg2);                            \
+       long long int _arg3 = ARGIFY (arg3);                            \
+       long long int _arg4 = ARGIFY (arg4);                            \
        register long long int __s0 asm ("$16") __attribute__ ((unused))\
          = (number);                                                   \
        register long long int __v0 asm ("$2");                         \
-       register long long int __a0 asm ("$4") = ARGIFY (arg1);         \
-       register long long int __a1 asm ("$5") = ARGIFY (arg2);         \
-       register long long int __a2 asm ("$6") = ARGIFY (arg3);         \
-       register long long int __a3 asm ("$7") = ARGIFY (arg4);         \
+       register long long int __a0 asm ("$4") = _arg1;                 \
+       register long long int __a1 asm ("$5") = _arg2;                 \
+       register long long int __a2 asm ("$6") = _arg3;                 \
+       register long long int __a3 asm ("$7") = _arg4;                 \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        v0_init                                                         \
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long long int _arg1 = ARGIFY (arg1);                            \
+       long long int _arg2 = ARGIFY (arg2);                            \
+       long long int _arg3 = ARGIFY (arg3);                            \
+       long long int _arg4 = ARGIFY (arg4);                            \
+       long long int _arg5 = ARGIFY (arg5);                            \
        register long long int __s0 asm ("$16") __attribute__ ((unused))\
          = (number);                                                   \
        register long long int __v0 asm ("$2");                         \
-       register long long int __a0 asm ("$4") = ARGIFY (arg1);         \
-       register long long int __a1 asm ("$5") = ARGIFY (arg2);         \
-       register long long int __a2 asm ("$6") = ARGIFY (arg3);         \
-       register long long int __a3 asm ("$7") = ARGIFY (arg4);         \
-       register long long int __a4 asm ("$8") = ARGIFY (arg5);         \
+       register long long int __a0 asm ("$4") = _arg1;                 \
+       register long long int __a1 asm ("$5") = _arg2;                 \
+       register long long int __a2 asm ("$6") = _arg3;                 \
+       register long long int __a3 asm ("$7") = _arg4;                 \
+       register long long int __a4 asm ("$8") = _arg5;                 \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        v0_init                                                         \
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long long int _arg1 = ARGIFY (arg1);                            \
+       long long int _arg2 = ARGIFY (arg2);                            \
+       long long int _arg3 = ARGIFY (arg3);                            \
+       long long int _arg4 = ARGIFY (arg4);                            \
+       long long int _arg5 = ARGIFY (arg5);                            \
+       long long int _arg6 = ARGIFY (arg6);                            \
        register long long int __s0 asm ("$16") __attribute__ ((unused))\
          = (number);                                                   \
        register long long int __v0 asm ("$2");                         \
-       register long long int __a0 asm ("$4") = ARGIFY (arg1);         \
-       register long long int __a1 asm ("$5") = ARGIFY (arg2);         \
-       register long long int __a2 asm ("$6") = ARGIFY (arg3);         \
-       register long long int __a3 asm ("$7") = ARGIFY (arg4);         \
-       register long long int __a4 asm ("$8") = ARGIFY (arg5);         \
-       register long long int __a5 asm ("$9") = ARGIFY (arg6);         \
+       register long long int __a0 asm ("$4") = _arg1;                 \
+       register long long int __a1 asm ("$5") = _arg2;                 \
+       register long long int __a2 asm ("$6") = _arg3;                 \
+       register long long int __a3 asm ("$7") = _arg4;                 \
+       register long long int __a4 asm ("$8") = _arg5;                 \
+       register long long int __a5 asm ("$9") = _arg6;                 \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        v0_init                                                         \
index db0e0b4..3e1f1cc 100644 (file)
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long int _arg1 = (long int) (arg1);                             \
        register long int __s0 asm ("$16") __attribute__ ((unused))     \
          = (number);                                                   \
        register long int __v0 asm ("$2");                              \
-       register long int __a0 asm ("$4") = (long int) (arg1);          \
+       register long int __a0 asm ("$4") = _arg1;                      \
        register long int __a3 asm ("$7");                              \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long int _arg1 = (long int) (arg1);                             \
+       long int _arg2 = (long int) (arg2);                             \
        register long int __s0 asm ("$16") __attribute__ ((unused))     \
          = (number);                                                   \
        register long int __v0 asm ("$2");                              \
-       register long int __a0 asm ("$4") = (long int) (arg1);          \
-       register long int __a1 asm ("$5") = (long int) (arg2);          \
+       register long int __a0 asm ("$4") = _arg1;                      \
+       register long int __a1 asm ("$5") = _arg2;                      \
        register long int __a3 asm ("$7");                              \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long int _arg1 = (long int) (arg1);                             \
+       long int _arg2 = (long int) (arg2);                             \
+       long int _arg3 = (long int) (arg3);                             \
        register long int __s0 asm ("$16") __attribute__ ((unused))     \
          = (number);                                                   \
        register long int __v0 asm ("$2");                              \
-       register long int __a0 asm ("$4") = (long int) (arg1);          \
-       register long int __a1 asm ("$5") = (long int) (arg2);          \
-       register long int __a2 asm ("$6") = (long int) (arg3);          \
+       register long int __a0 asm ("$4") = _arg1;                      \
+       register long int __a1 asm ("$5") = _arg2;                      \
+       register long int __a2 asm ("$6") = _arg3;                      \
        register long int __a3 asm ("$7");                              \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long int _arg1 = (long int) (arg1);                             \
+       long int _arg2 = (long int) (arg2);                             \
+       long int _arg3 = (long int) (arg3);                             \
+       long int _arg4 = (long int) (arg4);                             \
        register long int __s0 asm ("$16") __attribute__ ((unused))     \
          = (number);                                                   \
        register long int __v0 asm ("$2");                              \
-       register long int __a0 asm ("$4") = (long int) (arg1);          \
-       register long int __a1 asm ("$5") = (long int) (arg2);          \
-       register long int __a2 asm ("$6") = (long int) (arg3);          \
-       register long int __a3 asm ("$7") = (long int) (arg4);          \
+       register long int __a0 asm ("$4") = _arg1;                      \
+       register long int __a1 asm ("$5") = _arg2;                      \
+       register long int __a2 asm ("$6") = _arg3;                      \
+       register long int __a3 asm ("$7") = _arg4;                      \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        v0_init                                                         \
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long int _arg1 = (long int) (arg1);                             \
+       long int _arg2 = (long int) (arg2);                             \
+       long int _arg3 = (long int) (arg3);                             \
+       long int _arg4 = (long int) (arg4);                             \
+       long int _arg5 = (long int) (arg5);                             \
        register long int __s0 asm ("$16") __attribute__ ((unused))     \
          = (number);                                                   \
        register long int __v0 asm ("$2");                              \
-       register long int __a0 asm ("$4") = (long int) (arg1);          \
-       register long int __a1 asm ("$5") = (long int) (arg2);          \
-       register long int __a2 asm ("$6") = (long int) (arg3);          \
-       register long int __a3 asm ("$7") = (long int) (arg4);          \
-       register long int __a4 asm ("$8") = (long int) (arg5);          \
+       register long int __a0 asm ("$4") = _arg1;                      \
+       register long int __a1 asm ("$5") = _arg2;                      \
+       register long int __a2 asm ("$6") = _arg3;                      \
+       register long int __a3 asm ("$7") = _arg4;                      \
+       register long int __a4 asm ("$8") = _arg5;                      \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        v0_init                                                         \
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long int _arg1 = (long int) (arg1);                             \
+       long int _arg2 = (long int) (arg2);                             \
+       long int _arg3 = (long int) (arg3);                             \
+       long int _arg4 = (long int) (arg4);                             \
+       long int _arg5 = (long int) (arg5);                             \
+       long int _arg6 = (long int) (arg6);                             \
        register long int __s0 asm ("$16") __attribute__ ((unused))     \
          = (number);                                                   \
        register long int __v0 asm ("$2");                              \
-       register long int __a0 asm ("$4") = (long int) (arg1);          \
-       register long int __a1 asm ("$5") = (long int) (arg2);          \
-       register long int __a2 asm ("$6") = (long int) (arg3);          \
-       register long int __a3 asm ("$7") = (long int) (arg4);          \
-       register long int __a4 asm ("$8") = (long int) (arg5);          \
-       register long int __a5 asm ("$9") = (long int) (arg6);          \
+       register long int __a0 asm ("$4") = _arg1;                      \
+       register long int __a1 asm ("$5") = _arg2;                      \
+       register long int __a2 asm ("$6") = _arg3;                      \
+       register long int __a3 asm ("$7") = _arg4;                      \
+       register long int __a4 asm ("$8") = _arg5;                      \
+       register long int __a5 asm ("$9") = _arg6;                      \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        v0_init                                                         \