diff mbox series

[2/2] Enable libsanitizer build on mips64

Message ID db67a3e7456b169ba96a4f0da7d1db57e70468e9.camel@mengyan1223.wang
State New
Headers show
Series [1/2] libsanitizer: cherry-pick db7bca28638e from upstream | expand

Commit Message

Xi Ruoyao March 11, 2022, 3:27 a.m. UTC
Bootstrapped and regtested on mips64el-linux-gnuabi64.

bootstrap-ubsan revealed 3 bugs (PR 104842, 104843, 104851).
bootstrap-asan did not reveal any new bug.

gcc/

	* config/mips/mips.h (SUBTARGET_SHADOW_OFFSET): Define.
	* config/mips/mips.cc (mips_option_override): Make
	-fsanitize=address imply -fasynchronous-unwind-tables.  This is
	needed by libasan for stack backtrace on MIPS.
	(mips_asan_shadow_offset): Return SUBTARGET_SHADOW_OFFSET.

gcc/testsuite:

	* c-c++-common/asan/global-overflow-1.c: Skip for MIPS with some
	optimization levels because inaccurate debug info is causing
	dg-output mismatch on line numbers.
	* g++.dg/asan/large-func-test-1.C: Likewise.

libsanitizer/

	* configure.tgt: Enable build on mips64.
---
 gcc/config/mips/mips.cc                             | 9 ++++++++-
 gcc/config/mips/mips.h                              | 7 +++++++
 gcc/testsuite/c-c++-common/asan/global-overflow-1.c | 1 +
 gcc/testsuite/g++.dg/asan/large-func-test-1.C       | 1 +
 libsanitizer/configure.tgt                          | 4 ----
 5 files changed, 17 insertions(+), 5 deletions(-)

Comments

Richard Sandiford March 14, 2022, 4:18 p.m. UTC | #1
Xi Ruoyao <xry111@mengyan1223.wang> writes:
> Bootstrapped and regtested on mips64el-linux-gnuabi64.
>
> bootstrap-ubsan revealed 3 bugs (PR 104842, 104843, 104851).
> bootstrap-asan did not reveal any new bug.
>
> gcc/
>
> 	* config/mips/mips.h (SUBTARGET_SHADOW_OFFSET): Define.
> 	* config/mips/mips.cc (mips_option_override): Make
> 	-fsanitize=address imply -fasynchronous-unwind-tables.  This is
> 	needed by libasan for stack backtrace on MIPS.
> 	(mips_asan_shadow_offset): Return SUBTARGET_SHADOW_OFFSET.
>
> gcc/testsuite:
>
> 	* c-c++-common/asan/global-overflow-1.c: Skip for MIPS with some
> 	optimization levels because inaccurate debug info is causing
> 	dg-output mismatch on line numbers.
> 	* g++.dg/asan/large-func-test-1.C: Likewise.
>
> libsanitizer/
>
> 	* configure.tgt: Enable build on mips64.

OK, thanks.

Richard

