[libc] Add implementations of POSIX getpid, getppid, getuid, geteuid functions.
authorSiva Chandra Reddy <sivachandra@google.com>
Wed, 21 Sep 2022 08:13:14 +0000 (08:13 +0000)
committerSiva Chandra Reddy <sivachandra@google.com>
Wed, 21 Sep 2022 18:41:20 +0000 (18:41 +0000)
Reviewed By: lntue

Differential Revision: https://reviews.llvm.org/D134338

21 files changed:
libc/config/linux/api.td
libc/config/linux/x86_64/entrypoints.txt
libc/include/CMakeLists.txt
libc/include/llvm-libc-types/CMakeLists.txt
libc/include/llvm-libc-types/pid_t.h [new file with mode: 0644]
libc/spec/posix.td
libc/src/unistd/CMakeLists.txt
libc/src/unistd/geteuid.h [new file with mode: 0644]
libc/src/unistd/getpid.h [new file with mode: 0644]
libc/src/unistd/getppid.h [new file with mode: 0644]
libc/src/unistd/getuid.h [new file with mode: 0644]
libc/src/unistd/linux/CMakeLists.txt
libc/src/unistd/linux/geteuid.cpp [new file with mode: 0644]
libc/src/unistd/linux/getpid.cpp [new file with mode: 0644]
libc/src/unistd/linux/getppid.cpp [new file with mode: 0644]
libc/src/unistd/linux/getuid.cpp [new file with mode: 0644]
libc/test/src/unistd/CMakeLists.txt
libc/test/src/unistd/geteuid_test.cpp [new file with mode: 0644]
libc/test/src/unistd/getpid_test.cpp [new file with mode: 0644]
libc/test/src/unistd/getppid_test.cpp [new file with mode: 0644]
libc/test/src/unistd/getuid_test.cpp [new file with mode: 0644]

