[libc] Add a skeleton for C standard condition variable functions.

This patch adds a skeleton as a preparatory step for the next patch which
adds the actual implementations of the condition variable functions.

Reviewed By: michaelrj

Differential Revision: https://reviews.llvm.org/D108947
This commit is contained in:
Siva Chandra Reddy 2021-08-27 18:49:40 +00:00
parent ccbb4c8b4f
commit 2f4f452f16
16 changed files with 330 additions and 0 deletions

View File

@ -344,6 +344,19 @@ def MtxT : TypeDecl<"mtx_t"> {
}];
}
def CndT : TypeDecl<"cnd_t"> {
let Decl = [{
typedef struct {
void *__qfront;
void *__qback;
struct {
unsigned char __w[4];
int __t;
} __qmtx;
} cnd_t;
}];
}
def ThreadStartT : TypeDecl<"thrd_start_t"> {
let Decl = "typedef int (*thrd_start_t)(void *);";
}
@ -363,6 +376,7 @@ def ThreadsAPI : PublicAPI<"threads.h"> {
OnceFlag,
CallOnceFuncT,
MtxT,
CndT,
ThreadStartT,
];

View File

@ -189,6 +189,11 @@ if(LLVM_LIBC_FULL_BUILD)
# threads.h entrypoints
libc.src.threads.call_once
libc.src.threads.cnd_broadcast
libc.src.threads.cnd_destroy
libc.src.threads.cnd_init
libc.src.threads.cnd_signal
libc.src.threads.cnd_wait
libc.src.threads.mtx_destroy
libc.src.threads.mtx_init
libc.src.threads.mtx_lock

View File

@ -77,6 +77,8 @@ def OnceFlagTypePtr : PtrType<OnceFlagType>;
def CallOnceFuncType : NamedType<"__call_once_func_t">;
def MtxTType : NamedType<"mtx_t">;
def MtxTTypePtr : PtrType<MtxTType>;
def CndTType : NamedType<"cnd_t">;
def CndTTypePtr : PtrType<CndTType>;
def ThrdStartTType : NamedType<"thrd_start_t">;
def ThrdTType : NamedType<"thrd_t">;
def ThrdTTypePtr : PtrType<ThrdTType>;

View File

