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 --- 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 @@ *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 @@ 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 @@ 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 @@ 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 --- 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 #include +#ifdef __linux__ #include +#elif defined(__FreeBSD__) +#include +#include + +#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 --- a/lib/libclang_rt/Makefile +++ b/lib/libclang_rt/Makefile @@ -32,6 +32,31 @@ 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 --- a/lib/libclang_rt/xray/Makefile +++ b/lib/libclang_rt/xray/Makefile @@ -37,9 +37,18 @@ 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