-
Notifications
You must be signed in to change notification settings - Fork 15.2k
[libc] Refactor internal auxv usage to reduce getauxval dependencies #162489
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[libc] Refactor internal auxv usage to reduce getauxval dependencies #162489
Conversation
@llvm/pr-subscribers-libc Author: Schrodinger ZHU Yifan (SchrodingerZhu) ChangesCore Refactoring: Auxiliary Vector (auxv) ImplementationReplaced direct getauxval() calls with internal auxv interface:
Purpose: This refactoring removes direct dependencies on the Remaining Uses of libc.src.sys.auxv.getauxvalThe following CMake files still reference Test Infrastructure:
Unit Tests:
Full diff: https://github.com/llvm/llvm-project/pull/162489.diff 4 Files Affected:
diff --git a/libc/src/__support/OSUtil/linux/CMakeLists.txt b/libc/src/__support/OSUtil/linux/CMakeLists.txt
index f6377ca9ff5a2..dd06854eb65f3 100644
--- a/libc/src/__support/OSUtil/linux/CMakeLists.txt
+++ b/libc/src/__support/OSUtil/linux/CMakeLists.txt
@@ -70,11 +70,11 @@ add_object_library(
libc.src.__support.CPP.string_view
libc.src.__support.threads.callonce
libc.src.__support.threads.linux.futex_word_type
+ libc.src.__support.libc_errno
+ libc.src.__support.OSUtil.linux.auxv
libc.hdr.types.struct_timeval
libc.hdr.types.struct_timespec
libc.hdr.types.clockid_t
libc.hdr.types.time_t
libc.hdr.link_macros
- libc.src.errno.errno
- libc.src.sys.auxv.getauxval
)
diff --git a/libc/src/__support/OSUtil/linux/vdso.cpp b/libc/src/__support/OSUtil/linux/vdso.cpp
index e4e53c3c2a0f2..3a6369579ce5f 100644
--- a/libc/src/__support/OSUtil/linux/vdso.cpp
+++ b/libc/src/__support/OSUtil/linux/vdso.cpp
@@ -11,10 +11,10 @@
#include "src/__support/CPP/array.h"
#include "src/__support/CPP/optional.h"
#include "src/__support/CPP/string_view.h"
+#include "src/__support/OSUtil/linux/auxv.h"
#include "src/__support/libc_errno.h"
#include "src/__support/threads/callonce.h"
#include "src/__support/threads/linux/futex_word.h"
-#include "src/sys/auxv/getauxval.h"
#include <linux/auxvec.h>
// TODO: This is a temporary workaround to avoid including elf.h
@@ -192,7 +192,8 @@ void Symbol::initialize_vdso_global_cache() {
// get the address of the VDSO, protect errno since getauxval may change
// it
int errno_backup = libc_errno;
- uintptr_t vdso_ehdr_addr = getauxval(AT_SYSINFO_EHDR);
+ cpp::optional<unsigned long> auxv_res = auxv::get(AT_SYSINFO_EHDR);
+ uintptr_t vdso_ehdr_addr = auxv_res ? static_cast<uintptr_t>(*auxv_res) : 0;
// Get the memory address of the vDSO ELF header.
auto vdso_ehdr = reinterpret_cast<ElfW(Ehdr) *>(vdso_ehdr_addr);
// leave the table unpopulated if we don't have vDSO
diff --git a/libc/src/unistd/linux/CMakeLists.txt b/libc/src/unistd/linux/CMakeLists.txt
index dff6ba2db8a38..4eb3c7d3d7fae 100644
--- a/libc/src/unistd/linux/CMakeLists.txt
+++ b/libc/src/unistd/linux/CMakeLists.txt
@@ -563,8 +563,8 @@ add_entrypoint_object(
DEPENDS
libc.include.unistd
libc.include.sys_auxv
- libc.src.errno.errno
- libc.src.sys.auxv.getauxval
+ libc.src.__support.libc_errno
+ libc.src.__support.OSUtil.linux.auxv
)
add_entrypoint_object(
diff --git a/libc/src/unistd/linux/sysconf.cpp b/libc/src/unistd/linux/sysconf.cpp
index 03f224b150273..979e178cb45ee 100644
--- a/libc/src/unistd/linux/sysconf.cpp
+++ b/libc/src/unistd/linux/sysconf.cpp
@@ -11,17 +11,20 @@
#include "src/__support/common.h"
#include "hdr/unistd_macros.h"
+#include "src/__support/OSUtil/linux/auxv.h"
#include "src/__support/libc_errno.h"
#include "src/__support/macros/config.h"
-#include "src/sys/auxv/getauxval.h"
-#include <sys/auxv.h>
namespace LIBC_NAMESPACE_DECL {
LLVM_LIBC_FUNCTION(long, sysconf, (int name)) {
long ret = 0;
- if (name == _SC_PAGESIZE)
- return static_cast<long>(getauxval(AT_PAGESZ));
+ if (name == _SC_PAGESIZE) {
+ cpp::optional<unsigned long> page_size = auxv::get(AT_PAGESZ);
+ if (page_size)
+ return static_cast<long>(*page_size);
+ ret = -1;
+ }
// TODO: Complete the rest of the sysconf options.
if (ret < 0) {
|
Core Refactoring: Remove dependencies on external getauxval across libc
Replaced direct getauxval() calls with internal auxv interface:
Modified files:
libc/src/__support/OSUtil/linux/vdso.cpp
:getauxval(AT_SYSINFO_EHDR)
withauxv::get(AT_SYSINFO_EHDR)
libc/src/unistd/linux/sysconf.cpp
:getauxval(AT_PAGESZ)
withauxv::get(AT_PAGESZ)
Purpose: This refactoring removes direct dependencies on the
getauxval
entrypoint from internal libc code, making the implementation more modular and reducing coupling.Remaining Uses of libc.src.sys.auxv.getauxval
The following CMake files still reference
libc.src.sys.auxv.getauxval
:Test Infrastructure:
libc/test/IntegrationTest/CMakeLists.txt
(line 3):arch_specific_deps
for integration testslibc/test/integration/scudo/CMakeLists.txt
(line 24):libc/cmake/modules/LLVMLibCTestRules.cmake
(lines 839-845):Unit Tests:
libc/test/src/sys/auxv/linux/CMakeLists.txt
(line 11):