Skip to content

Commit

Permalink
[sanitizer] Fix build on FreeBSD RISC-V
Browse files Browse the repository at this point in the history
We have to avoid calling renameat2 and clone on FreeBSD.
Additionally, the mcontext structure has different members.

Reviewed By: jrtc27, luismarques

Differential Revision: https://reviews.llvm.org/D103886
  • Loading branch information
arichardson committed Aug 26, 2021
1 parent de15979 commit b475ce3
Showing 1 changed file with 17 additions and 5 deletions.
22 changes: 17 additions & 5 deletions compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
Expand Up @@ -417,7 +417,7 @@ uptr internal_unlink(const char *path) {
}

uptr internal_rename(const char *oldpath, const char *newpath) {
#if defined(__riscv)
#if defined(__riscv) && defined(__linux__)
return internal_syscall(SYSCALL(renameat2), AT_FDCWD, (uptr)oldpath, AT_FDCWD,
(uptr)newpath, 0);
#elif SANITIZER_USES_CANONICAL_LINUX_SYSCALLS
Expand Down Expand Up @@ -1177,7 +1177,8 @@ void ForEachMappedRegion(link_map *map, void (*cb)(const void *, uptr)) {
}
#endif

#if defined(__x86_64__) && SANITIZER_LINUX
#if SANITIZER_LINUX
#if defined(__x86_64__)
// We cannot use glibc's clone wrapper, because it messes with the child
// task's TLS. It writes the PID and TID of the child task to its thread
// descriptor, but in our case the child task shares the thread descriptor with
Expand Down Expand Up @@ -1516,7 +1517,7 @@ uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
: "cr0", "cr1", "memory", "ctr", "r0", "r27", "r28", "r29");
return res;
}
#elif defined(__i386__) && SANITIZER_LINUX
#elif defined(__i386__)
uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
int *parent_tidptr, void *newtls, int *child_tidptr) {
int res;
Expand Down Expand Up @@ -1581,7 +1582,7 @@ uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
: "memory");
return res;
}
#elif defined(__arm__) && SANITIZER_LINUX
#elif defined(__arm__)
uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
int *parent_tidptr, void *newtls, int *child_tidptr) {
unsigned int res;
Expand Down Expand Up @@ -1647,7 +1648,8 @@ uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
: "memory");
return res;
}
#endif // defined(__x86_64__) && SANITIZER_LINUX
#endif
#endif // SANITIZER_LINUX

#if SANITIZER_LINUX
int internal_uname(struct utsname *buf) {
Expand Down Expand Up @@ -1877,7 +1879,11 @@ SignalContext::WriteFlag SignalContext::GetWriteFlag() const {
u32 instr = *(u32 *)pc;
return (instr >> 21) & 1 ? WRITE: READ;
#elif defined(__riscv)
#if SANITIZER_FREEBSD
unsigned long pc = ucontext->uc_mcontext.mc_gpregs.gp_sepc;
#else
unsigned long pc = ucontext->uc_mcontext.__gregs[REG_PC];
#endif
unsigned faulty_instruction = *(uint16_t *)pc;

#if defined(__riscv_compressed)
Expand Down Expand Up @@ -2096,9 +2102,15 @@ static void GetPcSpBp(void *context, uptr *pc, uptr *sp, uptr *bp) {
*sp = ucontext->uc_mcontext.gregs[15];
#elif defined(__riscv)
ucontext_t *ucontext = (ucontext_t*)context;
# if SANITIZER_FREEBSD
*pc = ucontext->uc_mcontext.mc_gpregs.gp_sepc;
*bp = ucontext->uc_mcontext.mc_gpregs.gp_s[0];
*sp = ucontext->uc_mcontext.mc_gpregs.gp_sp;
# else
*pc = ucontext->uc_mcontext.__gregs[REG_PC];
*bp = ucontext->uc_mcontext.__gregs[REG_S0];
*sp = ucontext->uc_mcontext.__gregs[REG_SP];
# endif
# elif defined(__hexagon__)
ucontext_t *ucontext = (ucontext_t *)context;
*pc = ucontext->uc_mcontext.pc;
Expand Down

0 comments on commit b475ce3

Please sign in to comment.