Ping. :) This change just landed on LLVM (see https://reviews.llvm.org/rG5d8077565e4196efdd4ed525a64c11a96d5aa5dd). Unfortunately, I do not have commit access, so if anyone can commit it, that would be great! Here is the patch with the updated commit message.
libsanitizer: Cherry-pick 5d8077565e41 from upstream Building the ASAN for the n32 MIPS ABI currently fails, due to a few reasons: - defined(__mips64), which is set solely based on the architecture type (32-bit/64-bit), was still used in some places. Therefore, defined(__mips64) is swapped with SANITIZER_MIPS64, which takes the ABI into account as well - defined(__mips64) && _MIPS_SIM == ABI64. - The n32 ABI still uses 64-bit *Linux* system calls, even though the word size is 32 bits. - After the transition to canonical system calls (https://reviews.llvm.org/D124212), the n32 ABI still didn't use them, even though they are supported, as per https://github.com/torvalds/linux/blob/master/arch/mips/kernel/syscalls/syscall_n32.tbl. See https://reviews.llvm.org/D127098. libsanitizer/ChangeLog: * sanitizer_common/sanitizer_linux.cpp (defined): Resolve ASAN build issues for the Mips n32 ABI. * sanitizer_common/sanitizer_platform.h (defined): Likewise. --- .../sanitizer_common/sanitizer_linux.cpp | 17 ++++++++++------- .../sanitizer_common/sanitizer_platform.h | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/libsanitizer/sanitizer_common/sanitizer_linux.cpp b/libsanitizer/sanitizer_common/sanitizer_linux.cpp index e2c32d679ad..5ba033492e7 100644 --- a/libsanitizer/sanitizer_common/sanitizer_linux.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_linux.cpp @@ -34,7 +34,7 @@ // format. Struct kernel_stat is defined as 'struct stat' in asm/stat.h. To // access stat from asm/stat.h, without conflicting with definition in // sys/stat.h, we use this trick. -#if defined(__mips64) +#if SANITIZER_MIPS64 #include <asm/unistd.h> #include <sys/types.h> #define stat kernel_stat @@ -124,8 +124,9 @@ const int FUTEX_WAKE_PRIVATE = FUTEX_WAKE | FUTEX_PRIVATE_FLAG; // Are we using 32-bit or 64-bit Linux syscalls? // x32 (which defines __x86_64__) has SANITIZER_WORDSIZE == 32 // but it still needs to use 64-bit syscalls. -#if SANITIZER_LINUX && (defined(__x86_64__) || defined(__powerpc64__) || \ - SANITIZER_WORDSIZE == 64) +#if SANITIZER_LINUX && (defined(__x86_64__) || defined(__powerpc64__) || \ + SANITIZER_WORDSIZE == 64 || \ + (defined(__mips__) && _MIPS_SIM == _ABIN32)) # define SANITIZER_LINUX_USES_64BIT_SYSCALLS 1 #else # define SANITIZER_LINUX_USES_64BIT_SYSCALLS 0 @@ -289,7 +290,7 @@ static void stat64_to_stat(struct stat64 *in, struct stat *out) { } #endif -#if defined(__mips64) +#if SANITIZER_MIPS64 // Undefine compatibility macros from <sys/stat.h> // so that they would not clash with the kernel_stat // st_[a|m|c]time fields @@ -343,7 +344,8 @@ uptr internal_stat(const char *path, void *buf) { #if SANITIZER_FREEBSD return internal_syscall(SYSCALL(fstatat), AT_FDCWD, (uptr)path, (uptr)buf, 0); # elif SANITIZER_LINUX -# if SANITIZER_WORDSIZE == 64 || SANITIZER_X32 +# if SANITIZER_WORDSIZE == 64 || SANITIZER_X32 || \ + (defined(__mips__) && _MIPS_SIM == _ABIN32) return internal_syscall(SYSCALL(newfstatat), AT_FDCWD, (uptr)path, (uptr)buf, 0); # else @@ -366,7 +368,8 @@ uptr internal_lstat(const char *path, void *buf) { return internal_syscall(SYSCALL(fstatat), AT_FDCWD, (uptr)path, (uptr)buf, AT_SYMLINK_NOFOLLOW); # elif SANITIZER_LINUX -# if defined(_LP64) || SANITIZER_X32 +# if defined(_LP64) || SANITIZER_X32 || \ + (defined(__mips__) && _MIPS_SIM == _ABIN32) return internal_syscall(SYSCALL(newfstatat), AT_FDCWD, (uptr)path, (uptr)buf, AT_SYMLINK_NOFOLLOW); # else @@ -1053,7 +1056,7 @@ uptr GetMaxVirtualAddress() { return (1ULL << (MostSignificantSetBitIndex(GET_CURRENT_FRAME()) + 1)) - 1; #elif SANITIZER_RISCV64 return (1ULL << 38) - 1; -# elif defined(__mips64) +# elif SANITIZER_MIPS64 return (1ULL << 40) - 1; // 0x000000ffffffffffUL; # elif defined(__s390x__) return (1ULL << 53) - 1; // 0x001fffffffffffffUL; diff --git a/libsanitizer/sanitizer_common/sanitizer_platform.h b/libsanitizer/sanitizer_common/sanitizer_platform.h index 8fe0d831431..8bd9a327623 100644 --- a/libsanitizer/sanitizer_common/sanitizer_platform.h +++ b/libsanitizer/sanitizer_common/sanitizer_platform.h @@ -159,7 +159,7 @@ #if defined(__mips__) # define SANITIZER_MIPS 1 -# if defined(__mips64) +# if defined(__mips64) && _MIPS_SIM == _ABI64 # define SANITIZER_MIPS32 0 # define SANITIZER_MIPS64 1 # else -- 2.25.1 From: Richard Sandiford <richard.sandif...@arm.com> Sent: Monday, July 4, 2022 1:23 PM To: Xi Ruoyao via Gcc-patches <gcc-patches@gcc.gnu.org> Cc: Dimitrije Milosevic <dimitrije.milose...@syrmia.com>; Xi Ruoyao <xry...@xry111.site>; Djordje Todorovic <djordje.todoro...@syrmia.com> Subject: Re: [PATCH] Mips: Resolve build issues for the n32 ABI Xi Ruoyao via Gcc-patches <gcc-patches@gcc.gnu.org> writes: > On Fri, 2022-07-01 at 12:40 +0000, Dimitrije Milosevic wrote: >> Building the ASAN for the n32 MIPS ABI currently fails, due to a few reasons: >> - defined(__mips64), which is set solely based on the architecture type >> (32-bit/64-bit), >> was still used in some places. Therefore, defined(__mips64) is swapped with >> SANITIZER_MIPS64, >> which takes the ABI into account as well - defined(__mips64) && >> _MIPS_SIM == ABI64. >> - The n32 ABI still uses 64-bit *Linux* system calls, even though the word >> size is 32 bits. >> - After the transition to canonical system calls >> (https://reviews.llvm.org/D124212), the n32 ABI still didn't use them, >> even though they are supported, >> as per >> https://github.com/torvalds/linux/blob/master/arch/mips/kernel/syscalls/syscall_n32.tbl. >> >> See https://reviews.llvm.org/D127098. >> >> libsanitizer/ChangeLog: >> >> * sanitizer_common/sanitizer_linux.cpp (defined): Resolve >> ASAN build issues for the Mips n32 ABI. >> * sanitizer_common/sanitizer_platform.h (defined): Likewise. > > LGTM (with the ChangeLog format fixed), but I think you need to commit > this into LLVM repository first. And in the commit message you should > say something like "cherry-pick 0011aabb... from upstream". Then we > still require the approve from a maintainer. You know this area far better than I do, so: rubber-stamp OK for cherry-picking the patch into GCC once it's in LLVM. Thanks, Richard > >> --- >> >> libsanitizer/sanitizer_common/sanitizer_linux.cpp | 17 ++++++++++------- >> libsanitizer/sanitizer_common/sanitizer_platform.h | 2 +- >> 2 files changed, 11 insertions(+), 8 deletions(-) >> >> diff --git a/libsanitizer/sanitizer_common/sanitizer_linux.cpp >> b/libsanitizer/sanitizer_common/sanitizer_linux.cpp >> index e2c32d679ad..5ba033492e7 100644 >> --- a/libsanitizer/sanitizer_common/sanitizer_linux.cpp >> +++ b/libsanitizer/sanitizer_common/sanitizer_linux.cpp >> @@ -34,7 +34,7 @@ >> // format. Struct kernel_stat is defined as 'struct stat' in asm/stat.h. To >> // access stat from asm/stat.h, without conflicting with definition in >> // sys/stat.h, we use this trick. >> -#if defined(__mips64) >> +#if SANITIZER_MIPS64 >> #include <asm/unistd.h> >> #include <sys/types.h> >> #define stat kernel_stat >> @@ -124,8 +124,9 @@ const int FUTEX_WAKE_PRIVATE = FUTEX_WAKE | >> FUTEX_PRIVATE_FLAG; >> // Are we using 32-bit or 64-bit Linux syscalls? >> // x32 (which defines __x86_64__) has SANITIZER_WORDSIZE == 32 >> // but it still needs to use 64-bit syscalls. >> -#if SANITIZER_LINUX && (defined(__x86_64__) || defined(__powerpc64__) || >> \ >> - SANITIZER_WORDSIZE == 64) >> +#if SANITIZER_LINUX && (defined(__x86_64__) || defined(__powerpc64__) || \ >> + SANITIZER_WORDSIZE == 64 || \ >> + (defined(__mips__) && _MIPS_SIM == _ABIN32)) >> # define SANITIZER_LINUX_USES_64BIT_SYSCALLS 1 >> #else >> # define SANITIZER_LINUX_USES_64BIT_SYSCALLS 0 >> @@ -289,7 +290,7 @@ static void stat64_to_stat(struct stat64 *in, struct >> stat *out) { >> } >> #endif >> >> -#if defined(__mips64) >> +#if SANITIZER_MIPS64 >> // Undefine compatibility macros from <sys/stat.h> >> // so that they would not clash with the kernel_stat >> // st_[a|m|c]time fields >> @@ -343,7 +344,8 @@ uptr internal_stat(const char *path, void *buf) { >> #if SANITIZER_FREEBSD >> return internal_syscall(SYSCALL(fstatat), AT_FDCWD, (uptr)path, >> (uptr)buf, 0); >> # elif SANITIZER_LINUX >> -# if SANITIZER_WORDSIZE == 64 || SANITIZER_X32 >> +# if SANITIZER_WORDSIZE == 64 || SANITIZER_X32 || \ >> + (defined(__mips__) && _MIPS_SIM == _ABIN32) >> return internal_syscall(SYSCALL(newfstatat), AT_FDCWD, (uptr)path, >> (uptr)buf, >> 0); >> # else >> @@ -366,7 +368,8 @@ uptr internal_lstat(const char *path, void *buf) { >> return internal_syscall(SYSCALL(fstatat), AT_FDCWD, (uptr)path, (uptr)buf, >> AT_SYMLINK_NOFOLLOW); >> # elif SANITIZER_LINUX >> -# if defined(_LP64) || SANITIZER_X32 >> +# if defined(_LP64) || SANITIZER_X32 || \ >> + (defined(__mips__) && _MIPS_SIM == _ABIN32) >> return internal_syscall(SYSCALL(newfstatat), AT_FDCWD, (uptr)path, >> (uptr)buf, >> AT_SYMLINK_NOFOLLOW); >> # else >> @@ -1053,7 +1056,7 @@ uptr GetMaxVirtualAddress() { >> return (1ULL << (MostSignificantSetBitIndex(GET_CURRENT_FRAME()) + 1)) - >> 1; >> #elif SANITIZER_RISCV64 >> return (1ULL << 38) - 1; >> -# elif defined(__mips64) >> +# elif SANITIZER_MIPS64 >> return (1ULL << 40) - 1; // 0x000000ffffffffffUL; >> # elif defined(__s390x__) >> return (1ULL << 53) - 1; // 0x001fffffffffffffUL; >> diff --git a/libsanitizer/sanitizer_common/sanitizer_platform.h >> b/libsanitizer/sanitizer_common/sanitizer_platform.h >> index 8fe0d831431..8bd9a327623 100644 >> --- a/libsanitizer/sanitizer_common/sanitizer_platform.h >> +++ b/libsanitizer/sanitizer_common/sanitizer_platform.h >> @@ -159,7 +159,7 @@ >> >> #if defined(__mips__) >> # define SANITIZER_MIPS 1 >> -# if defined(__mips64) >> +# if defined(__mips64) && _MIPS_SIM == _ABI64 >> # define SANITIZER_MIPS32 0 >> # define SANITIZER_MIPS64 1 >> # else >> >> ---