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
This commit is contained in:
parent
9bf4983f54
commit
f5024381ac
@ -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) {
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user