diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index 48b7ca45157a6..12a108134a531 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -1082,6 +1082,7 @@ if(LLVM_LIBC_FULL_BUILD) libc.src.stdlib.getenv libc.src.stdlib.ignore_handler_s libc.src.stdlib.quick_exit + libc.src.stdlib.set_constraint_handler_s # signal.h entrypoints libc.src.signal.kill diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt index 0d3ff77d29b74..985d7fed577e9 100644 --- a/libc/config/linux/riscv/entrypoints.txt +++ b/libc/config/linux/riscv/entrypoints.txt @@ -1209,6 +1209,7 @@ if(LLVM_LIBC_FULL_BUILD) libc.src.stdlib.getenv libc.src.stdlib.ignore_handler_s libc.src.stdlib.quick_exit + libc.src.stdlib.set_constraint_handler_s # signal.h entrypoints libc.src.signal.kill diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index dd94ffb30fa9a..f02f4ab80d952 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -1248,6 +1248,7 @@ if(LLVM_LIBC_FULL_BUILD) libc.src.stdlib.getenv libc.src.stdlib.ignore_handler_s libc.src.stdlib.quick_exit + libc.src.stdlib.set_constraint_handler_s # signal.h entrypoints libc.src.signal.kill diff --git a/libc/include/stdlib.yaml b/libc/include/stdlib.yaml index 7c3b113a62415..49d45f105fe7a 100644 --- a/libc/include/stdlib.yaml +++ b/libc/include/stdlib.yaml @@ -202,6 +202,13 @@ functions: - type: void *__restrict - type: errno_t guard: 'LIBC_HAS_ANNEX_K' + - name: set_constraint_handler_s + standards: + - stdc + return_type: constraint_handler_t + arguments: + - type: constraint_handler_t + guard: 'LIBC_HAS_ANNEX_K' - name: srand standards: - stdc diff --git a/libc/src/__support/annex_k/CMakeLists.txt b/libc/src/__support/annex_k/CMakeLists.txt index 4ef4e32ebdd85..f9c067753b6e6 100644 --- a/libc/src/__support/annex_k/CMakeLists.txt +++ b/libc/src/__support/annex_k/CMakeLists.txt @@ -28,3 +28,11 @@ add_header_library( .abort_handler_s libc.hdr.types.constraint_handler_t ) + +add_header_library( + set_constraint_handler_s + HDRS + set_constraint_handler_s.h + DEPENDS + +) diff --git a/libc/src/stdlib/CMakeLists.txt b/libc/src/stdlib/CMakeLists.txt index 5efd7f13ff3ee..c380657300cfe 100644 --- a/libc/src/stdlib/CMakeLists.txt +++ b/libc/src/stdlib/CMakeLists.txt @@ -664,6 +664,17 @@ add_entrypoint_object( .${LIBC_TARGET_OS}.system ) +add_entrypoint_object( + set_constraint_handler_s + SRCS + set_constraint_handler_s.cpp + HDRS + set_constraint_handler_s.h + DEPENDS + libc.src.__support.annex_k.abort_handler_s + libc.src.__support.annex_k.libc_constraint_handler +) + add_entrypoint_object( ignore_handler_s HDRS diff --git a/libc/src/stdlib/set_constraint_handler_s.cpp b/libc/src/stdlib/set_constraint_handler_s.cpp new file mode 100644 index 0000000000000..d3a16d77e3b0a --- /dev/null +++ b/libc/src/stdlib/set_constraint_handler_s.cpp @@ -0,0 +1,28 @@ +//===-- Implementation of set_constraint_handler_s ------------------------===// +// +// 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 "set_constraint_handler_s.h" +#include "src/__support/annex_k/abort_handler_s.h" +#include "src/__support/annex_k/libc_constraint_handler.h" + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(constraint_handler_t, set_constraint_handler_s, + (constraint_handler_t handler)) { + auto previous_handler = annex_k::libc_constraint_handler; + + if (!handler) { + annex_k::libc_constraint_handler = &annex_k::abort_handler_s; + } else { + annex_k::libc_constraint_handler = handler; + } + + return previous_handler; +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/stdlib/set_constraint_handler_s.h b/libc/src/stdlib/set_constraint_handler_s.h new file mode 100644 index 0000000000000..f5c6e01712ef0 --- /dev/null +++ b/libc/src/stdlib/set_constraint_handler_s.h @@ -0,0 +1,21 @@ +//===-- Implementation header for set_constraint_handler_s ------*- 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_STDLIB_SET_CONSTRAINT_HANDLER_S_H +#define LLVM_LIBC_SRC_STDLIB_SET_CONSTRAINT_HANDLER_S_H + +#include "hdr/types/constraint_handler_t.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +constraint_handler_t set_constraint_handler_s(constraint_handler_t handler); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_STDLIB_SET_CONSTRAINT_HANDLER_S_H