git: e760ac89f865 - stable/13 - powerpc: enable supported sanitizers on powerpc64*
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 21 May 2022 14:40:30 UTC
The branch stable/13 has been updated by pkubaj (ports committer):
URL: https://cgit.FreeBSD.org/src/commit/?id=e760ac89f86586e287cc2b49fcf4a679e12140f3
commit e760ac89f86586e287cc2b49fcf4a679e12140f3
Author: Piotr Kubaj <pkubaj@FreeBSD.org>
AuthorDate: 2022-05-17 06:39:29 +0000
Commit: Piotr Kubaj <pkubaj@FreeBSD.org>
CommitDate: 2022-05-21 14:40:14 +0000
powerpc: enable supported sanitizers on powerpc64*
1. Merge LLVM's 315d792130258a9b7250494be8d002ebb427b08f, adding support
for FreeBSD/powerpc64*.
2. Add sanitizer list to lib/libclang_rt/Makefile, taken from the list of
libraries that llvm-devel port builds.
3. powerpc64le supports the same sanitizers that powerpc64, but powerpc64le
also supports xray* sanitizers.
4. lib/libclang_rt/xray/Makefile hardcodes amd64-specific files, so that needs
to be conditionalized.
5. Sanitizers are not enabled for powerpc, because powerpc supports only
builtins and profile.
Reviewed by: dim
Differential Revision: https://reviews.freebsd.org/D35228
Relnotes: yes
MFC after: 3 days
(cherry picked from commit f5024381ac16ba43d37a8bd32d54c27f6a6afa66)
---
.../lib/sanitizer_common/sanitizer_linux.cpp | 34 +++++++++++++---------
.../compiler-rt/lib/xray/xray_powerpc64.inc | 15 ++++++++++
lib/libclang_rt/Makefile | 24 +++++++++++++++
lib/libclang_rt/xray/Makefile | 11 ++++++-
4 files changed, 70 insertions(+), 14 deletions(-)
diff --git a/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp b/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
index 769e8029dfcb..193a7fa8b1c5 100644
--- a/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
+++ b/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
@@ -2099,12 +2099,19 @@ static void GetPcSpBp(void *context, uptr *pc, uptr *sp, uptr *bp) {
*sp = ucontext->uc_mcontext.gregs[REG_UESP];
# endif
#elif defined(__powerpc__) || defined(__powerpc64__)
+# if SANITIZER_FREEBSD
+ ucontext_t *ucontext = (ucontext_t *)context;
+ *pc = ucontext->uc_mcontext.mc_srr0;
+ *sp = ucontext->uc_mcontext.mc_frame[1];
+ *bp = ucontext->uc_mcontext.mc_frame[31];
+# else
ucontext_t *ucontext = (ucontext_t*)context;
*pc = ucontext->uc_mcontext.regs->nip;
*sp = ucontext->uc_mcontext.regs->gpr[PT_R1];
// The powerpc{,64}-linux ABIs do not specify r31 as the frame
// pointer, but GCC always uses r31 when we need a frame pointer.
*bp = ucontext->uc_mcontext.regs->gpr[PT_R31];
+# endif
#elif defined(__sparc__)
#if defined(__arch64__) || defined(__sparcv9)
#define STACK_BIAS 2047
@@ -2188,17 +2195,6 @@ void CheckASLR() {
GetArgv()[0]);
Die();
}
-#elif SANITIZER_PPC64V2
- // Disable ASLR for Linux PPC64LE.
- int old_personality = personality(0xffffffff);
- if (old_personality != -1 && (old_personality & ADDR_NO_RANDOMIZE) == 0) {
- VReport(1, "WARNING: Program is being run with address space layout "
- "randomization (ASLR) enabled which prevents the thread and "
- "memory sanitizers from working on powerpc64le.\n"
- "ASLR will be disabled and the program re-executed.\n");
- CHECK_NE(personality(old_personality | ADDR_NO_RANDOMIZE), -1);
- ReExec();
- }
#elif SANITIZER_FREEBSD
int aslr_status;
if (UNLIKELY(procctl(P_PID, 0, PROC_ASLR_STATUS, &aslr_status) == -1)) {
@@ -2215,6 +2211,18 @@ void CheckASLR() {
CHECK_NE(procctl(P_PID, 0, PROC_ASLR_CTL, &aslr_ctl), -1);
ReExec();
}
+# elif SANITIZER_PPC64V2
+ // Disable ASLR for Linux PPC64LE.
+ int old_personality = personality(0xffffffff);
+ if (old_personality != -1 && (old_personality & ADDR_NO_RANDOMIZE) == 0) {
+ VReport(1,
+ "WARNING: Program is being run with address space layout "
+ "randomization (ASLR) enabled which prevents the thread and "
+ "memory sanitizers from working on powerpc64le.\n"
+ "ASLR will be disabled and the program re-executed.\n");
+ CHECK_NE(personality(old_personality | ADDR_NO_RANDOMIZE), -1);
+ ReExec();
+ }
#else
// Do nothing
#endif
@@ -2239,9 +2247,9 @@ void CheckMPROTECT() {
Printf("This sanitizer is not compatible with enabled MPROTECT\n");
Die();
}
-#else
+# else
// Do nothing
-#endif
+# endif
}
void CheckNoDeepBind(const char *filename, int flag) {
diff --git a/contrib/llvm-project/compiler-rt/lib/xray/xray_powerpc64.inc b/contrib/llvm-project/compiler-rt/lib/xray/xray_powerpc64.inc
index e4e16d5b28e0..7e872b5b42e6 100644
--- a/contrib/llvm-project/compiler-rt/lib/xray/xray_powerpc64.inc
+++ b/contrib/llvm-project/compiler-rt/lib/xray/xray_powerpc64.inc
@@ -12,7 +12,22 @@
#include <cstdint>
#include <mutex>
+#ifdef __linux__
#include <sys/platform/ppc.h>
+#elif defined(__FreeBSD__)
+#include <sys/types.h>
+#include <sys/sysctl.h>
+
+#define __ppc_get_timebase __builtin_ppc_get_timebase
+
+uint64_t __ppc_get_timebase_freq (void)
+{
+ uint64_t tb_freq = 0;
+ size_t length = sizeof(tb_freq);
+ sysctlbyname("kern.timecounter.tc.timebase.frequency", &tb_freq, &length, nullptr, 0);
+ return tb_freq;
+}
+#endif
#include "xray_defs.h"
diff --git a/lib/libclang_rt/Makefile b/lib/libclang_rt/Makefile
index 952b7ea8806a..2ad4bbe78d51 100644
--- a/lib/libclang_rt/Makefile
+++ b/lib/libclang_rt/Makefile
@@ -30,6 +30,30 @@ SUBDIR+= xray-fdr
SUBDIR+= xray-profiling
.endif # amd64
+.if ${MACHINE_ARCH} == "powerpc64" || ${MACHINE_ARCH} == "powerpc64le"
+SUBDIR+= include
+SUBDIR+= asan
+SUBDIR+= asan-preinit
+SUBDIR+= asan_cxx
+SUBDIR+= asan_dynamic
+SUBDIR+= msan
+SUBDIR+= msan_cxx
+SUBDIR+= stats
+SUBDIR+= stats_client
+SUBDIR+= tsan
+SUBDIR+= tsan_cxx
+SUBDIR+= ubsan_minimal
+SUBDIR+= ubsan_standalone
+SUBDIR+= ubsan_standalone_cxx
+.endif # powerpc64 || powerpc64le
+
+.if ${MACHINE_ARCH} == "powerpc64le"
+SUBDIR+= xray
+SUBDIR+= xray-basic
+SUBDIR+= xray-fdr
+SUBDIR+= xray-profiling
+.endif # powerpc64le
+
.if ${MACHINE_CPUARCH} == "riscv"
SUBDIR+= include
SUBDIR+= asan
diff --git a/lib/libclang_rt/xray/Makefile b/lib/libclang_rt/xray/Makefile
index 60ed642d330a..25eaac3304c0 100644
--- a/lib/libclang_rt/xray/Makefile
+++ b/lib/libclang_rt/xray/Makefile
@@ -38,9 +38,18 @@ SRCS+= xray/xray_flags.cpp
SRCS+= xray/xray_init.cpp
SRCS+= xray/xray_interface.cpp
SRCS+= xray/xray_log_interface.cpp
-SRCS+= xray/xray_trampoline_x86_64.S
SRCS+= xray/xray_utils.cpp
+
+.if ${MACHINE_CPUARCH} == amd64
+SRCS+= xray/xray_trampoline_x86_64.S
SRCS+= xray/xray_x86_64.cpp
+.endif # amd64
+
+.if ${MACHINE_ARCH} == powerpc64le
+SRCS+= xray/xray_powerpc64.cpp
+SRCS+= xray/xray_trampoline_powerpc64.cpp
+SRCS+= xray/xray_trampoline_powerpc64_asm.S
+.endif # powerpc64le
.PATH: ${CRTSRC}/include/xray
INCSDIR= ${CLANGDIR}/include/xray