Xi Ruoyao via Gcc-patches <[email protected]> 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
>>
>> ---