Xi Ruoyao <xry...@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*)