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,7 +14,8 @@ #include "sanitizer_allocator_internal.h" #include "sanitizer_atomic.h" #include "sanitizer_common.h" -#include "sanitizer_file.h" +# include "sanitizer_common/sanitizer_stacktrace.h" +# include "sanitizer_file.h" using namespace __sanitizer; @@ -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/include/llvm/ADT/Triple.h b/llvm/include/llvm/ADT/Triple.h --- a/llvm/include/llvm/ADT/Triple.h +++ b/llvm/include/llvm/ADT/Triple.h @@ -775,6 +775,12 @@ return getArch() == Triple::riscv32 || getArch() == Triple::riscv64; } + /// Tests whether the target is Sparc. + bool isSparc() const { + return getArch() == Triple::sparc || getArch() == Triple::sparcv9 || + getArch() == Triple::sparcel; + } + /// Tests whether the target is SystemZ. bool isSystemZ() const { return getArch() == Triple::systemz; 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 @@ -691,9 +691,9 @@ Triple TheTriple) { if (TheTriple.isARM()) { return (PC - 3) & (~1); - } else if (TheTriple.isAArch64()) { + } else if (TheTriple.isAArch64() || TheTriple.isPPC()) { return PC - 4; - } else if (TheTriple.isMIPS()) { + } else if (TheTriple.isMIPS() || TheTriple.isSparc()) { return PC - 8; } else { return PC - 1;