git: f5024381ac16 - main - powerpc: enable supported sanitizers on powerpc64*

From: Piotr Kubaj <pkubaj_at_FreeBSD.org>
Date: Tue, 17 May 2022 19:47:01 UTC
The branch main has been updated by pkubaj (ports committer):

URL: https://cgit.FreeBSD.org/src/commit/?id=f5024381ac16ba43d37a8bd32d54c27f6a6afa66

commit f5024381ac16ba43d37a8bd32d54c27f6a6afa66
Author:     Piotr Kubaj <pkubaj@FreeBSD.org>
AuthorDate: 2022-05-17 06:39:29 +0000
Commit:     Piotr Kubaj <pkubaj@FreeBSD.org>
CommitDate: 2022-05-17 19:46:53 +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
---
 .../lib/sanitizer_common/sanitizer_linux.cpp       | 34 +++++++++++++---------
 .../compiler-rt/lib/xray/xray_powerpc64.inc        | 15 ++++++++++
 lib/libclang_rt/Makefile                           | 25 ++++++++++++++++
 lib/libclang_rt/xray/Makefile                      | 11 ++++++-
 4 files changed, 71 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 9f8cc5e6f4c3..778a79b1dfa3 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
@@ -2080,12 +2080,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
@@ -2174,17 +2181,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)) {
@@ -2201,6 +2197,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
@@ -2225,9 +2233,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 0f9a123b0fba..6c6aa2af2a5f 100644
--- a/lib/libclang_rt/Makefile
+++ b/lib/libclang_rt/Makefile
@@ -32,6 +32,31 @@ 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+=	asan_static
+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 ce2d725710e8..252c42211837 100644
--- a/lib/libclang_rt/xray/Makefile
+++ b/lib/libclang_rt/xray/Makefile
@@ -37,9 +37,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