[Sanitizers][Darwin] Add READ/WRITE detection on arm64 for darwin.
authorBlue Gaston <bgaston2@apple.com>
Wed, 11 May 2022 19:52:32 +0000 (12:52 -0700)
committerBlue Gaston <bgaston2@apple.com>
Thu, 12 May 2022 17:51:49 +0000 (10:51 -0700)
On arm64 the read/write flag is set on the esr register.
Adding this flag check for arm64 enables a more accurate
print out for sanitizer signal reports and matches the
behavior on x86.

Fixes bug: https://bugs.llvm.org/show_bug.cgi?id=27543 https://github.com/google/sanitizers/issues/653

These tests are now passing:
SanitizerCommon-asan-arm64-Darwin :: Posix/illegal_read_test.cpp
SanitizerCommon-asan-arm64-Darwin :: Posix/illegal_write_test.cpp
SanitizerCommon-asan-arm64e-Darwin :: Posix/illegal_read_test.cpp
   SanitizerCommon-asan-arm64e-Darwin :: Posix/illegal_write_test.cpp
   SanitizerCommon-tsan-arm64-Darwin :: Posix/illegal_read_test.cpp
   SanitizerCommon-tsan-arm64-Darwin :: Posix/illegal_write_test.cpp
   SanitizerCommon-tsan-arm64e-Darwin :: Posix/illegal_read_test.cpp
   SanitizerCommon-tsan-arm64e-Darwin :: Posix/illegal_write_test.cpp
   SanitizerCommon-ubsan-arm64-Darwin :: Posix/illegal_read_test.cpp
   SanitizerCommon-ubsan-arm64-Darwin :: Posix/illegal_write_test.cpp
   SanitizerCommon-ubsan-arm64e-Darwin :: Posix/illegal_read_test.cpp
   SanitizerCommon-ubsan-arm64e-Darwin :: Posix/illegal_write_test.cpp

rdar://92104440

Differential Revision: https://reviews.llvm.org/D125416

compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp

index 05512a5..bc3903d 100644 (file)
@@ -880,6 +880,9 @@ SignalContext::WriteFlag SignalContext::GetWriteFlag() const {
 #if defined(__x86_64__) || defined(__i386__)
   ucontext_t *ucontext = static_cast<ucontext_t*>(context);
   return ucontext->uc_mcontext->__es.__err & 2 /*T_PF_WRITE*/ ? Write : Read;
+#elif defined(__arm64__)
+  ucontext_t *ucontext = static_cast<ucontext_t*>(context);
+  return ucontext->uc_mcontext->__es.__esr & 0x40 /*ISS_DA_WNR*/ ? Write : Read;
 #else
   return Unknown;
 #endif