https://github.com/izaakschroeder updated https://github.com/llvm/llvm-project/pull/97231
>From 31dc769c1866a4a0100dde0a3743c215a9a5f5eb Mon Sep 17 00:00:00 2001 From: Izaak Schroeder <izaak.schroe...@gmail.com> Date: Sun, 30 Jun 2024 13:33:16 -0700 Subject: [PATCH 01/10] [libc]: add missing aarch64 headers --- libc/config/linux/aarch64/entrypoints.txt | 3 +++ libc/config/linux/aarch64/headers.txt | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index 8a26536cea9a0..b59400db81fed 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -308,6 +308,9 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.unistd.unlink libc.src.unistd.unlinkat libc.src.unistd.write + + # XXX + libc.src.assert.__assert_fail ) set(TARGET_LIBM_ENTRYPOINTS diff --git a/libc/config/linux/aarch64/headers.txt b/libc/config/linux/aarch64/headers.txt index 7d25877cefcc8..ed126d6128871 100644 --- a/libc/config/linux/aarch64/headers.txt +++ b/libc/config/linux/aarch64/headers.txt @@ -31,4 +31,10 @@ set(TARGET_PUBLIC_HEADERS libc.include.sys_ioctl # Disabled due to epoll_wait syscalls not being available on this platform. # libc.include.sys_epoll + + # XXX + libc.include.sys_auxv + libc.include.fcntl + libc.include.sched + libc.include.sys_stat ) >From a5f8ee220c088a39d9b4bf60986166e83ffafffa Mon Sep 17 00:00:00 2001 From: Izaak Schroeder <izaak.schroe...@gmail.com> Date: Sun, 30 Jun 2024 13:33:38 -0700 Subject: [PATCH 02/10] [libunwind]: remove needless `sys/uio.h` No reference to `readv` or `writev`. --- libunwind/src/UnwindCursor.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libunwind/src/UnwindCursor.hpp b/libunwind/src/UnwindCursor.hpp index 66fe8e2a32cca..677e842d8a22b 100644 --- a/libunwind/src/UnwindCursor.hpp +++ b/libunwind/src/UnwindCursor.hpp @@ -36,7 +36,6 @@ #include <errno.h> #include <signal.h> #include <sys/syscall.h> -#include <sys/uio.h> #include <unistd.h> #define _LIBUNWIND_CHECK_LINUX_SIGRETURN 1 #endif >From 1083aecfe1be3c1cf427d4ffd2b4fad3d5129d4c Mon Sep 17 00:00:00 2001 From: Izaak Schroeder <izaak.schroe...@gmail.com> Date: Sun, 30 Jun 2024 13:44:52 -0700 Subject: [PATCH 03/10] [libc]: function spec for `getauxval` --- libc/spec/gnu_ext.td | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libc/spec/gnu_ext.td b/libc/spec/gnu_ext.td index 161bb4e4a0d9d..e360c766c5c54 100644 --- a/libc/spec/gnu_ext.td +++ b/libc/spec/gnu_ext.td @@ -237,7 +237,11 @@ def GnuExtensions : StandardSpec<"GNUExtensions"> { [], // Types [], // Enumerations [ - //TODO: Add getauxval here + FunctionSpec< + "getauxval", + RetValSpec<UnsignedLongType>, + [ArgSpec<UnsignedLongType>] + >, ] // Functions >; >From e9628ce037c225c3769cec2589745f7978e7edc4 Mon Sep 17 00:00:00 2001 From: Izaak Schroeder <izaak.schroe...@gmail.com> Date: Sun, 30 Jun 2024 14:06:19 -0700 Subject: [PATCH 04/10] [libc]: hack `ExitCallbackList` always public --- libc/src/stdlib/exit_handler.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libc/src/stdlib/exit_handler.h b/libc/src/stdlib/exit_handler.h index 8494c2f2e526e..db731a46f44c9 100644 --- a/libc/src/stdlib/exit_handler.h +++ b/libc/src/stdlib/exit_handler.h @@ -31,10 +31,8 @@ struct AtExitUnit { #if defined(LIBC_TARGET_ARCH_IS_GPU) using ExitCallbackList = FixedVector<AtExitUnit, 64>; -#elif defined(LIBC_COPT_PUBLIC_PACKAGING) -using ExitCallbackList = ReverseOrderBlockStore<AtExitUnit, 32>; #else -using ExitCallbackList = FixedVector<AtExitUnit, CALLBACK_LIST_SIZE_FOR_TESTS>; +using ExitCallbackList = ReverseOrderBlockStore<AtExitUnit, 32>; #endif extern ExitCallbackList atexit_callbacks; >From e3ed9aac99ede8be5d6d228f43c652423206e67c Mon Sep 17 00:00:00 2001 From: Izaak Schroeder <izaak.schroe...@gmail.com> Date: Sun, 30 Jun 2024 14:15:21 -0700 Subject: [PATCH 05/10] [libc]: add `Scrt1.o` --- libc/startup/linux/CMakeLists.txt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/libc/startup/linux/CMakeLists.txt b/libc/startup/linux/CMakeLists.txt index 336c5d0f6bfa2..b721d15091227 100644 --- a/libc/startup/linux/CMakeLists.txt +++ b/libc/startup/linux/CMakeLists.txt @@ -118,6 +118,15 @@ merge_relocatable_object( .do_start ) +# HACK: Is this even ok? +# For reference: `Scrt1` is used when `-fpie` vs `crt1` for `-fno-pie` +merge_relocatable_object( + Scrt1 + .${LIBC_TARGET_ARCHITECTURE}.start + .${LIBC_TARGET_ARCHITECTURE}.tls + .do_start +) + add_startup_object( crti SRC @@ -131,7 +140,7 @@ add_startup_object( ) add_custom_target(libc-startup) -set(startup_components crt1 crti crtn) +set(startup_components Scrt1 crt1 crti crtn) foreach(target IN LISTS startup_components) set(fq_target_name libc.startup.linux.${target}) add_dependencies(libc-startup ${fq_target_name}) >From 1f98bd663772b963c192293ad7359fe0ffdada25 Mon Sep 17 00:00:00 2001 From: Izaak Schroeder <izaak.schroe...@gmail.com> Date: Mon, 1 Jul 2024 12:07:37 -0700 Subject: [PATCH 06/10] [libc]: `sys_time.utimes` placeholder --- libc/config/linux/aarch64/entrypoints.txt | 1 + libc/config/linux/x86_64/entrypoints.txt | 3 +++ libc/spec/linux.td | 12 +++++++++++- libc/spec/spec.td | 1 + libc/src/sys/CMakeLists.txt | 1 + libc/src/sys/time/CMakeLists.txt | 10 ++++++++++ libc/src/sys/time/linux/CMakeLists.txt | 12 ++++++++++++ libc/src/sys/time/linux/utimes.cpp | 12 ++++++++++++ libc/src/sys/time/utimes.h | 18 ++++++++++++++++++ 9 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 libc/src/sys/time/CMakeLists.txt create mode 100644 libc/src/sys/time/linux/CMakeLists.txt create mode 100644 libc/src/sys/time/linux/utimes.cpp create mode 100644 libc/src/sys/time/utimes.h diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index b59400db81fed..f259f30f8b377 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -311,6 +311,7 @@ set(TARGET_LIBC_ENTRYPOINTS # XXX libc.src.assert.__assert_fail + libc.src.sys_time.utimes ) set(TARGET_LIBM_ENTRYPOINTS diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index e1922ca94b97e..05ab170127a9d 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -330,6 +330,9 @@ set(TARGET_LIBC_ENTRYPOINTS # wchar.h entrypoints libc.src.wchar.wctob + + # XXX + libc.src.sys_time.utimes ) set(TARGET_LIBM_ENTRYPOINTS diff --git a/libc/spec/linux.td b/libc/spec/linux.td index 82630ff413c73..faeefd70f2263 100644 --- a/libc/spec/linux.td +++ b/libc/spec/linux.td @@ -148,7 +148,17 @@ def Linux : StandardSpec<"Linux"> { ], [StructTimevalType], // Types [], // Enumerations - [] // Functions + [ + FunctionSpec< + "utimes", + RetValSpec<IntType>, + [ + ArgSpec<IntType>, + ArgSpec<ConstCharPtr>, + ArgSpec<ConstStructTimevalPtr>, + ] + >, + ] // Functions >; diff --git a/libc/spec/spec.td b/libc/spec/spec.td index a3a5db7465b39..17c0589ab1d55 100644 --- a/libc/spec/spec.td +++ b/libc/spec/spec.td @@ -148,6 +148,7 @@ def StructRUsagePtr : PtrType<StructRUsage>; def StructTimevalType : NamedType<"struct timeval">; def StructTimevalPtr : PtrType<StructTimevalType>; +def ConstStructTimevalPtr : ConstType<StructTimevalPtr>; def RestrictedStructTimevalPtr : RestrictedPtrType<StructTimevalType>; def SuSecondsT : NamedType<"suseconds_t">; diff --git a/libc/src/sys/CMakeLists.txt b/libc/src/sys/CMakeLists.txt index adc666b94202f..fba5f86d0b08c 100644 --- a/libc/src/sys/CMakeLists.txt +++ b/libc/src/sys/CMakeLists.txt @@ -11,3 +11,4 @@ add_subdirectory(statvfs) add_subdirectory(utsname) add_subdirectory(wait) add_subdirectory(prctl) +add_subdirectory(time) diff --git a/libc/src/sys/time/CMakeLists.txt b/libc/src/sys/time/CMakeLists.txt new file mode 100644 index 0000000000000..f599cddaaeeb3 --- /dev/null +++ b/libc/src/sys/time/CMakeLists.txt @@ -0,0 +1,10 @@ +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS}) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS}) +endif() + +add_entrypoint_object( + utimes + ALIAS + DEPENDS + .${LIBC_TARGET_OS}.utimes +) diff --git a/libc/src/sys/time/linux/CMakeLists.txt b/libc/src/sys/time/linux/CMakeLists.txt new file mode 100644 index 0000000000000..da5f698e3515c --- /dev/null +++ b/libc/src/sys/time/linux/CMakeLists.txt @@ -0,0 +1,12 @@ +add_entrypoint_object( + utimes + SRCS + utimes.cpp + HDRS + ../utimes.h + DEPENDS + libc.include.sys_time + libc.include.sys_syscall + libc.src.__support.OSUtil.osutil + libc.src.errno.errno +) diff --git a/libc/src/sys/time/linux/utimes.cpp b/libc/src/sys/time/linux/utimes.cpp new file mode 100644 index 0000000000000..b3528ab4b48e4 --- /dev/null +++ b/libc/src/sys/time/linux/utimes.cpp @@ -0,0 +1,12 @@ +#include "src/sys/time/utimes.h" + +#include "src/__support/common.h" +#include "src/errno/libc_errno.h" + +namespace LIBC_NAMESPACE { + +LLVM_LIBC_FUNCTION(int, utimes, (int, const char *, const struct timeval[2])) { + return EINVAL; +} + +} // namespace LIBC_NAMESPACE diff --git a/libc/src/sys/time/utimes.h b/libc/src/sys/time/utimes.h new file mode 100644 index 0000000000000..eb2bcc3f15f25 --- /dev/null +++ b/libc/src/sys/time/utimes.h @@ -0,0 +1,18 @@ +//===-- Implementation header for socket ------------------------*- 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_SYS_TIME_UTIMES_H +#define LLVM_LIBC_SRC_SYS_TIME_UTIMES_H + +namespace LIBC_NAMESPACE { + +int utimes(int dirfd, const char *pathname, const struct timeval times[2]); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_SYS_TIME_UTIMES_H >From 346f42492df209476f42f5a4fd84a8d508bbf1cc Mon Sep 17 00:00:00 2001 From: Izaak Schroeder <izaak.schroe...@gmail.com> Date: Mon, 1 Jul 2024 13:13:16 -0700 Subject: [PATCH 07/10] [libc]: add missing `<sys/statvfs.h>` and friends --- libc/config/linux/aarch64/entrypoints.txt | 2 ++ libc/config/linux/aarch64/headers.txt | 1 + libc/config/linux/x86_64/headers.txt | 3 +++ libc/spec/posix.td | 5 ++++- 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index f259f30f8b377..e2a8a8de378b1 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -312,6 +312,8 @@ set(TARGET_LIBC_ENTRYPOINTS # XXX libc.src.assert.__assert_fail libc.src.sys_time.utimes + libc.src.sys.statvfs.fstatvfs + libc.src.sys.statvfs.statvfs ) set(TARGET_LIBM_ENTRYPOINTS diff --git a/libc/config/linux/aarch64/headers.txt b/libc/config/linux/aarch64/headers.txt index ed126d6128871..b310da522a50c 100644 --- a/libc/config/linux/aarch64/headers.txt +++ b/libc/config/linux/aarch64/headers.txt @@ -34,6 +34,7 @@ set(TARGET_PUBLIC_HEADERS # XXX libc.include.sys_auxv + libc.include.sys_statvfs libc.include.fcntl libc.include.sched libc.include.sys_stat diff --git a/libc/config/linux/x86_64/headers.txt b/libc/config/linux/x86_64/headers.txt index 44d640b75e2bf..7e9d26c4821fc 100644 --- a/libc/config/linux/x86_64/headers.txt +++ b/libc/config/linux/x86_64/headers.txt @@ -49,4 +49,7 @@ set(TARGET_PUBLIC_HEADERS libc.include.sys_types libc.include.sys_utsname libc.include.sys_wait + + # XXX + libc.include.sys_statvfs ) diff --git a/libc/spec/posix.td b/libc/spec/posix.td index d14047548e104..4220842b71954 100644 --- a/libc/spec/posix.td +++ b/libc/spec/posix.td @@ -135,6 +135,9 @@ def POSIX : StandardSpec<"POSIX"> { PtrType PThreadTPtr = PtrType<PThreadTType>; RestrictedPtrType RestrictedPThreadTPtr = RestrictedPtrType<PThreadTType>; + NamedType FsFilCntTType = NamedType<"fsfilcnt_t">; + NamedType FsBlkCntTType = NamedType<"fsblkcnt_t">; + HeaderSpec Errno = HeaderSpec< "errno.h", [ @@ -928,7 +931,7 @@ def POSIX : StandardSpec<"POSIX"> { HeaderSpec SysStatvfs = HeaderSpec< "sys/statvfs.h", [], // Macros - [StructStatvfs], // Types + [StructStatvfs, FsFilCntTType, FsBlkCntTType], // Types [], // Enumerations [ FunctionSpec< >From 570638ec0baff5bbcccb6339265321823b9559e0 Mon Sep 17 00:00:00 2001 From: Izaak Schroeder <izaak.schroe...@gmail.com> Date: Mon, 1 Jul 2024 13:14:21 -0700 Subject: [PATCH 08/10] [libc]: add basic `ioctl` function --- libc/config/linux/aarch64/entrypoints.txt | 3 ++- libc/config/linux/x86_64/entrypoints.txt | 3 ++- libc/src/sys/CMakeLists.txt | 1 + libc/src/sys/ioctl/CMakeLists.txt | 10 ++++++++++ libc/src/sys/ioctl/ioctl.h | 18 +++++++++++++++++ libc/src/sys/ioctl/linux/CMakeLists.txt | 12 ++++++++++++ libc/src/sys/ioctl/linux/ioctl.cpp | 24 +++++++++++++++++++++++ 7 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 libc/src/sys/ioctl/CMakeLists.txt create mode 100644 libc/src/sys/ioctl/ioctl.h create mode 100644 libc/src/sys/ioctl/linux/CMakeLists.txt create mode 100644 libc/src/sys/ioctl/linux/ioctl.cpp diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index e2a8a8de378b1..f58debcf9f38c 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -311,9 +311,10 @@ set(TARGET_LIBC_ENTRYPOINTS # XXX libc.src.assert.__assert_fail - libc.src.sys_time.utimes + libc.src.sys.time.utimes libc.src.sys.statvfs.fstatvfs libc.src.sys.statvfs.statvfs + libc.src.sys.ioctl.ioctl ) set(TARGET_LIBM_ENTRYPOINTS diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index 05ab170127a9d..ba88ee253230f 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -332,7 +332,8 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.wchar.wctob # XXX - libc.src.sys_time.utimes + libc.src.sys.time.utimes + libc.src.sys.ioctl.ioctl ) set(TARGET_LIBM_ENTRYPOINTS diff --git a/libc/src/sys/CMakeLists.txt b/libc/src/sys/CMakeLists.txt index fba5f86d0b08c..de8677e9cc933 100644 --- a/libc/src/sys/CMakeLists.txt +++ b/libc/src/sys/CMakeLists.txt @@ -11,4 +11,5 @@ add_subdirectory(statvfs) add_subdirectory(utsname) add_subdirectory(wait) add_subdirectory(prctl) +add_subdirectory(ioctl) add_subdirectory(time) diff --git a/libc/src/sys/ioctl/CMakeLists.txt b/libc/src/sys/ioctl/CMakeLists.txt new file mode 100644 index 0000000000000..099a1b96389fc --- /dev/null +++ b/libc/src/sys/ioctl/CMakeLists.txt @@ -0,0 +1,10 @@ +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS}) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS}) +endif() + +add_entrypoint_object( + ioctl + ALIAS + DEPENDS + .${LIBC_TARGET_OS}.ioctl +) diff --git a/libc/src/sys/ioctl/ioctl.h b/libc/src/sys/ioctl/ioctl.h new file mode 100644 index 0000000000000..1d4789146c40f --- /dev/null +++ b/libc/src/sys/ioctl/ioctl.h @@ -0,0 +1,18 @@ +//===-- Implementation header for socket ------------------------*- 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_SYS_IOCTL_IOCTL_H +#define LLVM_LIBC_SRC_SYS_IOCTL_IOCTL_H + +namespace LIBC_NAMESPACE { + +int ioctl(int fd, int req, ...); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_SYS_IOCTL_IOCTL_H diff --git a/libc/src/sys/ioctl/linux/CMakeLists.txt b/libc/src/sys/ioctl/linux/CMakeLists.txt new file mode 100644 index 0000000000000..876f35aaee66c --- /dev/null +++ b/libc/src/sys/ioctl/linux/CMakeLists.txt @@ -0,0 +1,12 @@ +add_entrypoint_object( + ioctl + SRCS + ioctl.cpp + HDRS + ../ioctl.h + DEPENDS + libc.include.sys_ioctl + libc.include.sys_syscall + libc.src.__support.OSUtil.osutil + libc.src.errno.errno +) diff --git a/libc/src/sys/ioctl/linux/ioctl.cpp b/libc/src/sys/ioctl/linux/ioctl.cpp new file mode 100644 index 0000000000000..9b455f62d47a1 --- /dev/null +++ b/libc/src/sys/ioctl/linux/ioctl.cpp @@ -0,0 +1,24 @@ +#include <stdarg.h> +#include <sys/syscall.h> // For syscall numbers. + +#include "src/__support/OSUtil/syscall.h" // For internal syscall function. +#include "src/__support/common.h" +#include "src/sys/ioctl/ioctl.h" + +#include "src/errno/libc_errno.h" + +namespace LIBC_NAMESPACE { + +LLVM_LIBC_FUNCTION(int, ioctl, (int fd, int req, ...)) { + void *arg; + va_list ap; + va_start(ap, req); + arg = va_arg(ap, void *); + va_end(ap); + int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_ioctl, fd, req, arg); + // FIXME(@izaakschroeder): There is probably more to do here. + // See: https://github.com/kraj/musl/blob/kraj/master/src/misc/ioctl.c + return ret; +} + +} // namespace LIBC_NAMESPACE >From 57bd7864d6322bec928050eeb66ef4ba0f33a5e3 Mon Sep 17 00:00:00 2001 From: Izaak Schroeder <izaak.schroe...@gmail.com> Date: Mon, 1 Jul 2024 16:23:01 -0700 Subject: [PATCH 09/10] [libc]: add `dlfcn.h` placeholder --- libc/config/linux/aarch64/entrypoints.txt | 4 ++ libc/config/linux/aarch64/headers.txt | 1 + libc/config/linux/x86_64/entrypoints.txt | 4 ++ libc/config/linux/x86_64/headers.txt | 1 + libc/include/CMakeLists.txt | 9 ++++ libc/include/dlfcn.h.def | 17 ++++++++ libc/include/llvm-libc-macros/CMakeLists.txt | 6 +++ libc/include/llvm-libc-macros/dlfcn-macros.h | 23 +++++++++++ libc/spec/posix.td | 35 ++++++++++++++++ libc/src/CMakeLists.txt | 1 + libc/src/dlfcn/CMakeLists.txt | 43 ++++++++++++++++++++ libc/src/dlfcn/dlclose.cpp | 17 ++++++++ libc/src/dlfcn/dlclose.h | 18 ++++++++ libc/src/dlfcn/dlerror.cpp | 19 +++++++++ libc/src/dlfcn/dlerror.h | 18 ++++++++ libc/src/dlfcn/dlopen.cpp | 17 ++++++++ libc/src/dlfcn/dlopen.h | 18 ++++++++ libc/src/dlfcn/dlsym.cpp | 17 ++++++++ libc/src/dlfcn/dlsym.h | 18 ++++++++ 19 files changed, 286 insertions(+) create mode 100644 libc/include/dlfcn.h.def create mode 100644 libc/include/llvm-libc-macros/dlfcn-macros.h create mode 100644 libc/src/dlfcn/CMakeLists.txt create mode 100644 libc/src/dlfcn/dlclose.cpp create mode 100644 libc/src/dlfcn/dlclose.h create mode 100644 libc/src/dlfcn/dlerror.cpp create mode 100644 libc/src/dlfcn/dlerror.h create mode 100644 libc/src/dlfcn/dlopen.cpp create mode 100644 libc/src/dlfcn/dlopen.h create mode 100644 libc/src/dlfcn/dlsym.cpp create mode 100644 libc/src/dlfcn/dlsym.h diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index f58debcf9f38c..1d7dde40e371e 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -315,6 +315,10 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.sys.statvfs.fstatvfs libc.src.sys.statvfs.statvfs libc.src.sys.ioctl.ioctl + libc.src.dlfcn.dlopen + libc.src.dlfcn.dlsym + libc.src.dlfcn.dlclose + libc.src.dlfcn.dlerror ) set(TARGET_LIBM_ENTRYPOINTS diff --git a/libc/config/linux/aarch64/headers.txt b/libc/config/linux/aarch64/headers.txt index b310da522a50c..4f47b09b26b77 100644 --- a/libc/config/linux/aarch64/headers.txt +++ b/libc/config/linux/aarch64/headers.txt @@ -38,4 +38,5 @@ set(TARGET_PUBLIC_HEADERS libc.include.fcntl libc.include.sched libc.include.sys_stat + libc.include.dlfcn ) diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index ba88ee253230f..e5feb4ebed805 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -334,6 +334,10 @@ set(TARGET_LIBC_ENTRYPOINTS # XXX libc.src.sys.time.utimes libc.src.sys.ioctl.ioctl + libc.src.dlfcn.dlopen + libc.src.dlfcn.dlsym + libc.src.dlfcn.dlclose + libc.src.dlfcn.dlerror ) set(TARGET_LIBM_ENTRYPOINTS diff --git a/libc/config/linux/x86_64/headers.txt b/libc/config/linux/x86_64/headers.txt index 7e9d26c4821fc..16af88b54e4ab 100644 --- a/libc/config/linux/x86_64/headers.txt +++ b/libc/config/linux/x86_64/headers.txt @@ -52,4 +52,5 @@ set(TARGET_PUBLIC_HEADERS # XXX libc.include.sys_statvfs + libc.include.dlfcn ) diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt index 3ab7817d8568b..f8ef35078a8c4 100644 --- a/libc/include/CMakeLists.txt +++ b/libc/include/CMakeLists.txt @@ -51,6 +51,15 @@ add_gen_header( .llvm_libc_common_h ) +add_gen_header( + dlfcn + DEF_FILE dlfcn.h.def + GEN_HDR dlfcn.h + DEPENDS + .llvm-libc-macros.dlfcn_macros + .llvm_libc_common_h +) + add_gen_header( features DEF_FILE features.h.def diff --git a/libc/include/dlfcn.h.def b/libc/include/dlfcn.h.def new file mode 100644 index 0000000000000..31395871c6b97 --- /dev/null +++ b/libc/include/dlfcn.h.def @@ -0,0 +1,17 @@ +//===-- C standard library header dlfcn.h ---------------------------------===// +// +// 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_DLFCN_H +#define LLVM_LIBC_DLFCN_H + +#include "__llvm-libc-common.h" +#include "llvm-libc-macros/dlfcn-macros.h" + +%%public_api() + +#endif // LLVM_LIBC_DLFCN_H diff --git a/libc/include/llvm-libc-macros/CMakeLists.txt b/libc/include/llvm-libc-macros/CMakeLists.txt index f6af11abd4dd7..5bf573e4e98df 100644 --- a/libc/include/llvm-libc-macros/CMakeLists.txt +++ b/libc/include/llvm-libc-macros/CMakeLists.txt @@ -277,3 +277,9 @@ add_macro_header( HDR stdckdint-macros.h ) + +add_macro_header( + dlfcn_macros + HDR + dlfcn-macros.h +) \ No newline at end of file diff --git a/libc/include/llvm-libc-macros/dlfcn-macros.h b/libc/include/llvm-libc-macros/dlfcn-macros.h new file mode 100644 index 0000000000000..dcd202b9ab435 --- /dev/null +++ b/libc/include/llvm-libc-macros/dlfcn-macros.h @@ -0,0 +1,23 @@ +//===-- Definition of macros from dlfcn.h ---------------------------------===// +// +// 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_MACROS_DLFCN_MACROS_H +#define LLVM_LIBC_MACROS_DLFCN_MACROS_H + +#define RTLD_LAZY 0x00001 +#define RTLD_NOW 0x00002 +#define RTLD_GLOBAL 0x00100 +#define RTLD_LOCAL 0 + +// Non-standard stuff here +#define RTLD_BINDING_MASK 0x3 +#define RTLD_NOLOAD 0x00004 +#define RTLD_DEEPBIND 0x00008 +#define RTLD_NODELETE 0x01000 + +#endif // LLVM_LIBC_MACROS_DLFCN_MACROS_H diff --git a/libc/spec/posix.td b/libc/spec/posix.td index 4220842b71954..ccbe31b698b03 100644 --- a/libc/spec/posix.td +++ b/libc/spec/posix.td @@ -225,6 +225,40 @@ def POSIX : StandardSpec<"POSIX"> { [] // Functions >; + HeaderSpec DlFcn = HeaderSpec< + "dlfcn.h", + [ + Macro<"RTLD_LAZY">, + Macro<"RTLD_NOW">, + Macro<"RTLD_GLOBAL">, + Macro<"RTLD_LOCAL">, + ], + [], // Types + [], // Enumerations + [ + FunctionSpec< + "dlclose", + RetValSpec<IntType>, + [ArgSpec<VoidPtr>] + >, + FunctionSpec< + "dlerror", + RetValSpec<CharPtr>, + [] + >, + FunctionSpec< + "dlopen", + RetValSpec<VoidPtr>, + [ArgSpec<ConstCharPtr>, ArgSpec<IntType>] + >, + FunctionSpec< + "dlsym", + RetValSpec<VoidPtr>, + [ArgSpec<VoidRestrictedPtr>, ArgSpec<ConstCharRestrictedPtr>] + >, + ] + >; + HeaderSpec FCntl = HeaderSpec< "fcntl.h", [], // Macros @@ -1693,6 +1727,7 @@ def POSIX : StandardSpec<"POSIX"> { ArpaInet, CType, Dirent, + DlFcn, Errno, FCntl, PThread, diff --git a/libc/src/CMakeLists.txt b/libc/src/CMakeLists.txt index 09b16be1e2d42..f011fe25226e5 100644 --- a/libc/src/CMakeLists.txt +++ b/libc/src/CMakeLists.txt @@ -11,6 +11,7 @@ add_subdirectory(stdio) add_subdirectory(stdlib) add_subdirectory(string) add_subdirectory(wchar) +add_subdirectory(dlfcn) if(${LIBC_TARGET_OS} STREQUAL "linux") add_subdirectory(dirent) diff --git a/libc/src/dlfcn/CMakeLists.txt b/libc/src/dlfcn/CMakeLists.txt new file mode 100644 index 0000000000000..5534f2dfb8853 --- /dev/null +++ b/libc/src/dlfcn/CMakeLists.txt @@ -0,0 +1,43 @@ +add_entrypoint_object( + dlclose + SRCS + dlclose.cpp + HDRS + dlclose.h + DEPENDS + libc.include.dlfcn + libc.src.errno.errno +) + +add_entrypoint_object( + dlerror + SRCS + dlerror.cpp + HDRS + dlerror.h + DEPENDS + libc.include.dlfcn + libc.src.errno.errno +) + +add_entrypoint_object( + dlopen + SRCS + dlopen.cpp + HDRS + dlopen.h + DEPENDS + libc.include.dlfcn + libc.src.errno.errno +) + +add_entrypoint_object( + dlsym + SRCS + dlsym.cpp + HDRS + dlsym.h + DEPENDS + libc.include.dlfcn + libc.src.errno.errno +) diff --git a/libc/src/dlfcn/dlclose.cpp b/libc/src/dlfcn/dlclose.cpp new file mode 100644 index 0000000000000..6dc1892120ddd --- /dev/null +++ b/libc/src/dlfcn/dlclose.cpp @@ -0,0 +1,17 @@ +//===-- Implementation of dlclose -----------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "dlclose.h" + +#include "src/__support/common.h" + +namespace LIBC_NAMESPACE { + +LLVM_LIBC_FUNCTION(int, dlclose, (void *)) { return -1; } + +} // namespace LIBC_NAMESPACE diff --git a/libc/src/dlfcn/dlclose.h b/libc/src/dlfcn/dlclose.h new file mode 100644 index 0000000000000..27c0207d726e4 --- /dev/null +++ b/libc/src/dlfcn/dlclose.h @@ -0,0 +1,18 @@ +//===-- Implementation header of dlclose ------------------------*- 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_DLFCN_DLCLOSE_H +#define LLVM_LIBC_SRC_DLFCN_DLCLOSE_H + +namespace LIBC_NAMESPACE { + +int dlclose(void *); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_DLFCN_DLCLOSE_H diff --git a/libc/src/dlfcn/dlerror.cpp b/libc/src/dlfcn/dlerror.cpp new file mode 100644 index 0000000000000..8c3611d9c639e --- /dev/null +++ b/libc/src/dlfcn/dlerror.cpp @@ -0,0 +1,19 @@ +//===-- Implementation of delerror ----------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "dlerror.h" + +#include "src/__support/common.h" + +namespace LIBC_NAMESPACE { + +LLVM_LIBC_FUNCTION(char *, dlerror, ()) { + return const_cast<char *>("unsupported"); +} + +} // namespace LIBC_NAMESPACE diff --git a/libc/src/dlfcn/dlerror.h b/libc/src/dlfcn/dlerror.h new file mode 100644 index 0000000000000..966496016d3eb --- /dev/null +++ b/libc/src/dlfcn/dlerror.h @@ -0,0 +1,18 @@ +//===-- Implementation header of dlerror ------------------------*- 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_DLFCN_DLERROR_H +#define LLVM_LIBC_SRC_DLFCN_DLERROR_H + +namespace LIBC_NAMESPACE { + +char *dlerror(); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_DLFCN_DLERROR_H diff --git a/libc/src/dlfcn/dlopen.cpp b/libc/src/dlfcn/dlopen.cpp new file mode 100644 index 0000000000000..835d981e19237 --- /dev/null +++ b/libc/src/dlfcn/dlopen.cpp @@ -0,0 +1,17 @@ +//===-- Implementation of dlopen -----------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "dlopen.h" + +#include "src/__support/common.h" + +namespace LIBC_NAMESPACE { + +LLVM_LIBC_FUNCTION(void *, dlopen, (const char *, int)) { return nullptr; } + +} // namespace LIBC_NAMESPACE diff --git a/libc/src/dlfcn/dlopen.h b/libc/src/dlfcn/dlopen.h new file mode 100644 index 0000000000000..4565953efd494 --- /dev/null +++ b/libc/src/dlfcn/dlopen.h @@ -0,0 +1,18 @@ +//===-- Implementation header of dlopen -------------------------*- 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_DLFCN_DLOPEN_H +#define LLVM_LIBC_SRC_DLFCN_DLOPEN_H + +namespace LIBC_NAMESPACE { + +void *dlopen(const char *, int); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_DLFCN_DLOPEN_H diff --git a/libc/src/dlfcn/dlsym.cpp b/libc/src/dlfcn/dlsym.cpp new file mode 100644 index 0000000000000..98d678caece90 --- /dev/null +++ b/libc/src/dlfcn/dlsym.cpp @@ -0,0 +1,17 @@ +//===-- Implementation of dlsym ------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "dlsym.h" + +#include "src/__support/common.h" + +namespace LIBC_NAMESPACE { + +LLVM_LIBC_FUNCTION(void *, dlsym, (void *, const char *)) { return nullptr; } + +} // namespace LIBC_NAMESPACE diff --git a/libc/src/dlfcn/dlsym.h b/libc/src/dlfcn/dlsym.h new file mode 100644 index 0000000000000..8157ac3e3fd4c --- /dev/null +++ b/libc/src/dlfcn/dlsym.h @@ -0,0 +1,18 @@ +//===-- Implementation header of dlsym --------------------------*- 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_DLFCN_DLSYM_H +#define LLVM_LIBC_SRC_DLFCN_DLSYM_H + +namespace LIBC_NAMESPACE { + +void *dlsym(void *, const char *); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_DLFCN_DLSYM_H >From 9fc0685e36a8dc6144ffaf84733572c5208daa90 Mon Sep 17 00:00:00 2001 From: Izaak Schroeder <izaak.schroe...@gmail.com> Date: Mon, 1 Jul 2024 19:40:07 -0700 Subject: [PATCH 10/10] [libc]: add `link.h` --- libc/config/linux/aarch64/entrypoints.txt | 1 + libc/config/linux/aarch64/headers.txt | 2 ++ libc/config/linux/api.td | 13 ++++++++ libc/config/linux/x86_64/entrypoints.txt | 1 + libc/config/linux/x86_64/headers.txt | 2 ++ libc/include/CMakeLists.txt | 20 +++++++++++++ libc/include/elf.h.def | 14 +++++++++ libc/include/link.h.def | 16 ++++++++++ libc/include/llvm-libc-macros/CMakeLists.txt | 8 ++++- libc/include/llvm-libc-macros/elf-macros.h | 18 +++++++++++ libc/include/llvm-libc-macros/link-macros.h | 26 ++++++++++++++-- libc/include/llvm-libc-types/CMakeLists.txt | 3 ++ .../__dl_iterate_phdr_callback_t.h | 17 +++++++++++ .../llvm-libc-types/struct_dl_phdr_info.h | 26 ++++++++++++++++ libc/spec/linux.td | 30 +++++++++++++++++++ libc/spec/posix.td | 4 ++- libc/src/CMakeLists.txt | 1 + libc/src/link/CMakeLists.txt | 9 ++++++ libc/src/link/dl_iterate_phdr.cpp | 21 +++++++++++++ libc/src/link/dl_iterate_phdr.h | 20 +++++++++++++ 20 files changed, 248 insertions(+), 4 deletions(-) create mode 100644 libc/include/elf.h.def create mode 100644 libc/include/link.h.def create mode 100644 libc/include/llvm-libc-macros/elf-macros.h create mode 100644 libc/include/llvm-libc-types/__dl_iterate_phdr_callback_t.h create mode 100644 libc/include/llvm-libc-types/struct_dl_phdr_info.h create mode 100644 libc/src/link/CMakeLists.txt create mode 100644 libc/src/link/dl_iterate_phdr.cpp create mode 100644 libc/src/link/dl_iterate_phdr.h diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index 1d7dde40e371e..2951ef37db46a 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -319,6 +319,7 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.dlfcn.dlsym libc.src.dlfcn.dlclose libc.src.dlfcn.dlerror + libc.src.link.dl_iterate_phdr ) set(TARGET_LIBM_ENTRYPOINTS diff --git a/libc/config/linux/aarch64/headers.txt b/libc/config/linux/aarch64/headers.txt index 4f47b09b26b77..6ed200ab7fa7d 100644 --- a/libc/config/linux/aarch64/headers.txt +++ b/libc/config/linux/aarch64/headers.txt @@ -39,4 +39,6 @@ set(TARGET_PUBLIC_HEADERS libc.include.sched libc.include.sys_stat libc.include.dlfcn + libc.include.link + libc.include.elf ) diff --git a/libc/config/linux/api.td b/libc/config/linux/api.td index eb0090c80b0da..49139177f75a6 100644 --- a/libc/config/linux/api.td +++ b/libc/config/linux/api.td @@ -308,3 +308,16 @@ def SearchAPI : PublicAPI<"search.h"> { def SysStatvfsAPI : PublicAPI<"sys/statvfs.h"> { let Types = ["fsblkcnt_t", "fsfilcnt_t", "struct statvfs"]; } + +def LinkAPI : PublicAPI<"link.h"> { + let Types = [ + "struct dl_phdr_info", + "__dl_iterate_phdr_callback_t" + ]; +} + +def DAPI : DlfcnAPI<"dlfcn.h"> { + let Types = [ + "Dl_info" + ]; +} diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index e5feb4ebed805..6a9d9d6c2824b 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -338,6 +338,7 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.dlfcn.dlsym libc.src.dlfcn.dlclose libc.src.dlfcn.dlerror + libc.src.link.dl_iterate_phdr ) set(TARGET_LIBM_ENTRYPOINTS diff --git a/libc/config/linux/x86_64/headers.txt b/libc/config/linux/x86_64/headers.txt index 16af88b54e4ab..6dc50f61d9a6b 100644 --- a/libc/config/linux/x86_64/headers.txt +++ b/libc/config/linux/x86_64/headers.txt @@ -53,4 +53,6 @@ set(TARGET_PUBLIC_HEADERS # XXX libc.include.sys_statvfs libc.include.dlfcn + libc.include.link + libc.include.elf ) diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt index f8ef35078a8c4..a39c1c118165f 100644 --- a/libc/include/CMakeLists.txt +++ b/libc/include/CMakeLists.txt @@ -56,6 +56,7 @@ add_gen_header( DEF_FILE dlfcn.h.def GEN_HDR dlfcn.h DEPENDS + .llvm-libc-types.Dl_info .llvm-libc-macros.dlfcn_macros .llvm_libc_common_h ) @@ -367,6 +368,25 @@ add_gen_header( .llvm-libc-types.posix_spawn_file_actions_t ) +add_gen_header( + link + DEF_FILE link.h.def + GEN_HDR link.h + DEPENDS + .llvm_libc_common_h + .llvm-libc-types.struct_dl_phdr_info + .llvm-libc-types.__dl_iterate_phdr_callback_t + .llvm-libc-macros.link_macros +) + +add_gen_header( + elf + DEF_FILE elf.h.def + GEN_HDR elf.h + DEPENDS + .llvm-libc-macros.elf_macros +) + # TODO: Not all platforms will have a include/sys directory. Add the sys # directory and the targets for sys/*.h files conditional to the OS requiring # them. diff --git a/libc/include/elf.h.def b/libc/include/elf.h.def new file mode 100644 index 0000000000000..1c9d11929029f --- /dev/null +++ b/libc/include/elf.h.def @@ -0,0 +1,14 @@ +//===-- C standard library header elf.h -----------------------------------===// +// +// 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_ELF_H +#define LLVM_LIBC_ELF_H + +#include "llvm-libc-macros/elf-macros.h" + +#endif // LLVM_LIBC_ELF_H diff --git a/libc/include/link.h.def b/libc/include/link.h.def new file mode 100644 index 0000000000000..353398e4f3c88 --- /dev/null +++ b/libc/include/link.h.def @@ -0,0 +1,16 @@ +//===-- C standard library header link.h ----------------------------------===// +// +// 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_LINK_H +#define LLVM_LIBC_LINK_H + +#include "llvm-libc-macros/link-macros.h" + +%%public_api() + +#endif // LLVM_LIBC_LINK_H diff --git a/libc/include/llvm-libc-macros/CMakeLists.txt b/libc/include/llvm-libc-macros/CMakeLists.txt index 5bf573e4e98df..60c8f5a9cd3de 100644 --- a/libc/include/llvm-libc-macros/CMakeLists.txt +++ b/libc/include/llvm-libc-macros/CMakeLists.txt @@ -282,4 +282,10 @@ add_macro_header( dlfcn_macros HDR dlfcn-macros.h -) \ No newline at end of file +) + +add_macro_header( + elf_macros + HDR + elf-macros.h +) diff --git a/libc/include/llvm-libc-macros/elf-macros.h b/libc/include/llvm-libc-macros/elf-macros.h new file mode 100644 index 0000000000000..fa4442abf0f5c --- /dev/null +++ b/libc/include/llvm-libc-macros/elf-macros.h @@ -0,0 +1,18 @@ +//===-- Definition of macros from elf.h -----------------------------------===// +// +// 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_MACROS_ELF_MACROS_H +#define LLVM_LIBC_MACROS_ELF_MACROS_H + +#if __has_include(<linux/elf.h>) +#include <linux/elf.h> +#else +#error "cannot use <sys/elf.h> without proper system headers." +#endif + +#endif // LLVM_LIBC_MACROS_ELF_MACROS_H diff --git a/libc/include/llvm-libc-macros/link-macros.h b/libc/include/llvm-libc-macros/link-macros.h index 5c8cadab8e71c..f7461d9527a47 100644 --- a/libc/include/llvm-libc-macros/link-macros.h +++ b/libc/include/llvm-libc-macros/link-macros.h @@ -6,8 +6,30 @@ // //===----------------------------------------------------------------------===// +#ifndef LLVM_LIBC_MACROS_LINK_MACROS_H +#define LLVM_LIBC_MACROS_LINK_MACROS_H + +#include "elf-macros.h" + #ifdef __LP64__ -#define ElfW(type) Elf64_ ## type +#define ElfW(type) Elf64_##type #else -#define ElfW(type) Elf32_ ## type +#define ElfW(type) Elf32_##type +#endif + +struct link_map { + ElfW(Addr) l_addr; + char *l_name; + ElfW(Dyn) * l_ld; + struct link_map *l_next, *l_prev; +}; + +struct r_debug { + int r_version; + struct link_map *r_map; + ElfW(Addr) r_brk; + enum { RT_CONSISTENT, RT_ADD, RT_DELETE } r_state; + ElfW(Addr) r_ldbase; +}; + #endif diff --git a/libc/include/llvm-libc-types/CMakeLists.txt b/libc/include/llvm-libc-types/CMakeLists.txt index d8b975572e0dd..016ec14b077e8 100644 --- a/libc/include/llvm-libc-types/CMakeLists.txt +++ b/libc/include/llvm-libc-types/CMakeLists.txt @@ -89,6 +89,9 @@ add_header(thrd_t HDR thrd_t.h DEPENDS .__thread_type) add_header(tss_t HDR tss_t.h) add_header(tss_dtor_t HDR tss_dtor_t.h) add_header(__atexithandler_t HDR __atexithandler_t.h) +add_header(Dl_info HDR Dl_info.h) +add_header(struct_dl_phdr_info HDR struct_dl_phdr_info.h) +add_header(__dl_iterate_phdr_callback_t HDR __dl_iterate_phdr_callback_t.h) add_header(speed_t HDR speed_t.h) add_header(tcflag_t HDR tcflag_t.h) add_header(struct_termios HDR struct_termios.h DEPENDS .cc_t .speed_t .tcflag_t) diff --git a/libc/include/llvm-libc-types/__dl_iterate_phdr_callback_t.h b/libc/include/llvm-libc-types/__dl_iterate_phdr_callback_t.h new file mode 100644 index 0000000000000..9d73e88076e00 --- /dev/null +++ b/libc/include/llvm-libc-types/__dl_iterate_phdr_callback_t.h @@ -0,0 +1,17 @@ +//===-- Definition of __dl_iterate_phdr_callback_t type -------------------===// +// +// 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_TYPES___DL_ITERATE_PHDR_CALLBACK_T_H +#define LLVM_LIBC_TYPES___DL_ITERATE_PHDR_CALLBACK_T_H + +#include "llvm-libc-types/size_t.h" + +typedef int (*__dl_iterate_phdr_callback_t)(struct dl_phdr_info *info, + size_t size, void *data); + +#endif // LLVM_LIBC_TYPES___DL_ITERATE_PHDR_CALLBACK_T_H diff --git a/libc/include/llvm-libc-types/struct_dl_phdr_info.h b/libc/include/llvm-libc-types/struct_dl_phdr_info.h new file mode 100644 index 0000000000000..8bbd7811bbe2a --- /dev/null +++ b/libc/include/llvm-libc-types/struct_dl_phdr_info.h @@ -0,0 +1,26 @@ +//===-- Definition of type struct dl_phdr_info ----------------------------===// +// +// 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_TYPES_STRUCT_DL_PHDR_INFO_H +#define LLVM_LIBC_TYPES_STRUCT_DL_PHDR_INFO_H + +#include "llvm-libc-types/size_t.h" +#include "llvm-libc-macros/link-macros.h" + +struct dl_phdr_info { + ElfW(Addr) dlpi_addr; + const char *dlpi_name; + const ElfW(Phdr) * dlpi_phdr; + ElfW(Half) dlpi_phnum; + unsigned long long int dlpi_adds; + unsigned long long int dlpi_subs; + size_t dlpi_tls_modid; + void *dlpi_tls_data; +}; + +#endif // LLVM_LIBC_TYPES_STRUCT_DL_PHDR_INFO_H diff --git a/libc/spec/linux.td b/libc/spec/linux.td index faeefd70f2263..f64b27dc9e796 100644 --- a/libc/spec/linux.td +++ b/libc/spec/linux.td @@ -3,6 +3,9 @@ def StructEpollEventPtr : PtrType<StructEpollEvent>; def StructEpollData : NamedType<"struct epoll_data">; +def StructDlPhdrInfo : NamedType<"struct dl_phdr_info">; +def DlIteratePhdrCallback : NamedType<"__dl_iterate_phdr_callback_t">; + def Linux : StandardSpec<"Linux"> { HeaderSpec Errno = HeaderSpec< "errno.h", @@ -274,8 +277,35 @@ def Linux : StandardSpec<"Linux"> { ] >; + HeaderSpec Link = HeaderSpec< + "link.h", + [], // Macros + [StructDlPhdrInfo, DlIteratePhdrCallback], // Types + [], // Enumerations + [ + FunctionSpec< + "dl_iterate_phdr", + RetValSpec<IntType>, + [ + ArgSpec<DlIteratePhdrCallback>, + ArgSpec<VoidPtr> + ] + >, + ] // Functions + >; + + HeaderSpec Elf = HeaderSpec< + "elf.h", + [], // Macros + [], // Types + [], // Enumerations + [] // Functions + >; + let Headers = [ + Elf, Errno, + Link, SysEpoll, SysMMan, SysPrctl, diff --git a/libc/spec/posix.td b/libc/spec/posix.td index ccbe31b698b03..238f4f4c101d5 100644 --- a/libc/spec/posix.td +++ b/libc/spec/posix.td @@ -21,6 +21,8 @@ def PThreadOnceT : NamedType<"pthread_once_t">; def PThreadOnceTPtr : PtrType<PThreadOnceT>; def PThreadOnceCallback : NamedType<"__pthread_once_func_t">; +def DlInfo : NamedType<"Dl_info">; + def InoT : NamedType<"ino_t">; def UidT : NamedType<"uid_t">; def GidT : NamedType<"gid_t">; @@ -233,7 +235,7 @@ def POSIX : StandardSpec<"POSIX"> { Macro<"RTLD_GLOBAL">, Macro<"RTLD_LOCAL">, ], - [], // Types + [DlInfo], // Types [], // Enumerations [ FunctionSpec< diff --git a/libc/src/CMakeLists.txt b/libc/src/CMakeLists.txt index f011fe25226e5..9ff88cffc487c 100644 --- a/libc/src/CMakeLists.txt +++ b/libc/src/CMakeLists.txt @@ -12,6 +12,7 @@ add_subdirectory(stdlib) add_subdirectory(string) add_subdirectory(wchar) add_subdirectory(dlfcn) +add_subdirectory(link) if(${LIBC_TARGET_OS} STREQUAL "linux") add_subdirectory(dirent) diff --git a/libc/src/link/CMakeLists.txt b/libc/src/link/CMakeLists.txt new file mode 100644 index 0000000000000..06f5e05e624fd --- /dev/null +++ b/libc/src/link/CMakeLists.txt @@ -0,0 +1,9 @@ +add_entrypoint_object( + dl_iterate_phdr + SRCS + dl_iterate_phdr.cpp + HDRS + dl_iterate_phdr.h + DEPENDS + libc.src.__support.common +) diff --git a/libc/src/link/dl_iterate_phdr.cpp b/libc/src/link/dl_iterate_phdr.cpp new file mode 100644 index 0000000000000..bfb34b0c7061a --- /dev/null +++ b/libc/src/link/dl_iterate_phdr.cpp @@ -0,0 +1,21 @@ +//===-- Implementation of dl_iterate_phdr +//----------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "dl_iterate_phdr.h" +#include "src/__support/common.h" + +namespace LIBC_NAMESPACE { + +LLVM_LIBC_FUNCTION(int, dl_iterate_phdr, + (__dl_iterate_phdr_callback_t, void *)) { + // HACK(@izaakschroeder): Not implemented + return -1; +} + +} // namespace LIBC_NAMESPACE diff --git a/libc/src/link/dl_iterate_phdr.h b/libc/src/link/dl_iterate_phdr.h new file mode 100644 index 0000000000000..b7f7951e883a8 --- /dev/null +++ b/libc/src/link/dl_iterate_phdr.h @@ -0,0 +1,20 @@ +//===-- Implementation header for dl_iterate_phdr ---------------*- 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_LINK_DL_ITERATE_PHDR_H +#define LLVM_LIBC_SRC_LINK_DL_ITERATE_PHDR_H + +namespace LIBC_NAMESPACE { + +#include "include/llvm-libc-types/__dl_iterate_phdr_callback_t.h" + +int dl_iterate_phdr(__dl_iterate_phdr_callback_t, void *); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_LINK_DL_ITERATE_PHDR_H _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits