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. > --- > > 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 > > --- -- Xi Ruoyao <xry...@xry111.site> School of Aerospace Science and Technology, Xidian University