public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Xi Ruoyao <xry111@xry111.site>
To: Dimitrije Milosevic <Dimitrije.Milosevic@Syrmia.com>,
	 "gcc-patches@gcc.gnu.org" <gcc-patches@gcc.gnu.org>
Cc: Djordje Todorovic <Djordje.Todorovic@syrmia.com>
Subject: Re: [PATCH] Mips: Resolve build issues for the n32 ABI
Date: Fri, 01 Jul 2022 16:33:51 +0800	[thread overview]
Message-ID: <dfca44b4304bae275d43c964bf5b57fdc6aae541.camel@xry111.site> (raw)
In-Reply-To: <AM0PR03MB4882FFFAE7181F2CDBFDAE2182A59@AM0PR03MB4882.eurprd03.prod.outlook.com>

Please configure your mail client to send the patch as plain text (not
HTML, and don't replace a tab with 8 whitespaces, etc).  If it's not
possible, send the patch as an attachment.

And, it's better to separate the changes in
https://reviews.llvm.org/D127098 and struct_kernel_stat_sz into two
patches, one just "cherry-pick LLVM commit aabbccdd...", another changes
struct_kernel_stat_sz.  It would make the reviewing and tracking of
changes easier.

On Fri, 2022-07-01 at 08:18 +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.
> - struct_kernel_stat_sz was not updated after being changed in LLVM's source tree.
> 
> See https://reviews.llvm.org/D127098.
>     
> libsanitizer/ChangeLog:
> 
>         * sanitizer_common/sanitizer_linux.cpp (defined): Resolve
>         ASAN build issues for the n32 ABI.
>         * sanitizer_common/sanitizer_platform.h (defined): Likewise.
>         * sanitizer_common/sanitizer_platform_limits_posix.h: Likewise.
> 
> ---
> 
>  libsanitizer/sanitizer_common/sanitizer_linux.cpp               | 17 ++++++++++-------
>  libsanitizer/sanitizer_common/sanitizer_platform.h              |  2 +-
>  libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h |  2 +-
>  3 files changed, 12 insertions(+), 9 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
> diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h
> index 89772a7e5c0..62a99035db3 100644
> --- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h
> +++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h
> @@ -83,7 +83,7 @@ const unsigned struct_kernel_stat64_sz = 104;
>  #elif defined(__mips__)
>  const unsigned struct_kernel_stat_sz = SANITIZER_ANDROID
>                                             ? FIRST_32_SECOND_64(104, 128)
> -                                           : FIRST_32_SECOND_64(144, 216);
> +                                           : FIRST_32_SECOND_64(160, 216);
>  const unsigned struct_kernel_stat64_sz = 104;
>  #elif defined(__s390__) && !defined(__s390x__)
>  const unsigned struct_kernel_stat_sz = 64;
> 
> ---

-- 
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University

  reply	other threads:[~2022-07-01  8:33 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-01  8:18 Dimitrije Milosevic
2022-07-01  8:33 ` Xi Ruoyao [this message]
2022-07-01 12:40 Dimitrije Milosevic
2022-07-01 12:58 ` Xi Ruoyao
2022-07-01 14:32   ` Dimitrije Milosevic
2022-07-04 11:23   ` Richard Sandiford
2022-07-06 11:34     ` Dimitrije Milosevic
2022-07-06 18:11       ` Xi Ruoyao
2022-07-07  2:21         ` Xi Ruoyao

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=dfca44b4304bae275d43c964bf5b57fdc6aae541.camel@xry111.site \
    --to=xry111@xry111.site \
    --cc=Dimitrije.Milosevic@Syrmia.com \
    --cc=Djordje.Todorovic@syrmia.com \
    --cc=gcc-patches@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).