[libc-commits] [libc] [libc] Introduce a typed syscall wrapper and use it in mmap (PR #197459)

Pavel Labath via libc-commits libc-commits at lists.llvm.org
Thu May 14 05:13:15 PDT 2026


================
@@ -29,24 +30,31 @@
 
 namespace LIBC_NAMESPACE_DECL {
 
+// This function performs no error checking. For most syscalls, it's better to
+// use __syscall below.
 template <typename R, typename... Ts>
 LIBC_INLINE R syscall_impl(long __number, Ts... ts) {
   static_assert(sizeof...(Ts) <= 6, "Too many arguments for syscall");
   return cpp::bit_or_static_cast<R>(syscall_impl(__number, (long)ts...));
 }
 
-// Linux-specific function for checking
-namespace linux_utils {
+namespace linux_syscalls {
 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));
+
+// Helper function to perform a system call, check the result and cast the
+// result to the expected type. This function is safe to use on most syscalls,
+// with the exception of a handful of syscalls (getpid, getuid, ...) that never
+// fail.
+template <typename R, typename... Ts>
+LIBC_INLINE ErrorOr<R> __syscall(long __number, Ts... ts) {
----------------
labath wrote:

Going with syscall_checked

https://github.com/llvm/llvm-project/pull/197459


More information about the libc-commits mailing list