> ---
>  gcc/config/mips/mips.cc                             | 9 ++++++++-
>  gcc/config/mips/mips.h                              | 7 +++++++
>  gcc/testsuite/c-c++-common/asan/global-overflow-1.c | 1 +
>  gcc/testsuite/g++.dg/asan/large-func-test-1.C       | 1 +
>  libsanitizer/configure.tgt                          | 4 ----
>  5 files changed, 17 insertions(+), 5 deletions(-)
>
> diff --git a/gcc/config/mips/mips.cc b/gcc/config/mips/mips.cc
> index 59eef515826..6b06c6380f6 100644
> --- a/gcc/config/mips/mips.cc
> +++ b/gcc/config/mips/mips.cc
> @@ -19974,6 +19974,13 @@ mips_option_override (void)
>  	target_flags |= MASK_64BIT;
>      }
>  
> +  /* -fsanitize=address needs to turn on -fasynchronous-unwind-tables in
> +     order for tracebacks to be complete but not if any
> +     -fasynchronous-unwind-table were already specified.  */
> +  if (flag_sanitize & SANITIZE_USER_ADDRESS
> +      && !global_options_set.x_flag_asynchronous_unwind_tables)
> +    flag_asynchronous_unwind_tables = 1;
> +
>    if ((target_flags_explicit & MASK_FLOAT64) != 0)
>      {
>        if (mips_isa_rev >= 6 && !TARGET_FLOAT64)
> @@ -22591,7 +22598,7 @@ mips_constant_alignment (const_tree exp, HOST_WIDE_INT align)
>  static unsigned HOST_WIDE_INT
>  mips_asan_shadow_offset (void)
>  {
> -  return 0x0aaa0000;
> +  return SUBTARGET_SHADOW_OFFSET;
>  }
>  
>  /* Implement TARGET_STARTING_FRAME_OFFSET.  See mips_compute_frame_info
> diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
> index 0029864fdcd..858bbba3a36 100644
> --- a/gcc/config/mips/mips.h
> +++ b/gcc/config/mips/mips.h
> @@ -3463,3 +3463,10 @@ struct GTY(())  machine_function {
>     && !TARGET_MICROMIPS && !TARGET_FIX_24K)
>  
>  #define NEED_INDICATE_EXEC_STACK 0
> +
> +/* Define the shadow offset for asan. Other OS's can override in the
> +   respective tm.h files.  */
> +#ifndef SUBTARGET_SHADOW_OFFSET
> +#define SUBTARGET_SHADOW_OFFSET \
> +  (POINTER_SIZE == 64 ? HOST_WIDE_INT_1 << 37 : HOST_WIDE_INT_C (0x0aaa0000))
> +#endif
> diff --git a/gcc/testsuite/c-c++-common/asan/global-overflow-1.c b/gcc/testsuite/c-c++-common/asan/global-overflow-1.c
> index 1092a316681..ec412231be0 100644
> --- a/gcc/testsuite/c-c++-common/asan/global-overflow-1.c
> +++ b/gcc/testsuite/c-c++-common/asan/global-overflow-1.c
> @@ -22,6 +22,7 @@ int main() {
>    return res;
>  }
>  
> +/* { dg-skip-if "inaccurate debug info" { mips*-*-* } { "*" } { "-O0" } } */
>  /* { dg-output "READ of size 1 at 0x\[0-9a-f\]+ thread T0.*(\n|\r\n|\r)" } */
>  /* { dg-output "    #0 0x\[0-9a-f\]+ +(in _*main (\[^\n\r]*global-overflow-1.c:20|\[^\n\r]*:0|\[^\n\r]*\\+0x\[0-9a-z\]*)|\[(\])\[^\n\r]*(\n|\r\n|\r).*" } */
>  /* { dg-output "0x\[0-9a-f\]+ is located 0 bytes to the right of global variable" } */
> diff --git a/gcc/testsuite/g++.dg/asan/large-func-test-1.C b/gcc/testsuite/g++.dg/asan/large-func-test-1.C
> index b42c09e3b0d..ac9deb898c8 100644
> --- a/gcc/testsuite/g++.dg/asan/large-func-test-1.C
> +++ b/gcc/testsuite/g++.dg/asan/large-func-test-1.C
> @@ -35,6 +35,7 @@ int main() {
>    delete x;
>  }
>  
> +// { dg-skip-if "inaccurate debug info" { mips*-*-* } { "-Os" } { "" }  }
>  // { dg-output "ERROR: AddressSanitizer:? heap-buffer-overflow on address\[^\n\r]*" }
>  // { dg-output "0x\[0-9a-f\]+ at pc 0x\[0-9a-f\]+ bp 0x\[0-9a-f\]+ sp 0x\[0-9a-f\]+\[^\n\r]*(\n|\r\n|\r)" }
>  // { dg-output "\[^\n\r]*READ of size 4 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" }
> diff --git a/libsanitizer/configure.tgt b/libsanitizer/configure.tgt
> index 5a59ea6a1b5..fb89df4935c 100644
> --- a/libsanitizer/configure.tgt
> +++ b/libsanitizer/configure.tgt
> @@ -54,10 +54,6 @@ case "${target}" in
>  	;;
>    arm*-*-linux*)
>  	;;
> -  mips*64*-*-linux*)
> -	# This clause is only here to not match the supported mips*-*-linux*.
> -	UNSUPPORTED=1
> -	;;
>    mips*-*-linux*)
>  	;;
>    aarch64*-*-linux*)
Xi Ruoyao March 14, 2022, 5 p.m. UTC | #2
On Mon, 2022-03-14 at 16:18 +0000, Richard Sandiford wrote:
> Xi Ruoyao <xry111@mengyan1223.wang> writes:

> >         * configure.tgt: Enable build on mips64.

I changed this to "mips*64*-*-linux*" to be more precise.

> OK, thanks.
> 
> Richard

Two patches pushed as r12-7645 and r12-7646, with the minor changelog
modification above.
diff mbox series

Patch

diff --git a/gcc/config/mips/mips.cc b/gcc/config/mips/mips.cc
index 59eef515826..6b06c6380f6 100644
--- a/gcc/config/mips/mips.cc
+++ b/gcc/config/mips/mips.cc
@@ -19974,6 +19974,13 @@  mips_option_override (void)
 	target_flags |= MASK_64BIT;
     }
 
