[libc-commits] [libc] 6f4e4ea - [libc] Internal getrandom implementation (#144427)
via libc-commits
libc-commits at lists.llvm.org
Wed Jun 18 10:57:01 PDT 2025
Author: sribee8
Date: 2025-06-18T17:56:57Z
New Revision: 6f4e4ea17745d1414519651eb4067ce14031ea93
URL: https://github.com/llvm/llvm-project/commit/6f4e4ea17745d1414519651eb4067ce14031ea93
DIFF: https://github.com/llvm/llvm-project/commit/6f4e4ea17745d1414519651eb4067ce14031ea93.diff
LOG: [libc] Internal getrandom implementation (#144427)
Implemented an internal getrandom to avoid calls to the public one in
table.h
---------
Co-authored-by: Sriya Pratipati <sriyap at google.com>
Added:
libc/src/__support/OSUtil/linux/getrandom.h
Modified:
libc/src/__support/HashTable/CMakeLists.txt
libc/src/__support/HashTable/randomness.h
libc/src/__support/OSUtil/linux/CMakeLists.txt
libc/src/sys/random/linux/getrandom.cpp
Removed:
################################################################################
diff --git a/libc/src/__support/HashTable/CMakeLists.txt b/libc/src/__support/HashTable/CMakeLists.txt
index a1de0680cc7d5..698b8d0dfa68b 100644
--- a/libc/src/__support/HashTable/CMakeLists.txt
+++ b/libc/src/__support/HashTable/CMakeLists.txt
@@ -15,7 +15,8 @@ if (NOT ${getrandom_index} EQUAL -1)
message(STATUS "Using getrandom for hashtable randomness")
set(randomness_compile_flags -DLIBC_HASHTABLE_USE_GETRANDOM)
set(randomness_extra_depends
- libc.src.sys.random.getrandom libc.src.errno.errno)
+ libc.src.__support.OSUtil.linux.getrandom
+ libc.hdr.errno_macros)
endif()
diff --git a/libc/src/__support/HashTable/randomness.h b/libc/src/__support/HashTable/randomness.h
index 6b58a4125f785..7e54c9aa6ad1f 100644
--- a/libc/src/__support/HashTable/randomness.h
+++ b/libc/src/__support/HashTable/randomness.h
@@ -14,8 +14,8 @@
#include "src/__support/macros/attributes.h"
#include "src/__support/macros/config.h"
#if defined(LIBC_HASHTABLE_USE_GETRANDOM)
-#include "src/__support/libc_errno.h"
-#include "src/sys/random/getrandom.h"
+#include "hdr/errno_macros.h"
+#include "src/__support/OSUtil/linux/getrandom.h"
#endif
namespace LIBC_NAMESPACE_DECL {
@@ -35,20 +35,18 @@ LIBC_INLINE uint64_t next_random_seed() {
entropy[0] = reinterpret_cast<uint64_t>(&entropy);
entropy[1] = reinterpret_cast<uint64_t>(&state);
#if defined(LIBC_HASHTABLE_USE_GETRANDOM)
- int errno_backup = libc_errno;
size_t count = sizeof(entropy);
uint8_t *buffer = reinterpret_cast<uint8_t *>(entropy);
while (count > 0) {
- ssize_t len = getrandom(buffer, count, 0);
- if (len == -1) {
- if (libc_errno == ENOSYS)
+ auto len = internal::getrandom(buffer, count, 0);
+ if (!len.has_value()) {
+ if (len.error() == ENOSYS)
break;
continue;
}
- count -= len;
- buffer += len;
+ count -= len.value();
+ buffer += len.value();
}
- libc_errno = errno_backup;
#endif
state.update(&entropy, sizeof(entropy));
}
diff --git a/libc/src/__support/OSUtil/linux/CMakeLists.txt b/libc/src/__support/OSUtil/linux/CMakeLists.txt
index 4681d8c2bb73c..f303e54ce7b3b 100644
--- a/libc/src/__support/OSUtil/linux/CMakeLists.txt
+++ b/libc/src/__support/OSUtil/linux/CMakeLists.txt
@@ -24,6 +24,19 @@ add_object_library(
libc.include.sys_syscall
)
+add_header_library(
+ getrandom
+ HDRS
+ getrandom.h
+ DEPENDS
+ libc.src.__support.OSUtil.osutil
+ libc.src.__support.common
+ libc.src.__support.error_or
+ libc.src.__support.macros.config
+ libc.hdr.types.ssize_t
+ libc.include.sys_syscall
+)
+
add_header_library(
vdso_sym
HDRS
diff --git a/libc/src/__support/OSUtil/linux/getrandom.h b/libc/src/__support/OSUtil/linux/getrandom.h
new file mode 100644
index 0000000000000..793639472fee7
--- /dev/null
+++ b/libc/src/__support/OSUtil/linux/getrandom.h
@@ -0,0 +1,35 @@
+//===------------ Implementation of getrandom function ----------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_GETRANDOM_H
+#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_GETRANDOM_H
+
+#include "hdr/types/ssize_t.h"
+#include "src/__support/OSUtil/linux/syscall.h" // syscall_impl
+#include "src/__support/common.h"
+#include "src/__support/error_or.h"
+#include "src/__support/macros/config.h"
+#include <sys/syscall.h> // For syscall numbers
+
+namespace LIBC_NAMESPACE_DECL {
+namespace internal {
+
+LIBC_INLINE static ErrorOr<ssize_t> getrandom(void *buf, size_t buflen,
+ unsigned int flags) {
+ ssize_t ret =
+ LIBC_NAMESPACE::syscall_impl<ssize_t>(SYS_getrandom, buf, buflen, flags);
+ if (ret < 0) {
+ return Error(-static_cast<int>(ret));
+ }
+ return ret;
+}
+
+} // namespace internal
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_GETRANDOM_H
diff --git a/libc/src/sys/random/linux/getrandom.cpp b/libc/src/sys/random/linux/getrandom.cpp
index 0b8471ed8b374..4a95bddfa428e 100644
--- a/libc/src/sys/random/linux/getrandom.cpp
+++ b/libc/src/sys/random/linux/getrandom.cpp
@@ -8,24 +8,23 @@
#include "src/sys/random/getrandom.h"
+#include "src/__support/OSUtil/linux/getrandom.h"
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
#include "src/__support/common.h"
-
+#include "src/__support/error_or.h"
#include "src/__support/libc_errno.h"
#include "src/__support/macros/config.h"
-#include <sys/syscall.h> // For syscall numbers.
namespace LIBC_NAMESPACE_DECL {
LLVM_LIBC_FUNCTION(ssize_t, getrandom,
(void *buf, size_t buflen, unsigned int flags)) {
- ssize_t ret =
- LIBC_NAMESPACE::syscall_impl<ssize_t>(SYS_getrandom, buf, buflen, flags);
- if (ret < 0) {
- libc_errno = static_cast<int>(-ret);
+ auto rand = internal::getrandom(buf, buflen, flags);
+ if (!rand.has_value()) {
+ libc_errno = static_cast<int>(rand.error());
return -1;
}
- return ret;
+ return rand.value();
}
} // namespace LIBC_NAMESPACE_DECL
More information about the libc-commits
mailing list