index 665620e..8dbe3aa 100644 (file)
@@ -269,7 +269,7 @@ def DirentAPI : PublicAPI<"dirent.h"> {
 }
 
 def UniStdAPI : PublicAPI<"unistd.h"> {
-  let Types = ["off_t", "size_t", "ssize_t"];
+  let Types = ["off_t", "pid_t", "size_t", "ssize_t", "uid_t"];
 }
 
 def SysResourceAPI : PublicAPI<"sys/resource.h"> {
index 5d5d73e..04f403d 100644 (file)
@@ -132,6 +132,10 @@ set(TARGET_LIBC_ENTRYPOINTS
     libc.src.unistd.fchdir
     libc.src.unistd.fsync
     libc.src.unistd.ftruncate
+    libc.src.unistd.geteuid
+    libc.src.unistd.getpid
+    libc.src.unistd.getppid
+    libc.src.unistd.getuid
     libc.src.unistd.link
     libc.src.unistd.linkat
     libc.src.unistd.lseek
index 30b4af0..cc7ec17 100644 (file)
@@ -169,8 +169,10 @@ add_gen_header(
     .llvm_libc_common_h
     .llvm-libc-macros.file_seek_macros
     .llvm-libc-macros.unistd_macros
+    .llvm-libc-types.pid_t
     .llvm-libc-types.size_t
     .llvm-libc-types.ssize_t
+    .llvm-libc-types.uid_t
 )
 
 add_gen_header(
index 432278e..5fde05a 100644 (file)
@@ -32,6 +32,7 @@ add_header(mtx_t HDR mtx_t.h DEPENDS .__futex_word .__mutex_type)
 add_header(nlink_t HDR nlink_t.h)
 add_header(off_t HDR off_t.h)
 add_header(once_flag HDR once_flag.h DEPENDS .__futex_word)
+add_header(pid_t HDR pid_t.h)
 add_header(pthread_attr_t HDR pthread_attr_t.h DEPENDS .size_t)
 add_header(pthread_key_t HDR pthread_key_t.h)
 add_header(pthread_mutex_t HDR pthread_mutex_t.h DEPENDS .__futex_word .__mutex_type)
diff --git a/libc/include/llvm-libc-types/pid_t.h b/libc/include/llvm-libc-types/pid_t.h
new file mode 100644 (file)
index 0000000..d78fde7
--- /dev/null
@@ -0,0 +1,14 @@
+//===-- Definition of pid_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_PID_t_H__
+#define __LLVM_LIBC_TYPES_PID_t_H__
+
+typedef __INT32_TYPE__ pid_t;
+
+#endif // __LLVM_LIBC_TYPES_PID_t_H__
index 3c5e093..df35e55 100644 (file)
@@ -23,6 +23,7 @@ def BlkSizeT : NamedType<"blksize_t">;
 def BlkCntT : NamedType<"blkcnt_t">;
 def NLinkT : NamedType<"nlink_t">;
 def TimeSpec : NamedType<"struct timespec">;
+def PidT : NamedType<"pid_t">;
 
 def StatType : NamedType<"struct stat">;
 def StatTypePtr : PtrType<StatType>;
@@ -270,6 +271,8 @@ def POSIX : StandardSpec<"POSIX"> {
       OffTType,
       SSizeTType,
       SizeTType,
+      PidT,
+      UidT,
     ],
     [], // Enumerations
     [
@@ -319,6 +322,81 @@ def POSIX : StandardSpec<"POSIX"> {
           [ArgSpec<ConstCharPtr>, ArgSpec<OffTType>]
         >,
         FunctionSpec<
+          "geteuid",
+          RetValSpec<UidT>,
+          [ArgSpec<VoidType>]
+        >,
+        FunctionSpec<
+          "getpid",
+          RetValSpec<PidT>,
+          [ArgSpec<VoidType>]
+        >,
+        FunctionSpec<
+          "getppid",
+          RetValSpec<PidT>,
+          [ArgSpec<VoidType>]
+        >,
+        FunctionSpec<
+          "getuid",
+          RetValSpec<UidT>,
+          [ArgSpec<VoidType>]
+        >,
+        FunctionSpec<
+          "link",
+          RetValSpec<IntType>,
+          [ArgSpec<ConstCharPtr>, ArgSpec<ConstCharPtr>]
+        >,
+        FunctionSpec<
+          "linkat",
+          RetValSpec<IntType>,
+          [ArgSpec<IntType>, ArgSpec<ConstCharPtr>, ArgSpec<IntType>, ArgSpec<ConstCharPtr>, ArgSpec<IntType>]
+        >,
+        FunctionSpec<
+          "lseek",
+          RetValSpec<OffTType>,
+          [ArgSpec<IntType>, ArgSpec<OffTType>, ArgSpec<IntType>]
+        >,
+        FunctionSpec<
+          "pread",
+          RetValSpec<SSizeTType>,
+          [ArgSpec<IntType>, ArgSpec<VoidPtr>, ArgSpec<SizeTType>, ArgSpec<OffTType>]
+        >,
+        FunctionSpec<
+          "pwrite",
+          RetValSpec<SSizeTType>,
+          [ArgSpec<IntType>, ArgSpec<ConstVoidPtr>, ArgSpec<SizeTType>, ArgSpec<OffTType>]
+        >,
+        FunctionSpec<
+          "read",
+          RetValSpec<SSizeTType>,
+          [ArgSpec<IntType>, ArgSpec<VoidPtr>, ArgSpec<SizeTType>]
+        >,
+        FunctionSpec<
+          "readlink",
+          RetValSpec<SSizeTType>,
+          [ArgSpec<ConstCharRestrictedPtr>, ArgSpec<CharRestrictedPtr>, ArgSpec<SizeTType>]
+        >,
+        FunctionSpec<
+          "readlinkat",
+          RetValSpec<SSizeTType>,
+          [ArgSpec<ConstCharRestrictedPtr>, ArgSpec<CharRestrictedPtr>, ArgSpec<SizeTType>]
+        >,
+        FunctionSpec<
+          "rmdir",
+          RetValSpec<IntType>,
+          [ArgSpec<ConstCharPtr>]
+        >,
+        FunctionSpec<
+          "getpid",
+          RetValSpec<IntType>,
+          [ArgSpec<VoidType>]
+        >,
+        FunctionSpec<
+          "getppid",
+          RetValSpec<IntType>,
+          [ArgSpec<VoidType>]
+        >,
+        FunctionSpec<
           "link",
           RetValSpec<IntType>,
           [ArgSpec<ConstCharPtr>, ArgSpec<ConstCharPtr>]
index bc50157..437556c 100644 (file)
@@ -66,6 +66,34 @@ add_entrypoint_object(
 )
 
 add_entrypoint_object(
+  getpid
+  ALIAS
+  DEPENDS
+    .${LIBC_TARGET_OS}.getpid
+)
+
+add_entrypoint_object(
+  getppid
+  ALIAS
+  DEPENDS
+    .${LIBC_TARGET_OS}.getppid
+)
+
+add_entrypoint_object(
+  geteuid
+  ALIAS
+  DEPENDS
+    .${LIBC_TARGET_OS}.geteuid
+)
+
+add_entrypoint_object(
+  getuid
+  ALIAS
+  DEPENDS
+    .${LIBC_TARGET_OS}.getuid
+)
+
+add_entrypoint_object(
   link
   ALIAS
   DEPENDS
diff --git a/libc/src/unistd/geteuid.h b/libc/src/unistd/geteuid.h
new file mode 100644 (file)
index 0000000..0df98fb
--- /dev/null
@@ -0,0 +1,20 @@
+//===-- Implementation header for geteuid -----------------------*- 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_UNISTD_GETEUID_H
+#define LLVM_LIBC_SRC_UNISTD_GETEUID_H
+
+#include <unistd.h>
+
+namespace __llvm_libc {
+
+uid_t geteuid();
+
+} // namespace __llvm_libc
+
+#endif // LLVM_LIBC_SRC_UNISTD_GETEUID_H
diff --git a/libc/src/unistd/getpid.h b/libc/src/unistd/getpid.h
new file mode 100644 (file)
index 0000000..7b6b9b1
--- /dev/null
@@ -0,0 +1,20 @@
+//===-- Implementation header for getpid ------------------------*- 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_UNISTD_GETPID_H
+#define LLVM_LIBC_SRC_UNISTD_GETPID_H
+
+#include <unistd.h>
+
+namespace __llvm_libc {
+
+pid_t getpid();
+
+} // namespace __llvm_libc
+
+#endif // LLVM_LIBC_SRC_UNISTD_GETPID_H
diff --git a/libc/src/unistd/getppid.h b/libc/src/unistd/getppid.h
new file mode 100644 (file)
index 0000000..c574477
--- /dev/null
@@ -0,0 +1,20 @@
+//===-- Implementation header for getppid -----------------------*- 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_UNISTD_GETPPID_H
+#define LLVM_LIBC_SRC_UNISTD_GETPPID_H
+
+#include <unistd.h>
+
+namespace __llvm_libc {
+
+pid_t getppid();
+
+} // namespace __llvm_libc
+
+#endif // LLVM_LIBC_SRC_UNISTD_GETPPID_H
diff --git a/libc/src/unistd/getuid.h b/libc/src/unistd/getuid.h
new file mode 100644 (file)
index 0000000..e3501ca
--- /dev/null
@@ -0,0 +1,20 @@
+//===-- Implementation header for getuid ------------------------*- 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_UNISTD_GETUID_H
+#define LLVM_LIBC_SRC_UNISTD_GETUID_H
+
+#include <unistd.h>
+
+namespace __llvm_libc {
+
+uid_t getuid();
+
+} // namespace __llvm_libc
+
+#endif // LLVM_LIBC_SRC_UNISTD_GETUID_H
index 186fdc2..6c1bf34 100644 (file)
@@ -117,6 +117,54 @@ add_entrypoint_object(
 )
 
 add_entrypoint_object(
+  geteuid
+  SRCS
+    geteuid.cpp
+  HDRS
+    ../geteuid.h
+  DEPENDS
+    libc.include.unistd
+    libc.include.sys_syscall
+    libc.src.__support.OSUtil.osutil
+)
+
+add_entrypoint_object(
+  getpid
+  SRCS
+    getpid.cpp
+  HDRS
+    ../getpid.h
+  DEPENDS
+    libc.include.unistd
+    libc.include.sys_syscall
+    libc.src.__support.OSUtil.osutil
+)
+
+add_entrypoint_object(
+  getppid
+  SRCS
+    getppid.cpp
+  HDRS
+    ../getppid.h
+  DEPENDS
+    libc.include.unistd
+    libc.include.sys_syscall
+    libc.src.__support.OSUtil.osutil
+)
+
+add_entrypoint_object(
+  getuid
+  SRCS
+    getuid.cpp
+  HDRS
+    ../getuid.h
+  DEPENDS
+    libc.include.unistd
+    libc.include.sys_syscall
+    libc.src.__support.OSUtil.osutil
+)
+
+add_entrypoint_object(
   link
   SRCS
     link.cpp
diff --git a/libc/src/unistd/linux/geteuid.cpp b/libc/src/unistd/linux/geteuid.cpp
new file mode 100644 (file)
index 0000000..734da5a
--- /dev/null
@@ -0,0 +1,22 @@
+//===-- Linux implementation of geteuid -----------------------------------===//
+//
+// 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/unistd/geteuid.h"
+
+#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
+#include "src/__support/common.h"
+
+#include <sys/syscall.h> // For syscall numbers.
+
+namespace __llvm_libc {
+
+LLVM_LIBC_FUNCTION(uid_t, geteuid, ()) {
+  return __llvm_libc::syscall(SYS_geteuid);
+}
+
+} // namespace __llvm_libc
diff --git a/libc/src/unistd/linux/getpid.cpp b/libc/src/unistd/linux/getpid.cpp
new file mode 100644 (file)
index 0000000..d00112f
--- /dev/null
@@ -0,0 +1,22 @@
+//===-- Linux implementation of getpid ------------------------------------===//
+//
+// 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/unistd/getpid.h"
+
+#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
+#include "src/__support/common.h"
+
+#include <sys/syscall.h> // For syscall numbers.
+
+namespace __llvm_libc {
+
+LLVM_LIBC_FUNCTION(pid_t, getpid, ()) {
+  return __llvm_libc::syscall(SYS_getpid);
+}
+
+} // namespace __llvm_libc
diff --git a/libc/src/unistd/linux/getppid.cpp b/libc/src/unistd/linux/getppid.cpp
new file mode 100644 (file)
index 0000000..be5ab23
--- /dev/null
@@ -0,0 +1,22 @@
+//===-- Linux implementation of getppid -----------------------------------===//
+//
+// 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/unistd/getppid.h"
+
+#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
+#include "src/__support/common.h"
+
+#include <sys/syscall.h> // For syscall numbers.
+
+namespace __llvm_libc {
+
+LLVM_LIBC_FUNCTION(pid_t, getppid, ()) {
+  return __llvm_libc::syscall(SYS_getppid);
+}
+
+} // namespace __llvm_libc
diff --git a/libc/src/unistd/linux/getuid.cpp b/libc/src/unistd/linux/getuid.cpp
new file mode 100644 (file)
index 0000000..716fa61
--- /dev/null
@@ -0,0 +1,22 @@
+//===-- Linux implementation of getuid ------------------------------------===//
+//
+// 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/unistd/getuid.h"
+
+#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
+#include "src/__support/common.h"
+
+#include <sys/syscall.h> // For syscall numbers.
+
+namespace __llvm_libc {
+
+LLVM_LIBC_FUNCTION(uid_t, getuid, ()) {
+  return __llvm_libc::syscall(SYS_getuid);
+}
+
+} // namespace __llvm_libc
index c4ad96b..8f35efe 100644 (file)
@@ -321,3 +321,43 @@ add_libc_unittest(
     libc.src.unistd.close
     libc.src.unistd.unlinkat
 )
+
+add_libc_unittest(
+  getpid_test
+  SUITE
+    libc_unistd_unittests
+  SRCS
+    getpid_test.cpp
+  DEPENDS
+    libc.src.unistd.getpid
+)
+
+add_libc_unittest(
+  getppid_test
+  SUITE
+    libc_unistd_unittests
+  SRCS
+    getppid_test.cpp
+  DEPENDS
+    libc.src.unistd.getppid
+)
+
+add_libc_unittest(
+  getuid_test
+  SUITE
+    libc_unistd_unittests
+  SRCS
+    getuid_test.cpp
+  DEPENDS
+    libc.src.unistd.getuid
+)
+
+add_libc_unittest(
+  geteuid_test
+  SUITE
+    libc_unistd_unittests
+  SRCS
+    geteuid_test.cpp
+  DEPENDS
+    libc.src.unistd.geteuid
+)
diff --git a/libc/test/src/unistd/geteuid_test.cpp b/libc/test/src/unistd/geteuid_test.cpp
new file mode 100644 (file)
index 0000000..878a16c
--- /dev/null
@@ -0,0 +1,15 @@
+//===-- Unittests for geteuid ---------------------------------------------===//
+//
+// 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/unistd/geteuid.h"
+#include "utils/UnitTest/Test.h"
+
+TEST(LlvmLibcGetEuidTest, SmokeTest) {
+  // geteuid always succeeds. So, we just call it as a smoke test.
+  __llvm_libc::geteuid();
+}
diff --git a/libc/test/src/unistd/getpid_test.cpp b/libc/test/src/unistd/getpid_test.cpp
new file mode 100644 (file)
index 0000000..15510bc
--- /dev/null
@@ -0,0 +1,15 @@
+//===-- Unittests for getpid ----------------------------------------------===//
+//
+// 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/unistd/getpid.h"
+#include "utils/UnitTest/Test.h"
+
+TEST(LlvmLibcGetPidTest, SmokeTest) {
+  // getpid always succeeds. So, we just call it as a smoke test.
+  __llvm_libc::getpid();
+}
diff --git a/libc/test/src/unistd/getppid_test.cpp b/libc/test/src/unistd/getppid_test.cpp
new file mode 100644 (file)
index 0000000..061c7ad
--- /dev/null
@@ -0,0 +1,15 @@
+//===-- Unittests for getppid ---------------------------------------------===//
+//
+// 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/unistd/getppid.h"
+#include "utils/UnitTest/Test.h"
+
+TEST(LlvmLibcGetPpidTest, SmokeTest) {
+  // getppid always succeeds. So, we just call it as a smoke test.
+  __llvm_libc::getppid();
+}
diff --git a/libc/test/src/unistd/getuid_test.cpp b/libc/test/src/unistd/getuid_test.cpp
new file mode 100644 (file)
index 0000000..3d43a42
--- /dev/null
@@ -0,0 +1,15 @@
+//===-- Unittests for getuid ----------------------------------------------===//
+//
+// 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/unistd/getuid.h"
+#include "utils/UnitTest/Test.h"
+
+TEST(LlvmLibcGetUidTest, SmokeTest) {
+  // getuid always succeeds. So, we just call it as a smoke test.
+  __llvm_libc::getuid();
+}