Index: devel/llvm40/Makefile =================================================================== --- devel/llvm40/Makefile +++ devel/llvm40/Makefile @@ -339,6 +339,11 @@ post-extract-OPENMP-on: ${MV} ${WRKSRC_openmp} ${PATCH_WRKSRC}/tools/openmp +post-patch-COMPILER_RT-on: +.if ${OPSYS} == FreeBSD && ${OSVERSION} >= 1200031 + cd ${WRKSRC_compiler_rt} && patch < ${PATCHDIR}/compiler-rt-patch-ino64 +.endif + post-patch: ${REINPLACE_CMD} -e 's|import lit|import lit${LLVM_SUFFIX}|' \ -e 's|from lit|from lit${LLVM_SUFFIX}|' \ Index: devel/llvm40/files/compiler-rt-patch-ino64 =================================================================== --- devel/llvm40/files/compiler-rt-patch-ino64 +++ devel/llvm40/files/compiler-rt-patch-ino64 @@ -0,0 +1,49 @@ +diff --git lib/sanitizer_common/sanitizer_linux.cc lib/sanitizer_common/sanitizer_linux.cc +index 7328a5c0ac1..4b59a39ee27 100644 +--- lib/sanitizer_common/sanitizer_linux.cc ++++ lib/sanitizer_common/sanitizer_linux.cc +@@ -223,7 +223,8 @@ static void kernel_stat_to_stat(struct kernel_stat *in, struct stat *out) { + + uptr internal_stat(const char *path, void *buf) { + #if SANITIZER_FREEBSD +- return internal_syscall(SYSCALL(stat), path, buf); ++ return internal_syscall(SYSCALL(fstatat), AT_FDCWD, (uptr)path, ++ (uptr)buf, 0); + #elif SANITIZER_USES_CANONICAL_LINUX_SYSCALLS + return internal_syscall(SYSCALL(newfstatat), AT_FDCWD, (uptr)path, + (uptr)buf, 0); +@@ -247,7 +248,8 @@ uptr internal_stat(const char *path, void *buf) { + + uptr internal_lstat(const char *path, void *buf) { + #if SANITIZER_FREEBSD +- return internal_syscall(SYSCALL(lstat), path, buf); ++ return internal_syscall(SYSCALL(fstatat), AT_FDCWD, (uptr)path, ++ (uptr)buf, AT_SYMLINK_NOFOLLOW); + #elif SANITIZER_USES_CANONICAL_LINUX_SYSCALLS + return internal_syscall(SYSCALL(newfstatat), AT_FDCWD, (uptr)path, + (uptr)buf, AT_SYMLINK_NOFOLLOW); +@@ -590,7 +592,9 @@ uptr internal_getppid() { + } + + uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int count) { +-#if SANITIZER_USES_CANONICAL_LINUX_SYSCALLS ++#if SANITIZER_FREEBSD ++ return internal_syscall(SYSCALL(getdirentries), fd, (uptr)dirp, count, NULL); ++#elif SANITIZER_USES_CANONICAL_LINUX_SYSCALLS + return internal_syscall(SYSCALL(getdents64), fd, (uptr)dirp, count); + #else + return internal_syscall(SYSCALL(getdents), fd, (uptr)dirp, count); +diff --git lib/sanitizer_common/sanitizer_platform_limits_posix.h lib/sanitizer_common/sanitizer_platform_limits_posix.h +index 5cbd78d3c1b..d7ce7b501f7 100644 +--- lib/sanitizer_common/sanitizer_platform_limits_posix.h ++++ lib/sanitizer_common/sanitizer_platform_limits_posix.h +@@ -489,7 +489,8 @@ namespace __sanitizer { + }; + #elif SANITIZER_FREEBSD + struct __sanitizer_dirent { +- unsigned int d_fileno; ++ unsigned long long d_fileno; ++ unsigned long long d_off; + unsigned short d_reclen; + // more fields that we don't care about + };