bionic: fix __set_errno for arm64 syscalls that return a 64-bit value

bionic/libc/arch-arm64/syscalls/read.S ends with:
    b.hi __set_errno
    ret
END(read)

If __set_errno returns int, it will set w0 to 0xFFFFFFFF, which means
x0 is 0x00000000FFFFFFFF.  When interpreted as a ssize_t that is
INT_MAX, not -1.

Change __set_errno to return long, which will cause x0 to be set instead
of w0.

Change-Id: I9f9ea0f2995928d2ea240eb2ff7758ecdf0ff412
diff --git a/libc/bionic/__set_errno.cpp b/libc/bionic/__set_errno.cpp
index af6a68e..236aeac 100644
--- a/libc/bionic/__set_errno.cpp
+++ b/libc/bionic/__set_errno.cpp
@@ -31,8 +31,19 @@
 // This function is called from our assembler syscall stubs.
 // C/C++ code should just assign 'errno' instead.
 
-// TODO: this should be __LIBC_HIDDEN__ but was exposed in <errno.h> in the NDK.
-extern "C" int __set_errno(int n) {
+// The return type is 'long' because we use the same routine in calls
+// that return an int as in ones that return a ssize_t. On a 32-bit
+// system these are the same size, but on a 64-bit system they're not.
+// 'long' gives us 32-bit on 32-bit systems, 64-bit on 64-bit systems.
+
+#if __LP64__
+extern "C" __LIBC_HIDDEN__ long __set_errno(int);
+#else
+// __set_errno was mistakenly exposed in <errno.h> in the 32-bit NDK.
+extern "C" long __set_errno(int);
+#endif
+
+long __set_errno(int n) {
   errno = n;
   return -1;
 }