+  /* -fsanitize=address needs to turn on -fasynchronous-unwind-tables in
+     order for tracebacks to be complete but not if any
+     -fasynchronous-unwind-table were already specified.  */
+  if (flag_sanitize & SANITIZE_USER_ADDRESS
+      && !global_options_set.x_flag_asynchronous_unwind_tables)
+    flag_asynchronous_unwind_tables = 1;
+
   if ((target_flags_explicit & MASK_FLOAT64) != 0)
     {
       if (mips_isa_rev >= 6 && !TARGET_FLOAT64)
@@ -22591,7 +22598,7 @@  mips_constant_alignment (const_tree exp, HOST_WIDE_INT align)
 static unsigned HOST_WIDE_INT
 mips_asan_shadow_offset (void)
 {
-  return 0x0aaa0000;
+  return SUBTARGET_SHADOW_OFFSET;
 }
 
 /* Implement TARGET_STARTING_FRAME_OFFSET.  See mips_compute_frame_info
diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
index 0029864fdcd..858bbba3a36 100644
--- a/gcc/config/mips/mips.h
+++ b/gcc/config/mips/mips.h
@@ -3463,3 +3463,10 @@  struct GTY(())  machine_function {
    && !TARGET_MICROMIPS && !TARGET_FIX_24K)
 
 #define NEED_INDICATE_EXEC_STACK 0
+
+/* Define the shadow offset for asan. Other OS's can override in the
+   respective tm.h files.  */
+#ifndef SUBTARGET_SHADOW_OFFSET
+#define SUBTARGET_SHADOW_OFFSET \
+  (POINTER_SIZE == 64 ? HOST_WIDE_INT_1 << 37 : HOST_WIDE_INT_C (0x0aaa0000))
+#endif
diff --git a/gcc/testsuite/c-c++-common/asan/global-overflow-1.c b/gcc/testsuite/c-c++-common/asan/global-overflow-1.c
index 1092a316681..ec412231be0 100644
--- a/gcc/testsuite/c-c++-common/asan/global-overflow-1.c
+++ b/gcc/testsuite/c-c++-common/asan/global-overflow-1.c
@@ -22,6 +22,7 @@  int main() {
   return res;
 }
 
+/* { dg-skip-if "inaccurate debug info" { mips*-*-* } { "*" } { "-O0" } } */
 /* { dg-output "READ of size 1 at 0x\[0-9a-f\]+ thread T0.*(\n|\r\n|\r)" } */
 /* { dg-output "    #0 0x\[0-9a-f\]+ +(in _*main (\[^\n\r]*global-overflow-1.c:20|\[^\n\r]*:0|\[^\n\r]*\\+0x\[0-9a-z\]*)|\[(\])\[^\n\r]*(\n|\r\n|\r).*" } */
 /* { dg-output "0x\[0-9a-f\]+ is located 0 bytes to the right of global variable" } */
diff --git a/gcc/testsuite/g++.dg/asan/large-func-test-1.C b/gcc/testsuite/g++.dg/asan/large-func-test-1.C
index b42c09e3b0d..ac9deb898c8 100644
--- a/gcc/testsuite/g++.dg/asan/large-func-test-1.C
+++ b/gcc/testsuite/g++.dg/asan/large-func-test-1.C
@@ -35,6 +35,7 @@  int main() {
   delete x;
 }
 
+// { dg-skip-if "inaccurate debug info" { mips*-*-* } { "-Os" } { "" }  }
 // { dg-output "ERROR: AddressSanitizer:? heap-buffer-overflow on address\[^\n\r]*" }
 // { dg-output "0x\[0-9a-f\]+ at pc 0x\[0-9a-f\]+ bp 0x\[0-9a-f\]+ sp 0x\[0-9a-f\]+\[^\n\r]*(\n|\r\n|\r)" }
 // { dg-output "\[^\n\r]*READ of size 4 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" }
diff --git a/libsanitizer/configure.tgt b/libsanitizer/configure.tgt
index 5a59ea6a1b5..fb89df4935c 100644
--- a/libsanitizer/configure.tgt
+++ b/libsanitizer/configure.tgt
@@ -54,10 +54,6 @@  case "${target}" in
 	;;
   arm*-*-linux*)
 	;;
-  mips*64*-*-linux*)
-	# This clause is only here to not match the supported mips*-*-linux*.
-	UNSUPPORTED=1
-	;;
   mips*-*-linux*)
 	;;
   aarch64*-*-linux*)