[libc-commits] [libc] [libc][sys/sem][sys/ipc] Adding syscall wrapper implementation for sys/sem and sys/ipc on linux x86_64 (PR #182683)
via libc-commits
libc-commits at lists.llvm.org
Sat Feb 21 07:50:34 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-libc
Author: Pengxiang Huang (Pengxiang-Huang)
<details>
<summary>Changes</summary>
This pull request implements for the corresponding issue: https://github.com/llvm/llvm-project/issues/182161, @<!-- -->SchrodingerZhu
The implementation includes a system call wrapper for sys V semaphore, since <sys/sem.h> includes on the <sys/ipc.h>, thus the <sys/ipc.h> is also implemented as a wrapper in this pull request.
The implementation follows the POSIX standard for ipc and sem:
https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/sys_ipc.h.html and
https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/sys_sem.h.html
since it is a system call wrapper implementation, this implementation only target on the linux platform and follows the linux ABI requirements for the data structure that syscall required. More specifically, the data structure `ipc_perm` and `semid_ds` are not compliant across platforms thus we only implement it for linux.
Two unit tests are added for sys/ipc and sys/sem; one for each. This implementation also only declare the headers and entrypoints for x86_64 platform as it is only tested on such platform.
---
Patch is 35.40 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/182683.diff
39 Files Affected:
- (modified) libc/config/linux/x86_64/entrypoints.txt (+8)
- (modified) libc/config/linux/x86_64/headers.txt (+2)
- (modified) libc/include/CMakeLists.txt (+29)
- (modified) libc/include/llvm-libc-macros/CMakeLists.txt (+12)
- (modified) libc/include/llvm-libc-macros/linux/CMakeLists.txt (+12)
- (added) libc/include/llvm-libc-macros/linux/sys-ipc-macros.h (+24)
- (added) libc/include/llvm-libc-macros/linux/sys-sem-macros.h (+24)
- (added) libc/include/llvm-libc-macros/sys-ipc-macros.h (+16)
- (added) libc/include/llvm-libc-macros/sys-sem-macros.h (+16)
- (modified) libc/include/llvm-libc-types/CMakeLists.txt (+17)
- (added) libc/include/llvm-libc-types/key_t.h (+14)
- (added) libc/include/llvm-libc-types/struct_ipc_perm.h (+33)
- (added) libc/include/llvm-libc-types/struct_sembuf.h (+18)
- (added) libc/include/llvm-libc-types/struct_semid_ds.h (+30)
- (added) libc/include/sys/ipc.h.def (+18)
- (added) libc/include/sys/ipc.yaml (+19)
- (added) libc/include/sys/sem.h.def (+19)
- (added) libc/include/sys/sem.yaml (+38)
- (modified) libc/include/sys/types.yaml (+1)
- (modified) libc/src/sys/CMakeLists.txt (+2)
- (added) libc/src/sys/ipc/CMakeLists.txt (+10)
- (added) libc/src/sys/ipc/ftok.h (+22)
- (added) libc/src/sys/ipc/linux/CMakeLists.txt (+10)
- (added) libc/src/sys/ipc/linux/ftok.cpp (+28)
- (added) libc/src/sys/sem/CMakeLists.txt (+24)
- (added) libc/src/sys/sem/linux/CMakeLists.txt (+38)
- (added) libc/src/sys/sem/linux/semctl.cpp (+98)
- (added) libc/src/sys/sem/linux/semget.cpp (+32)
- (added) libc/src/sys/sem/linux/semop.cpp (+32)
- (added) libc/src/sys/sem/semctl.h (+21)
- (added) libc/src/sys/sem/semget.h (+22)
- (added) libc/src/sys/sem/semop.h (+22)
- (modified) libc/test/src/sys/CMakeLists.txt (+2)
- (added) libc/test/src/sys/ipc/CMakeLists.txt (+3)
- (added) libc/test/src/sys/ipc/linux/CMakeLists.txt (+19)
- (added) libc/test/src/sys/ipc/linux/ftok_test.cpp (+59)
- (added) libc/test/src/sys/sem/CMakeLists.txt (+3)
- (added) libc/test/src/sys/sem/linux/CMakeLists.txt (+18)
- (added) libc/test/src/sys/sem/linux/sem_test.cpp (+69)
``````````diff
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index 6f0ecf0c6885d..14338dad5903b 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -251,6 +251,14 @@ set(TARGET_LIBC_ENTRYPOINTS
# sys/ioctl.h entrypoints
libc.src.sys.ioctl.ioctl
+ # sys/ipc.h entrypoints
+ libc.src.sys.ipc.ftok
+
+ # sys/sem.h entrypoints
+ libc.src.sys.sem.semget
+ libc.src.sys.sem.semctl
+ libc.src.sys.sem.semop
+
# sys/mman.h entrypoints
libc.src.sys.mman.madvise
libc.src.sys.mman.mincore
diff --git a/libc/config/linux/x86_64/headers.txt b/libc/config/linux/x86_64/headers.txt
index d0f62eb104dcc..19e12b528b8a1 100644
--- a/libc/config/linux/x86_64/headers.txt
+++ b/libc/config/linux/x86_64/headers.txt
@@ -38,11 +38,13 @@ set(TARGET_PUBLIC_HEADERS
libc.include.sys_auxv
libc.include.sys_epoll
libc.include.sys_ioctl
+ libc.include.sys_ipc
libc.include.sys_mman
libc.include.sys_prctl
libc.include.sys_queue
libc.include.sys_random
libc.include.sys_resource
+ libc.include.sys_sem
libc.include.sys_select
libc.include.sys_socket
libc.include.sys_stat
diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt
index c6254aafe3849..5c1f3b030e10d 100644
--- a/libc/include/CMakeLists.txt
+++ b/libc/include/CMakeLists.txt
@@ -557,6 +557,20 @@ add_header_macro(
.llvm-libc-macros.sys_ioctl_macros
)
+add_header_macro(
+ sys_ipc
+ ../libc/include/sys/ipc.yaml
+ sys/ipc.h
+ DEPENDS
+ .llvm_libc_common_h
+ .llvm-libc-macros.sys_ipc_macros
+ .llvm-libc-types.key_t
+ .llvm-libc-types.uid_t
+ .llvm-libc-types.gid_t
+ .llvm-libc-types.mode_t
+ .llvm-libc-types.struct_ipc_perm
+)
+
add_header_macro(
sys_mman
../libc/include/sys/mman.yaml
@@ -643,6 +657,20 @@ add_header_macro(
.llvm-libc-types.struct_timeval
)
+add_header_macro(
+ sys_sem
+ ../libc/include/sys/sem.yaml
+ sys/sem.h
+ DEPENDS
+ .llvm_libc_common_h
+ .llvm-libc-macros.sys_sem_macros
+ .llvm-libc-types.key_t
+ .llvm-libc-types.size_t
+ .llvm-libc-types.struct_ipc_perm
+ .llvm-libc-types.struct_semid_ds
+ .llvm-libc-types.struct_sembuf
+)
+
add_header_macro(
sys_sendfile
../libc/include/sys/sendfile.yaml
@@ -708,6 +736,7 @@ add_header_macro(
.llvm-libc-types.dev_t
.llvm-libc-types.gid_t
.llvm-libc-types.ino_t
+ .llvm-libc-types.key_t
.llvm-libc-types.mode_t
.llvm-libc-types.nlink_t
.llvm-libc-types.off_t
diff --git a/libc/include/llvm-libc-macros/CMakeLists.txt b/libc/include/llvm-libc-macros/CMakeLists.txt
index b16337cccd58b..6285283cc763c 100644
--- a/libc/include/llvm-libc-macros/CMakeLists.txt
+++ b/libc/include/llvm-libc-macros/CMakeLists.txt
@@ -226,6 +226,12 @@ add_macro_header(
sys-ioctl-macros.h
)
+add_macro_header(
+ sys_ipc_macros
+ HDR
+ sys-ipc-macros.h
+)
+
add_macro_header(
sys_stat_macros
HDR
@@ -265,6 +271,12 @@ add_macro_header(
sys-select-macros.h
)
+add_macro_header(
+ sys_sem_macros
+ HDR
+ sys-sem-macros.h
+)
+
add_macro_header(
sys_socket_macros
HDR
diff --git a/libc/include/llvm-libc-macros/linux/CMakeLists.txt b/libc/include/llvm-libc-macros/linux/CMakeLists.txt
index 61da55eabd40b..e6a95457a5b91 100644
--- a/libc/include/llvm-libc-macros/linux/CMakeLists.txt
+++ b/libc/include/llvm-libc-macros/linux/CMakeLists.txt
@@ -34,12 +34,24 @@ add_header(
sys-ioctl-macros.h
)
+add_header(
+ sys_ipc_macros
+ HDR
+ sys-ipc-macros.h
+)
+
add_header(
sys_random_macros
HDR
sys-random-macros.h
)
+add_header(
+ sys_sem_macros
+ HDR
+ sys-sem-macros.h
+)
+
add_header(
sys_socket_macros
HDR
diff --git a/libc/include/llvm-libc-macros/linux/sys-ipc-macros.h b/libc/include/llvm-libc-macros/linux/sys-ipc-macros.h
new file mode 100644
index 0000000000000..111f48542c518
--- /dev/null
+++ b/libc/include/llvm-libc-macros/linux/sys-ipc-macros.h
@@ -0,0 +1,24 @@
+//===-- Definition of macros from sys/ipc.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_LINUX_SYS_IPC_MACROS_H
+#define LLVM_LIBC_MACROS_LINUX_SYS_IPC_MACROS_H
+
+#define IPC_PRIVATE 0
+
+// Resource get request flags.
+#define IPC_CREAT 00001000
+#define IPC_EXCL 00002000
+#define IPC_NOWAIT 00004000
+
+// Control commands used with semctl, msgctl, and shmctl.
+#define IPC_RMID 0
+#define IPC_SET 1
+#define IPC_STAT 2
+
+#endif // LLVM_LIBC_MACROS_LINUX_SYS_IPC_MACROS_H
diff --git a/libc/include/llvm-libc-macros/linux/sys-sem-macros.h b/libc/include/llvm-libc-macros/linux/sys-sem-macros.h
new file mode 100644
index 0000000000000..f6a7a2ed83d45
--- /dev/null
+++ b/libc/include/llvm-libc-macros/linux/sys-sem-macros.h
@@ -0,0 +1,24 @@
+//===-- Definition of macros from sys/sem.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_LINUX_SYS_SEM_MACROS_H
+#define LLVM_LIBC_MACROS_LINUX_SYS_SEM_MACROS_H
+
+// semop flags
+#define SEM_UNDO 0x1000
+
+// semctl command definitions
+#define GETPID 11
+#define GETVAL 12
+#define GETALL 13
+#define GETNCNT 14
+#define GETZCNT 15
+#define SETVAL 16
+#define SETALL 17
+
+#endif // LLVM_LIBC_MACROS_LINUX_SYS_SEM_MACROS_H
diff --git a/libc/include/llvm-libc-macros/sys-ipc-macros.h b/libc/include/llvm-libc-macros/sys-ipc-macros.h
new file mode 100644
index 0000000000000..37e7e45456d2a
--- /dev/null
+++ b/libc/include/llvm-libc-macros/sys-ipc-macros.h
@@ -0,0 +1,16 @@
+//===-- Macros defined in sys/ipc.h header file ---------------------------===//
+//
+// 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_SYS_IPC_MACROS_H
+#define LLVM_LIBC_MACROS_SYS_IPC_MACROS_H
+
+#ifdef __linux__
+#include "linux/sys-ipc-macros.h"
+#endif
+
+#endif // LLVM_LIBC_MACROS_SYS_IPC_MACROS_H
diff --git a/libc/include/llvm-libc-macros/sys-sem-macros.h b/libc/include/llvm-libc-macros/sys-sem-macros.h
new file mode 100644
index 0000000000000..801f82e79f5d4
--- /dev/null
+++ b/libc/include/llvm-libc-macros/sys-sem-macros.h
@@ -0,0 +1,16 @@
+//===-- Macros defined in sys/sem.h header file ---------------------------===//
+//
+// 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_SYS_SEM_MACROS_H
+#define LLVM_LIBC_MACROS_SYS_SEM_MACROS_H
+
+#ifdef __linux__
+#include "linux/sys-sem-macros.h"
+#endif
+
+#endif // LLVM_LIBC_MACROS_SYS_SEM_MACROS_H
diff --git a/libc/include/llvm-libc-types/CMakeLists.txt b/libc/include/llvm-libc-types/CMakeLists.txt
index dc36dfeadba57..70e4d7fd5d923 100644
--- a/libc/include/llvm-libc-types/CMakeLists.txt
+++ b/libc/include/llvm-libc-types/CMakeLists.txt
@@ -44,6 +44,7 @@ add_header(in_addr HDR in_addr.h DEPENDS .in_addr_t)
add_header(ino_t HDR ino_t.h)
add_header(mbstate_t HDR mbstate_t.h)
add_header(mode_t HDR mode_t.h)
+add_header(key_t HDR key_t.h)
add_header(mtx_t HDR mtx_t.h DEPENDS .__futex_word .__mutex_type)
add_header(nfds_t HDR nfds_t.h)
add_header(nl_catd HDR nl_catd.h)
@@ -79,9 +80,25 @@ add_header(dl_info HDR Dl_info.h)
add_header(struct_f_owner_ex HDR struct_f_owner_ex.h DEPENDS .pid_t)
add_header(struct_flock HDR struct_flock.h DEPENDS .off_t .pid_t)
add_header(struct_flock64 HDR struct_flock64.h DEPENDS .off64_t .pid_t)
+add_header(
+ struct_ipc_perm
+ HDR struct_ipc_perm.h
+ DEPENDS
+ .uid_t
+ .gid_t
+ .mode_t
+)
add_header(struct_pollfd HDR struct_pollfd.h)
add_header(struct_rlimit HDR struct_rlimit.h DEPENDS .rlim_t)
add_header(struct_sched_param HDR struct_sched_param.h)
+add_header(struct_sembuf HDR struct_sembuf.h)
+add_header(
+ struct_semid_ds
+ HDR struct_semid_ds.h
+ DEPENDS
+ .struct_ipc_perm
+ .time_t
+)
add_header(struct_timeval HDR struct_timeval.h DEPENDS .suseconds_t .time_t)
add_header(struct_itimerval HDR struct_itimerval.h DEPENDS .struct_timeval)
add_header(struct_rusage HDR struct_rusage.h DEPENDS .struct_timeval)
diff --git a/libc/include/llvm-libc-types/key_t.h b/libc/include/llvm-libc-types/key_t.h
new file mode 100644
index 0000000000000..1515469880862
--- /dev/null
+++ b/libc/include/llvm-libc-types/key_t.h
@@ -0,0 +1,14 @@
+//===-- Definition of key_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_KEY_T_H
+#define LLVM_LIBC_TYPES_KEY_T_H
+
+typedef __INT32_TYPE__ key_t;
+
+#endif // LLVM_LIBC_TYPES_KEY_T_H
diff --git a/libc/include/llvm-libc-types/struct_ipc_perm.h b/libc/include/llvm-libc-types/struct_ipc_perm.h
new file mode 100644
index 0000000000000..60c021cd5a1cf
--- /dev/null
+++ b/libc/include/llvm-libc-types/struct_ipc_perm.h
@@ -0,0 +1,33 @@
+//===-- Definition of struct ipc_perm -------------------------------------===//
+//
+// 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_IPC_PERM_H
+#define LLVM_LIBC_TYPES_STRUCT_IPC_PERM_H
+
+#include "gid_t.h"
+#include "key_t.h"
+#include "uid_t.h"
+
+#ifdef __linux__
+struct ipc_perm {
+ key_t __key;
+ uid_t uid;
+ gid_t gid;
+ uid_t cuid;
+ gid_t cgid;
+ unsigned short mode;
+ unsigned short seq;
+ unsigned short padding;
+ unsigned long unused_0;
+ unsigned long unused_1;
+};
+#else
+#error "ipc_perm not defined for the target platform"
+#endif
+
+#endif // LLVM_LIBC_TYPES_STRUCT_IPC_PERM_H
diff --git a/libc/include/llvm-libc-types/struct_sembuf.h b/libc/include/llvm-libc-types/struct_sembuf.h
new file mode 100644
index 0000000000000..4f1171698acc6
--- /dev/null
+++ b/libc/include/llvm-libc-types/struct_sembuf.h
@@ -0,0 +1,18 @@
+//===-- Definition of struct sembuf ---------------------------------------===//
+//
+// 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_SEMBUF_H
+#define LLVM_LIBC_TYPES_STRUCT_SEMBUF_H
+
+struct sembuf {
+ unsigned short sem_num;
+ short sem_op;
+ short sem_flg;
+};
+
+#endif // LLVM_LIBC_TYPES_STRUCT_SEMBUF_H
diff --git a/libc/include/llvm-libc-types/struct_semid_ds.h b/libc/include/llvm-libc-types/struct_semid_ds.h
new file mode 100644
index 0000000000000..48e4b173bb462
--- /dev/null
+++ b/libc/include/llvm-libc-types/struct_semid_ds.h
@@ -0,0 +1,30 @@
+//===-- Definition of struct semid_ds -------------------------------------===//
+//
+// 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_SEMID_DS_H
+#define LLVM_LIBC_TYPES_STRUCT_SEMID_DS_H
+
+#include "struct_ipc_perm.h"
+#include "time_t.h"
+
+#ifdef __linux__
+struct semid_ds {
+ struct ipc_perm sem_perm;
+ time_t sem_otime; // last semop time
+ unsigned long otime_high;
+ time_t sem_ctime; // last time changed by semctl
+ unsigned long ctime_high;
+ unsigned long sem_nsems;
+ unsigned long unused0;
+ unsigned long unused1;
+};
+#else
+#error "semid_ds not defined for the target platform"
+#endif
+
+#endif // LLVM_LIBC_TYPES_STRUCT_SEMID_DS_H
diff --git a/libc/include/sys/ipc.h.def b/libc/include/sys/ipc.h.def
new file mode 100644
index 0000000000000..8688bad8a1159
--- /dev/null
+++ b/libc/include/sys/ipc.h.def
@@ -0,0 +1,18 @@
+//===-- Linux header sys/ipc.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_SYS_IPC_H
+#define LLVM_LIBC_SYS_IPC_H
+
+#include "__llvm-libc-common.h"
+
+#include "../llvm-libc-macros/sys-ipc-macros.h"
+
+%%public_api()
+
+#endif // LLVM_LIBC_SYS_IPC_H
diff --git a/libc/include/sys/ipc.yaml b/libc/include/sys/ipc.yaml
new file mode 100644
index 0000000000000..172f5f64a3398
--- /dev/null
+++ b/libc/include/sys/ipc.yaml
@@ -0,0 +1,19 @@
+header: sys/ipc.h
+header_template: ipc.h.def
+standards:
+ - Linux
+types:
+ - type_name: key_t
+ - type_name: uid_t
+ - type_name: gid_t
+ - type_name: struct_ipc_perm
+functions:
+ - name: ftok
+ standards:
+ - Linux
+ return_type: key_t
+ arguments:
+ - type: const char *
+ - type: int
+enums: []
+objects: []
diff --git a/libc/include/sys/sem.h.def b/libc/include/sys/sem.h.def
new file mode 100644
index 0000000000000..3014c986e25ad
--- /dev/null
+++ b/libc/include/sys/sem.h.def
@@ -0,0 +1,19 @@
+//===-- Linux header sys/sem.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_SYS_SEM_H
+#define LLVM_LIBC_SYS_SEM_H
+
+#include "__llvm-libc-common.h"
+
+#include "ipc.h"
+#include "../llvm-libc-macros/sys-sem-macros.h"
+
+%%public_api()
+
+#endif // LLVM_LIBC_SYS_SEM_H
diff --git a/libc/include/sys/sem.yaml b/libc/include/sys/sem.yaml
new file mode 100644
index 0000000000000..769db5c4df6c0
--- /dev/null
+++ b/libc/include/sys/sem.yaml
@@ -0,0 +1,38 @@
+header: sys/sem.h
+header_template: sem.h.def
+standards:
+ - Linux
+types:
+ - type_name: key_t
+ - type_name: size_t
+ - type_name: struct_ipc_perm
+ - type_name: struct_semid_ds
+ - type_name: struct_sembuf
+functions:
+ - name: semctl
+ standards:
+ - Linux
+ return_type: int
+ arguments:
+ - type: int
+ - type: int
+ - type: int
+ - type: '...'
+ - name: semget
+ standards:
+ - Linux
+ return_type: int
+ arguments:
+ - type: key_t
+ - type: int
+ - type: int
+ - name: semop
+ standards:
+ - Linux
+ return_type: int
+ arguments:
+ - type: int
+ - type: struct sembuf *
+ - type: size_t
+enums: []
+objects: []
diff --git a/libc/include/sys/types.yaml b/libc/include/sys/types.yaml
index a00429d3817e1..126c597b30353 100644
--- a/libc/include/sys/types.yaml
+++ b/libc/include/sys/types.yaml
@@ -8,6 +8,7 @@ types:
- type_name: dev_t
- type_name: gid_t
- type_name: ino_t
+ - type_name: key_t
- type_name: mode_t
- type_name: nlink_t
- type_name: off_t
diff --git a/libc/src/sys/CMakeLists.txt b/libc/src/sys/CMakeLists.txt
index 0fa11e9eee696..41becce798ddd 100644
--- a/libc/src/sys/CMakeLists.txt
+++ b/libc/src/sys/CMakeLists.txt
@@ -1,10 +1,12 @@
add_subdirectory(auxv)
add_subdirectory(epoll)
+add_subdirectory(ipc)
add_subdirectory(mman)
add_subdirectory(random)
add_subdirectory(resource)
add_subdirectory(select)
add_subdirectory(socket)
+add_subdirectory(sem)
add_subdirectory(sendfile)
add_subdirectory(stat)
add_subdirectory(statvfs)
diff --git a/libc/src/sys/ipc/CMakeLists.txt b/libc/src/sys/ipc/CMakeLists.txt
new file mode 100644
index 0000000000000..e20ac7e3f964e
--- /dev/null
+++ b/libc/src/sys/ipc/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(
+ ftok
+ ALIAS
+ DEPENDS
+ .${LIBC_TARGET_OS}.ftok
+)
diff --git a/libc/src/sys/ipc/ftok.h b/libc/src/sys/ipc/ftok.h
new file mode 100644
index 0000000000000..6b9d0fa40b028
--- /dev/null
+++ b/libc/src/sys/ipc/ftok.h
@@ -0,0 +1,22 @@
+//===-- Implementation header for ftok ---------------------------*- 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_IPC_FTOK_H
+#define LLVM_LIBC_SRC_SYS_IPC_FTOK_H
+
+#include "src/__support/macros/config.h"
+#include <sys/ipc.h>
+
+namespace LIBC_NAMESPACE_DECL {
+
+key_t ftok(const char *path, int id);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_SYS_IPC_FTOK_H
diff --git a/libc/src/sys/ipc/linux/CMakeLists.txt b/libc/src/sys/ipc/linux/CMakeLists.txt
new file mode 100644
index 0000000000000..c2fdebcf989dc
--- /dev/null
+++ b/libc/src/sys/ipc/linux/CMakeLists.txt
@@ -0,0 +1,10 @@
+add_entrypoint_object(
+ ftok
+ SRCS
+ ftok.cpp
+ HDRS
+ ../ftok.h
+ DEPENDS
+ libc.include.sys_ipc
+ libc.src.sys.stat.stat
+)
diff --git a/libc/src/sys/ipc/linux/ftok.cpp b/libc/src/sys/ipc/linux/ftok.cpp
new file mode 100644
index 0000000000000..6d0920c77ced3
--- /dev/null
+++ b/libc/src/sys/ipc/linux/ftok.cpp
@@ -0,0 +1,28 @@
+//===-- Linux implementation of ftok -------------------------------------===//
+//
+// 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 "src/sys/ipc/ftok.h"
+
+#include "src/__support/common.h"
+#include "src/sys/stat/stat.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(key_t, ftok, (const char *path, int id)) {
+
+ // ftok implements based on stat
+ struct stat st;
+ if (LIBC_NAMESPACE::stat(path, &st) < 0)
+ return -1;
+
+ return static_cast<key_t>(((id & 0xff) << 24) |
+ ((static_cast<int>(st.st_dev) & 0xff) << 16) |
+ (static_cast<int>(st.st_ino) & 0xffff));
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/sys/sem/CMakeLists.txt b/libc/src/sys/sem/CMakeLists.txt
new file mode 100644
index 0000000000000..4b9bd851b9d2d
--- /dev/null
+++ b/libc/src/sys/sem/CMakeLists.txt
@@ -0,0 +1,24 @@
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS})
+ add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS})
+endif()
+
+add_entrypoint_object(
+ semget
+ ALIAS
+ DEPENDS
+ .${LIBC_TARGET_OS}.semget
+)
+
+add_entrypoint_object(
+ semctl
+ ALIAS
+ DEPENDS
+ .${LIBC_TARGET_OS}.semctl
+)
+
+add_entrypoint_object(
+ semop
+ ALIAS
+ DEPENDS
+ .${LIBC_TARGET_OS}.semop
+)
diff --git a/libc/src/sys/sem/linux/CMakeLists.txt b/libc/src/sys/sem/linux/CMakeLists.txt
new file mode 100644
index 0000000000000..11b4ee6e98c6f
--- /dev/null
+++ b/libc/src/sys/sem/linux/CMakeLists.txt
@@ -0,0 +1,38 @@
+add_entrypoint_object(
+ semget
+ SRCS
+ semget.cpp
+ HDRS
+ ../semget.h
+ DEPENDS
+ libc.include.sys_sem
+ libc.incl...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/182683
More information about the libc-commits
mailing list