tile: use better variable naming in INLINE_SYSCALL
authorChris Metcalf <cmetcalf@ezchip.com>
Wed, 27 May 2015 00:29:56 +0000 (20:29 -0400)
committerChris Metcalf <cmetcalf@ezchip.com>
Wed, 27 May 2015 00:29:56 +0000 (20:29 -0400)
At issue for INLINE_SYSCALL was that it used "err" and "val"
as variable names in a #define, so that if it was used in a context
where the "caller" was also using "err" or "val", and those
variables were passed in to INLINE_SYSCALL, we would end up
referencing the internal shadowed variables instead.

For example, "char val" in check_may_shrink_heap() in
sysdeps/unix/sysv/linux/malloc-sysdep.h was being shadowed by
the syscall return "val" in INLINE_SYSCALL, causing the "char val"
not to get updated at all, and may_shrink_heap ended up always false.

A similar fix was made to INTERNAL_VSYSCALL_CALL.

ChangeLog
sysdeps/unix/sysv/linux/tile/sysdep.h

index 7fcd403..4a38a05 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2015-05-26  Chris Metcalf  <cmetcalf@ezchip.com>
+
+       * sysdeps/unix/sysv/linux/tile/sysdep.h (INLINE_SYSCALL):
+       Avoid using variables in #defines that might cause shadowing.
+       (INTERNAL_VSYSCALL_CALL): Likewise.
+
 2015-05-26  Roland McGrath  <roland@hack.frob.com>
 
        * sysdeps/nacl/lll_timedlock_wait.c: New file.
index 1f4122c..6b30b2f 100644 (file)
 /* Define a macro which expands inline into the wrapper code for a system
    call.  */
 # undef INLINE_SYSCALL
-# define INLINE_SYSCALL(name, nr, args...) \
+# define INLINE_SYSCALL(name, nr, args...)                              \
   ({                                                                    \
-    INTERNAL_SYSCALL_DECL (err);                                        \
-    unsigned long val = INTERNAL_SYSCALL (name, err, nr, args);         \
-    if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (val, err), 0))      \
-      {                                                                 \
-       __set_errno (INTERNAL_SYSCALL_ERRNO (val, err));                \
-        val = -1;                                                       \
-      }                                                                 \
-    (long) val; })
+    INTERNAL_SYSCALL_DECL (_sc_err);                                    \
+    unsigned long _sc_val = INTERNAL_SYSCALL (name, _sc_err, nr, args); \
+    if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (_sc_val, _sc_err), 0)) \
+    {                                                                   \
+      __set_errno (INTERNAL_SYSCALL_ERRNO (_sc_val, _sc_err));          \
+      _sc_val = -1;                                                     \
+    }                                                                   \
+    (long) _sc_val;                                                     \
+  })
 
 #undef INTERNAL_SYSCALL
 #define INTERNAL_SYSCALL(name, err, nr, args...)        \
     "=R05" (_clobber_r5), "=R10" (_clobber_r10)
 
 
-#define INTERNAL_VSYSCALL_CALL(funcptr, err, nr, args...)                   \
-  ({                                                                        \
-     struct syscall_return_value rv = funcptr (args);                       \
-     err = rv.error;                                                        \
-     rv.value;                                                              \
+#define INTERNAL_VSYSCALL_CALL(funcptr, err, nr, args...)               \
+  ({                                                                    \
+    struct syscall_return_value _sc_rv = funcptr (args);                \
+    err = _sc_rv.error;                                                 \
+    _sc_rv.value;                                                       \
   })
 
 /* List of system calls which are supported as vsyscalls.  */