diff options
Diffstat (limited to 'libc')
-rw-r--r-- | libc/docs/build_and_test.rst | 16 | ||||
-rw-r--r-- | libc/src/__support/OSUtil/linux/auxv.h | 3 | ||||
-rw-r--r-- | libc/src/__support/OSUtil/linux/syscall.h | 14 | ||||
-rw-r--r-- | libc/src/__support/threads/linux/thread.cpp | 2 | ||||
-rw-r--r-- | libc/src/sys/mman/linux/mmap.cpp | 2 | ||||
-rw-r--r-- | libc/startup/linux/aarch64/tls.cpp | 2 | ||||
-rw-r--r-- | libc/startup/linux/riscv/tls.cpp | 2 | ||||
-rw-r--r-- | libc/startup/linux/x86_64/tls.cpp | 2 |
8 files changed, 32 insertions, 11 deletions
diff --git a/libc/docs/build_and_test.rst b/libc/docs/build_and_test.rst index dfdd965..d608591 100644 --- a/libc/docs/build_and_test.rst +++ b/libc/docs/build_and_test.rst @@ -47,12 +47,18 @@ and put the following in your settings.json file: .. code-block:: javascript { - "cmake.sourceDirectory": "${workspaceFolder}/llvm", + "cmake.sourceDirectory": "${workspaceFolder}/runtimes", "cmake.configureSettings": { - "LLVM_ENABLE_PROJECTS" : "libc", - "LLVM_LIBC_FULL_BUILD" : true, - "LLVM_ENABLE_SPHINX" : true, - "LIBC_INCLUDE_DOCS" : true + "LLVM_ENABLE_RUNTIMES" : ["libc", "compiler-rt"], + "LLVM_LIBC_FULL_BUILD" : true, + "LLVM_ENABLE_SPHINX" : true, + "LIBC_INCLUDE_DOCS" : true, + "LLVM_LIBC_INCLUDE_SCUDO" : true, + "COMPILER_RT_BUILD_SCUDO_STANDALONE_WITH_LLVM_LIBC": true, + "COMPILER_RT_BUILD_GWP_ASAN" : false, + "COMPILER_RT_SCUDO_STANDALONE_BUILD_SHARED" : false, + "CMAKE_EXPORT_COMPILE_COMMANDS" : true, + "LIBC_CMAKE_VERBOSE_LOGGING" : true } } diff --git a/libc/src/__support/OSUtil/linux/auxv.h b/libc/src/__support/OSUtil/linux/auxv.h index 894868a..9c07c54 100644 --- a/libc/src/__support/OSUtil/linux/auxv.h +++ b/libc/src/__support/OSUtil/linux/auxv.h @@ -16,6 +16,7 @@ #include <linux/auxvec.h> // For AT_ macros #include <linux/mman.h> // For mmap flags +#include <linux/param.h> // For EXEC_PAGESIZE #include <linux/prctl.h> // For prctl #include <sys/syscall.h> // For syscall numbers @@ -90,7 +91,7 @@ LIBC_INLINE void Vector::fallback_initialize_unsync() { PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); // We do not proceed if mmap fails. - if (mmap_ret <= 0) + if (!linux_utils::is_valid_mmap(mmap_ret)) return; // Initialize the auxv array with AT_NULL entries. diff --git a/libc/src/__support/OSUtil/linux/syscall.h b/libc/src/__support/OSUtil/linux/syscall.h index 24e0fca..0e25618 100644 --- a/libc/src/__support/OSUtil/linux/syscall.h +++ b/libc/src/__support/OSUtil/linux/syscall.h @@ -12,6 +12,7 @@ #include "src/__support/CPP/bit.h" #include "src/__support/common.h" #include "src/__support/macros/config.h" +#include "src/__support/macros/optimization.h" #include "src/__support/macros/properties/architectures.h" #ifdef LIBC_TARGET_ARCH_IS_X86_32 @@ -34,6 +35,19 @@ LIBC_INLINE R syscall_impl(long __number, Ts... ts) { return cpp::bit_or_static_cast<R>(syscall_impl(__number, (long)ts...)); } +// Linux-specific function for checking +namespace linux_utils { +LIBC_INLINE_VAR constexpr unsigned long MAX_ERRNO = 4095; +// Ideally, this should be defined using PAGE_OFFSET +// However, that is a configurable parameter. We mimic kernel's behavior +// by checking against MAX_ERRNO. +template <typename PointerLike> +LIBC_INLINE constexpr bool is_valid_mmap(PointerLike ptr) { + long addr = cpp::bit_cast<long>(ptr); + return LIBC_LIKELY(addr > 0 || addr < -static_cast<long>(MAX_ERRNO)); +} +} // namespace linux_utils + } // namespace LIBC_NAMESPACE_DECL #endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_SYSCALL_H diff --git a/libc/src/__support/threads/linux/thread.cpp b/libc/src/__support/threads/linux/thread.cpp index d9e479ee..4f1e911 100644 --- a/libc/src/__support/threads/linux/thread.cpp +++ b/libc/src/__support/threads/linux/thread.cpp @@ -100,7 +100,7 @@ LIBC_INLINE ErrorOr<void *> alloc_stack(size_t stacksize, size_t guardsize) { -1, // Not backed by any file 0 // No offset ); - if (mmap_result < 0 && (uintptr_t(mmap_result) >= UINTPTR_MAX - size)) + if (!linux_utils::is_valid_mmap(mmap_result)) return Error{int(-mmap_result)}; if (guardsize) { diff --git a/libc/src/sys/mman/linux/mmap.cpp b/libc/src/sys/mman/linux/mmap.cpp index 33f9fe8..76a6611 100644 --- a/libc/src/sys/mman/linux/mmap.cpp +++ b/libc/src/sys/mman/linux/mmap.cpp @@ -56,7 +56,7 @@ LLVM_LIBC_FUNCTION(void *, mmap, // However, since a valid return address cannot be within the last page, a // return value corresponding to a location in the last page is an error // value. - if (ret < 0 && ret > -EXEC_PAGESIZE) { + if (!linux_utils::is_valid_mmap(ret)) { libc_errno = static_cast<int>(-ret); return MAP_FAILED; } diff --git a/libc/startup/linux/aarch64/tls.cpp b/libc/startup/linux/aarch64/tls.cpp index ea1b50c..7847797 100644 --- a/libc/startup/linux/aarch64/tls.cpp +++ b/libc/startup/linux/aarch64/tls.cpp @@ -62,7 +62,7 @@ void init_tls(TLSDescriptor &tls_descriptor) { MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); // We cannot check the return value with MAP_FAILED as that is the return // of the mmap function and not the mmap syscall. - if (mmap_ret_val < 0 && static_cast<uintptr_t>(mmap_ret_val) > -app.page_size) + if (!linux_utils::is_valid_mmap(mmap_ret_val)) syscall_impl<long>(SYS_exit, 1); uintptr_t thread_ptr = uintptr_t(reinterpret_cast<uintptr_t *>(mmap_ret_val)); uintptr_t tls_addr = thread_ptr + size_of_pointers + padding; diff --git a/libc/startup/linux/riscv/tls.cpp b/libc/startup/linux/riscv/tls.cpp index 04d44e6..e9d23c5 100644 --- a/libc/startup/linux/riscv/tls.cpp +++ b/libc/startup/linux/riscv/tls.cpp @@ -50,7 +50,7 @@ void init_tls(TLSDescriptor &tls_descriptor) { MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); // We cannot check the return value with MAP_FAILED as that is the return // of the mmap function and not the mmap syscall. - if (mmap_ret_val < 0 && static_cast<uintptr_t>(mmap_ret_val) > -app.page_size) + if (!linux_utils::is_valid_mmap(mmap_ret_val)) syscall_impl<long>(SYS_exit, 1); uintptr_t thread_ptr = uintptr_t(reinterpret_cast<uintptr_t *>(mmap_ret_val)); uintptr_t tls_addr = thread_ptr + size_of_pointers + padding; diff --git a/libc/startup/linux/x86_64/tls.cpp b/libc/startup/linux/x86_64/tls.cpp index d6b549a..497f744 100644 --- a/libc/startup/linux/x86_64/tls.cpp +++ b/libc/startup/linux/x86_64/tls.cpp @@ -53,7 +53,7 @@ void init_tls(TLSDescriptor &tls_descriptor) { MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); // We cannot check the return value with MAP_FAILED as that is the return // of the mmap function and not the mmap syscall. - if (mmap_retval < 0 && static_cast<uintptr_t>(mmap_retval) > -app.page_size) + if (!linux_utils::is_valid_mmap(mmap_retval)) syscall_impl<long>(SYS_exit, 1); uintptr_t *tls_addr = reinterpret_cast<uintptr_t *>(mmap_retval); |