diff --git a/compiler-rt/lib/builtins/CMakeLists.txt b/compiler-rt/lib/builtins/CMakeLists.txt index 0d52b582a8f26..e128fea6a3415 100644 --- a/compiler-rt/lib/builtins/CMakeLists.txt +++ b/compiler-rt/lib/builtins/CMakeLists.txt @@ -243,6 +243,30 @@ set(GENERIC_TF_SOURCES trunctfsf2.c ) +option(COMPILER_RT_USE_LIBC_MATH + "Use LLVM libc math routines for floating-point builtins" OFF) + +# Swap the legacy soft-float .c builtin in for the libc-backed +# .cpp implementation (which delegates to LIBC_NAMESPACE::shared::*). +macro(use_libc_builtin list_var name) + list(REMOVE_ITEM ${list_var} ${name}.c) + list(APPEND ${list_var} ${name}.cpp) +endmacro() + +if(COMPILER_RT_USE_LIBC_MATH) + include(FindLibcCommonUtils) + if(NOT TARGET llvm-libc-common-utilities) + message(FATAL_ERROR "LLVM libc is not found at ${libc_path}.") + endif() + + get_target_property(_libc_include_dirs llvm-libc-common-utilities + INTERFACE_INCLUDE_DIRECTORIES) + include_directories(SYSTEM ${_libc_include_dirs}) + add_definitions(-DCOMPILER_RT_USE_LIBC_MATH) + + use_libc_builtin(GENERIC_TF_SOURCES addtf3) +endif() + option(COMPILER_RT_EXCLUDE_ATOMIC_BUILTIN "Skip the atomic builtin (these should normally be provided by a shared library)" On) diff --git a/compiler-rt/lib/builtins/addtf3.cpp b/compiler-rt/lib/builtins/addtf3.cpp new file mode 100644 index 0000000000000..ae4dbd5772cfb --- /dev/null +++ b/compiler-rt/lib/builtins/addtf3.cpp @@ -0,0 +1,22 @@ +//===-- lib/addtf3.cpp - Quad-precision addition (libc-backed) --*- 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 +// +//===----------------------------------------------------------------------===// +// +// __addtf3 implemented on top of LLVM-libc's shared::addtf3 instruction. +// +//===----------------------------------------------------------------------===// + +#define QUAD_PRECISION +#include "fp_lib.h" + +#include "fp_libc_config.h" +#include "int_lib.h" +#include "shared/builtins/addtf3.h" + +extern "C" COMPILER_RT_ABI fp_t __addtf3(fp_t a, fp_t b) { + return LIBC_NAMESPACE::shared::addtf3(a, b); +} diff --git a/compiler-rt/lib/builtins/fp_libc_config.h b/compiler-rt/lib/builtins/fp_libc_config.h new file mode 100644 index 0000000000000..8264de2492d67 --- /dev/null +++ b/compiler-rt/lib/builtins/fp_libc_config.h @@ -0,0 +1,26 @@ +//===-- lib/fp_libc_config.h - LLVM-libc compile config --------*- 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 +// +//===----------------------------------------------------------------------===// +// +// Compile-time configuration consumed by LLVM-libc's fputil headers when they +// are included from compiler-rt builtins under COMPILER_RT_USE_LIBC_MATH. +// Pins the libc namespace to __llvm_libc_rt to avoid clashing with libc's own +// symbols, and disables errno / FP-exception bookkeeping inside libc routines +// called from builtins. +// +//===----------------------------------------------------------------------===// + +#ifndef FP_LIBC_CONFIG_H +#define FP_LIBC_CONFIG_H + +#ifndef LIBC_NAMESPACE +#define LIBC_NAMESPACE __llvm_libc_rt +#endif + +#define LIBC_MATH (LIBC_MATH_NO_ERRNO | LIBC_MATH_NO_EXCEPT) + +#endif // FP_LIBC_CONFIG_H