[libc] Add implementations of POSIX getpid, getppid, getuid, geteuid functions.

Reviewed By: lntue

Differential Revision: https://reviews.llvm.org/D134338
This commit is contained in:
Siva Chandra Reddy 2022-09-21 08:13:14 +00:00
parent e310f8bddf
commit 4f1474daec
21 changed files with 444 additions and 1 deletions

View 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"> {

View 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

View 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(

View 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)

View File

@ -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__

View 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
[
@ -318,6 +321,81 @@ def POSIX : StandardSpec<"POSIX"> {
RetValSpec<IntType>,
[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>,

View File

@ -65,6 +65,34 @@ add_entrypoint_object(
.${LIBC_TARGET_OS}.ftruncate
)
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

20
libc/src/unistd/geteuid.h Normal file
View File

@ -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

20
libc/src/unistd/getpid.h Normal file
View File

@ -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

20
libc/src/unistd/getppid.h Normal file
View File

@ -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

20
libc/src/unistd/getuid.h Normal file
View File

@ -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

View File

@ -116,6 +116,54 @@ add_entrypoint_object(
libc.src.errno.errno
)
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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View 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
)

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}