diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_coverage_libcdep_new.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_coverage_libcdep_new.cpp --- 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_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, diff --git a/llvm/tools/sancov/sancov.cpp b/llvm/tools/sancov/sancov.cpp --- a/llvm/tools/sancov/sancov.cpp +++ b/llvm/tools/sancov/sancov.cpp @@ -694,7 +694,7 @@ Triple TheTriple) { if (TheTriple.isARM()) return (PC - 3) & (~1); - if (TheTriple.isMIPS()) + if (TheTriple.isMIPS() || TheTriple.isSparc()) return PC - 8; if (TheTriple.isRISCV()) return PC - 2;