From 56b5f001869664a1449e5e0fec677089153bf8c8 Mon Sep 17 00:00:00 2001 From: Xiaodong Liu Date: Thu, 24 Feb 2022 17:14:24 +0800 Subject: [PATCH] [sancov][sanitizer-common] Correct sanitizer coverage point Sanitizer coverage point should be the previous instruction PC of the caller and the offset to the previous instruction might be different on each CPU architecture. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D119233 --- .../lib/sanitizer_common/sanitizer_coverage_libcdep_new.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_coverage_libcdep_new.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_coverage_libcdep_new.cpp index 6cf7cfb5722e3..3dcb39f32f6c2 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_coverage_libcdep_new.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_coverage_libcdep_new.cpp @@ -14,6 +14,7 @@ # include "sanitizer_allocator_internal.h" # include "sanitizer_atomic.h" # include "sanitizer_common.h" +# include "sanitizer_common/sanitizer_stacktrace.h" # include "sanitizer_file.h" # include "sanitizer_interface_internal.h" @@ -222,7 +223,8 @@ SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_dump_coverage(const uptr* pcs, SANITIZER_INTERFACE_WEAK_DEF(void, __sanitizer_cov_trace_pc_guard, u32* guard) { if (!*guard) return; - __sancov::pc_guard_controller.TracePcGuard(guard, GET_CALLER_PC() - 1); + __sancov::pc_guard_controller.TracePcGuard( + guard, StackTrace::GetPreviousInstructionPc(GET_CALLER_PC())); } SANITIZER_INTERFACE_WEAK_DEF(void, __sanitizer_cov_trace_pc_guard_init,