@ -549,6 +549,7 @@ def StdC : StandardSpec<"stdc"> {
[
OnceFlagType,
CallOnceFuncType,
CndTType,
MtxTType,
ThrdStartTType,
ThrdTType,
@ -572,6 +573,42 @@ def StdC : StandardSpec<"stdc"> {
ArgSpec<CallOnceFuncType>,
]
>,
FunctionSpec<
"cnd_broadcast",
RetValSpec<IntType>,
[
ArgSpec<CndTTypePtr>,
]
>,
FunctionSpec<
"cnd_destroy",
RetValSpec<VoidType>,
[
ArgSpec<CndTTypePtr>,
]
>,
FunctionSpec<
"cnd_init",
RetValSpec<IntType>,
[
ArgSpec<CndTTypePtr>,
]
>,
FunctionSpec<
"cnd_signal",
RetValSpec<IntType>,
[
ArgSpec<CndTTypePtr>,
]
>,
FunctionSpec<
"cnd_wait",
RetValSpec<IntType>,
[
ArgSpec<CndTTypePtr>,
ArgSpec<MtxTTypePtr>,
]
>,
FunctionSpec<
"mtx_init",
RetValSpec<IntType>,

View File

@ -50,3 +50,38 @@ add_entrypoint_object(
DEPENDS
.${LIBC_TARGET_OS}.mtx_unlock
)
add_entrypoint_object(
cnd_init
ALIAS
DEPENDS
.${LIBC_TARGET_OS}.cnd_init
)
add_entrypoint_object(
cnd_destroy
ALIAS
DEPENDS
.${LIBC_TARGET_OS}.cnd_destroy
)
add_entrypoint_object(
cnd_wait
ALIAS
DEPENDS
.${LIBC_TARGET_OS}.cnd_wait
)
add_entrypoint_object(
cnd_signal
ALIAS
DEPENDS
.${LIBC_TARGET_OS}.cnd_signal
)
add_entrypoint_object(
cnd_broadcast
ALIAS
DEPENDS
.${LIBC_TARGET_OS}.cnd_broadcast
)

View File

@ -0,0 +1,20 @@
//===-- Implementation header for cnd_broadcast function --------*- 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_THREADS_CND_BROADCAST_H
#define LLVM_LIBC_SRC_THREADS_CND_BROADCAST_H
#include "include/threads.h"
namespace __llvm_libc {
int cnd_broadcast(cnd_t *cond);
} // namespace __llvm_libc
#endif // LLVM_LIBC_SRC_THREADS_CND_BROADCAST_H

View File

@ -0,0 +1,20 @@
//===-- Implementation header for cnd_destroy function ----------*- 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_THREADS_CND_DESTROY_H
#define LLVM_LIBC_SRC_THREADS_CND_DESTROY_H
#include "include/threads.h"
namespace __llvm_libc {
void cnd_destroy(cnd_t *cond);
} // namespace __llvm_libc
#endif // LLVM_LIBC_SRC_THREADS_CND_DESTROY_H

View File

@ -0,0 +1,20 @@
//===-- Implementation header for cnd_init function -------------*- 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_THREADS_CND_INIT_H
#define LLVM_LIBC_SRC_THREADS_CND_INIT_H
#include "include/threads.h"
namespace __llvm_libc {
int cnd_init(cnd_t *cond);
} // namespace __llvm_libc
#endif // LLVM_LIBC_SRC_THREADS_CND_INIT_H

View File

@ -0,0 +1,20 @@
//===-- Implementation header for cnd_signal function -----------*- 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_THREADS_CND_SIGNAL_H
#define LLVM_LIBC_SRC_THREADS_CND_SIGNAL_H
#include "include/threads.h"
namespace __llvm_libc {
int cnd_signal(cnd_t *cond);
} // namespace __llvm_libc
#endif // LLVM_LIBC_SRC_THREADS_CND_SIGNAL_H

View File

@ -0,0 +1,20 @@
//===-- Implementation header for cnd_wait function -------------*- 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_THREADS_CND_WAIT_H
#define LLVM_LIBC_SRC_THREADS_CND_WAIT_H
#include "include/threads.h"
namespace __llvm_libc {
int cnd_wait(cnd_t *cond, mtx_t *mutex);
} // namespace __llvm_libc
#endif // LLVM_LIBC_SRC_THREADS_CND_WAIT_H

View File

@ -113,3 +113,58 @@ add_entrypoint_object(
.threads_utils
libc.include.threads
)
add_entrypoint_object(
cnd_init
SRCS
cnd_init.cpp
HDRS
../cnd_init.h
DEPENDS
.threads_utils
libc.include.threads
)
add_entrypoint_object(
cnd_destroy
SRCS
cnd_destroy.cpp
HDRS
../cnd_destroy.h
DEPENDS
.threads_utils
libc.include.threads
)
add_entrypoint_object(
cnd_wait
SRCS
cnd_wait.cpp
HDRS
../cnd_wait.h
DEPENDS
.threads_utils
libc.include.threads
)
add_entrypoint_object(
cnd_signal
SRCS
cnd_signal.cpp
HDRS
../cnd_signal.h
DEPENDS
.threads_utils
libc.include.threads
)
add_entrypoint_object(
cnd_broadcast
SRCS
cnd_broadcast.cpp
HDRS
../cnd_broadcast.h
DEPENDS
.threads_utils
libc.include.threads
)

View File

@ -0,0 +1,16 @@
//===-- Linux implementation of the cnd_broadcast function ----------------===//
//
// 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/threads/cnd_broadcast.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(int, cnd_broadcast, (cnd_t * cond)) { return thrd_success; }
} // namespace __llvm_libc

View File

@ -0,0 +1,16 @@
//===-- Linux implementation of the cnd_destroy function ------------------===//
//
// 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/threads/cnd_destroy.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(void, cnd_destroy, (cnd_t * cond)) { }
} // namespace __llvm_libc

View File

@ -0,0 +1,16 @@
//===-- Linux implementation of the cnd_init function ---------------------===//
//
// 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/threads/cnd_init.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(int, cnd_init, (cnd_t * cond)) { return thrd_success; }
} // namespace __llvm_libc

View File

@ -0,0 +1,16 @@
//===-- Linux implementation of the cnd_signal function -------------------===//
//
// 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/threads/cnd_signal.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(int, cnd_signal, (cnd_t * cond)) { return thrd_success; }
} // namespace __llvm_libc

View File

@ -0,0 +1,18 @@
//===-- Linux implementation of the cnd_wait function ---------------------===//
//
// 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/threads/cnd_wait.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(int, cnd_wait, (cnd_t * cond, mtx_t *mutex)) {
return thrd_success;
}
} // namespace __llvm_libc