diff --git a/libsanitizer/ChangeLog b/libsanitizer/ChangeLog
index 7aade5066d47c7d34f0fef58f89a9e188df734b9..22f65b29926f15d364321eb55bf40dceaf51f993 100644
--- a/libsanitizer/ChangeLog
+++ b/libsanitizer/ChangeLog
@@ -1,3 +1,10 @@
+2012-11-20  Konstantin Serebryany  <konstantin.s.serebryany@gmail.com>
+
+	* sanitizer_common/sanitizer_linux.cc
+	(SANITIZER_LINUX_USES_64BIT_SYSCALLS): Define.
+	(internal_mmap): Use it.
+	(internal_filesize): Likewise.
+
 2012-11-16  Tom Tromey  <tromey@redhat.com>
 
 	* configure.ac: Invoke AM_MAINTAINER_MODE.
diff --git a/libsanitizer/sanitizer_common/sanitizer_linux.cc b/libsanitizer/sanitizer_common/sanitizer_linux.cc
index e90a68ca1c40fc4807f7e173996eaaa667252efe..f2a0d39ca9929806ee5eced3a155c54aa604d159 100644
--- a/libsanitizer/sanitizer_common/sanitizer_linux.cc
+++ b/libsanitizer/sanitizer_common/sanitizer_linux.cc
@@ -29,12 +29,21 @@
 #include <unistd.h>
 #include <errno.h>
 
+// Are we using 32-bit or 64-bit syscalls?
+// x32 (which defines __x86_64__) has __WORDSIZE == 32
+// but it still needs to use 64-bit syscalls.
+#if defined(__x86_64__) || __WORDSIZE == 64
+# define SANITIZER_LINUX_USES_64BIT_SYSCALLS 1
+#else
+# define SANITIZER_LINUX_USES_64BIT_SYSCALLS 0
+#endif
+
 namespace __sanitizer {
 
 // --------------- sanitizer_libc.h
 void *internal_mmap(void *addr, uptr length, int prot, int flags,
                     int fd, u64 offset) {
-#if defined __x86_64__
+#if SANITIZER_LINUX_USES_64BIT_SYSCALLS
   return (void *)syscall(__NR_mmap, addr, length, prot, flags, fd, offset);
 #else
   return (void *)syscall(__NR_mmap2, addr, length, prot, flags, fd, offset);
@@ -67,7 +76,7 @@ uptr internal_write(fd_t fd, const void *buf, uptr count) {
 }
 
 uptr internal_filesize(fd_t fd) {
-#if defined __x86_64__
+#if SANITIZER_LINUX_USES_64BIT_SYSCALLS
   struct stat st;
   if (syscall(__NR_fstat, fd, &st))
     return -1;