llvm/utils/bazel/llvm-project-overlay/libc/BUILD.bazel

# This file is licensed 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

# LLVM libc project.
load("@bazel_skylib//lib:selects.bzl", "selects")
load("@bazel_skylib//rules:common_settings.bzl", "string_flag")
load(
    ":libc_build_rules.bzl",
    "libc_function",
    "libc_math_function",
    "libc_support_library",
)
load(":platforms.bzl", "PLATFORM_CPU_ARM64", "PLATFORM_CPU_X86_64")

package(
    default_visibility = ["//visibility:public"],
    features = [
        "-use_header_modules",
        "-layering_check",
    ],
)

licenses(["notice"])

# A flag to pick which `mpfr` to use for math tests.
# Usage: `--@llvm-project//libc:mpfr=<disable|external|system>`.
# Flag documentation: https://bazel.build/extending/config
string_flag(
    name = "mpfr",
    build_setting_default = "external",
    values = [
        "disable",  # Skip tests that need mpfr
        "external",  # Build mpfr from source
        "system",  # Use system mpfr (non hermetic)
    ],
)

config_setting(
    name = "mpfr_disable",
    flag_values = {":mpfr": "disable"},
)

config_setting(
    name = "mpfr_external",
    flag_values = {":mpfr": "external"},
)

config_setting(
    name = "mpfr_system",
    flag_values = {":mpfr": "system"},
)

################################## Base Config #################################

cc_library(
    name = "__support_macros_config",
    hdrs = ["src/__support/macros/config.h"],
)

################################# Include Files ################################

libc_support_library(
    name = "llvm_libc_macros_math_macros",
    hdrs = ["include/llvm-libc-macros/math-macros.h"],
    deps = [":llvm_libc_macros_limits_macros"],
)

libc_support_library(
    name = "llvm_libc_macros_limits_macros",
    hdrs = ["include/llvm-libc-macros/limits-macros.h"],
)

libc_support_library(
    name = "llvm_libc_macros_float_macros",
    hdrs = ["include/llvm-libc-macros/float-macros.h"],
)

libc_support_library(
    name = "llvm_libc_macros_float16_macros",
    hdrs = ["include/llvm-libc-macros/float16-macros.h"],
    deps = [":llvm_libc_types_float128"],
)

libc_support_library(
    name = "llvm_libc_macros_stdint_macros",
    hdrs = ["include/llvm-libc-macros/stdint-macros.h"],
)

libc_support_library(
    name = "llvm_libc_macros_stdfix_macros",
    hdrs = ["include/llvm-libc-macros/stdfix-macros.h"],
    deps = [":llvm_libc_macros_float_macros"],
)

libc_support_library(
    name = "llvm_libc_types_float128",
    hdrs = ["include/llvm-libc-types/float128.h"],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    deps = [":llvm_libc_macros_float_macros"],
)

libc_support_library(
    name = "llvm_libc_macros_fcntl_macros",
    hdrs = ["include/llvm-libc-macros/linux/fcntl-macros.h"],
)

########################### Macro Proxy Header Files ###########################

libc_support_library(
    name = "hdr_math_macros",
    hdrs = ["hdr/math_macros.h"],
)

libc_support_library(
    name = "hdr_fenv_macros",
    hdrs = ["hdr/fenv_macros.h"],
)

libc_support_library(
    name = "hdr_signal_macros",
    hdrs = ["hdr/signal_macros.h"],
)

libc_support_library(
    name = "hdr_sys_epoll_macros",
    hdrs = ["hdr/sys_epoll_macros.h"],
)

libc_support_library(
    name = "hdr_errno_macros",
    hdrs = ["hdr/errno_macros.h"],
)

libc_support_library(
    name = "hdr_time_macros",
    hdrs = ["hdr/time_macros.h"],
)

libc_support_library(
    name = "hdr_float_macros",
    hdrs = ["hdr/float_macros.h"],
)

libc_support_library(
    name = "hdr_stdio_macros",
    hdrs = ["hdr/stdio_macros.h"],
    deps = [
        ":hdr_stdio_overlay",
    ],
)

libc_support_library(
    name = "hdr_limits_macros",
    hdrs = ["hdr/limits_macros.h"],
)

libc_support_library(
    name = "hdr_stdio_overlay",
    hdrs = ["hdr/stdio_overlay.h"],
)

############################ Type Proxy Header Files ###########################

libc_support_library(
    name = "types_clockid_t",
    hdrs = ["hdr/types/clockid_t.h"],
)

libc_support_library(
    name = "types_clock_t",
    hdrs = ["hdr/types/clock_t.h"],
)

libc_support_library(
    name = "types_fenv_t",
    hdrs = ["hdr/types/fenv_t.h"],
)

libc_support_library(
    name = "types_fexcept_t",
    hdrs = ["hdr/types/fexcept_t.h"],
)

libc_support_library(
    name = "types_sigset_t",
    hdrs = ["hdr/types/sigset_t.h"],
)

libc_support_library(
    name = "types_struct_epoll_event",
    hdrs = ["hdr/types/struct_epoll_event.h"],
)

libc_support_library(
    name = "types_struct_timespec",
    hdrs = ["hdr/types/struct_timespec.h"],
)

libc_support_library(
    name = "types_time_t",
    hdrs = ["hdr/types/time_t.h"],
)

libc_support_library(
    name = "types_struct_timeval",
    hdrs = ["hdr/types/struct_timeval.h"],
)

libc_support_library(
    name = "types_pid_t",
    hdrs = ["hdr/types/pid_t.h"],
)

libc_support_library(
    name = "types_off_t",
    hdrs = ["hdr/types/off_t.h"],
    deps = [
        ":hdr_stdio_overlay",
    ],
)

libc_support_library(
    name = "types_FILE",
    hdrs = ["hdr/types/FILE.h"],
    deps = [
        ":hdr_stdio_overlay",
    ],
)

libc_support_library(
    name = "types_ssize_t",
    hdrs = ["hdr/types/ssize_t.h"],
)

libc_support_library(
    name = "types_socklen_t",
    hdrs = ["hdr/types/socklen_t.h"],
)

libc_support_library(
    name = "types_struct_sockaddr",
    hdrs = ["hdr/types/struct_sockaddr.h"],
)

libc_support_library(
    name = "types_struct_msghdr",
    hdrs = ["hdr/types/struct_msghdr.h"],
)

############################### Support libraries ##############################

libc_support_library(
    name = "__support_macros_properties_architectures",
    hdrs = ["src/__support/macros/properties/architectures.h"],
)

libc_support_library(
    name = "__support_macros_properties_compiler",
    hdrs = ["src/__support/macros/properties/compiler.h"],
)

libc_support_library(
    name = "__support_macros_properties_os",
    hdrs = ["src/__support/macros/properties/os.h"],
)

libc_support_library(
    name = "__support_macros_properties_types",
    hdrs = ["src/__support/macros/properties/types.h"],
    deps = [
        ":__support_macros_properties_architectures",
        ":__support_macros_properties_compiler",
        ":__support_macros_properties_cpu_features",
        ":__support_macros_properties_os",
        ":hdr_float_macros",
        ":llvm_libc_macros_float16_macros",
        ":llvm_libc_types_float128",
    ],
)

libc_support_library(
    name = "__support_macros_properties_cpu_features",
    hdrs = ["src/__support/macros/properties/cpu_features.h"],
    deps = [
        "__support_macros_properties_architectures",
    ],
)

libc_support_library(
    name = "__support_macros_attributes",
    hdrs = ["src/__support/macros/attributes.h"],
    deps = [
        ":__support_macros_properties_architectures",
    ],
)

libc_support_library(
    name = "__support_macros_optimization",
    hdrs = ["src/__support/macros/optimization.h"],
    deps = [
        ":__support_macros_attributes",
        ":__support_macros_config",
        ":__support_macros_properties_compiler",
    ],
)

libc_support_library(
    name = "__support_macros_sanitizer",
    hdrs = ["src/__support/macros/sanitizer.h"],
    deps = [
        ":__support_macros_config",
    ],
)

libc_support_library(
    name = "__support_macros_null_check",
    hdrs = ["src/__support/macros/null_check.h"],
    deps = [
        ":__support_macros_config",
        ":__support_macros_optimization",
        ":__support_macros_sanitizer",
    ],
)

libc_support_library(
    name = "__support_common",
    hdrs = [
        "src/__support/common.h",
        "src/__support/endian.h",
    ],
    deps = [
        ":__support_macros_attributes",
        ":__support_macros_config",
        ":__support_macros_properties_architectures",
    ],
)

libc_support_library(
    name = "__support_cpp_algorithm",
    hdrs = ["src/__support/CPP/algorithm.h"],
    deps = [
        ":__support_macros_attributes",
        ":__support_macros_config",
    ],
)

libc_support_library(
    name = "__support_cpp_iterator",
    hdrs = ["src/__support/CPP/iterator.h"],
    deps = [
        ":__support_cpp_type_traits",
        ":__support_macros_attributes",
    ],
)

libc_support_library(
    name = "__support_cpp_array",
    hdrs = ["src/__support/CPP/array.h"],
    deps = [
        ":__support_cpp_iterator",
        ":__support_macros_attributes",
    ],
)

libc_support_library(
    name = "__support_cpp_bit",
    hdrs = ["src/__support/CPP/bit.h"],
    deps = [
        ":__support_cpp_limits",
        ":__support_cpp_type_traits",
        ":__support_macros_attributes",
        ":__support_macros_sanitizer",
    ],
)

libc_support_library(
    name = "__support_cpp_bitset",
    hdrs = ["src/__support/CPP/bitset.h"],
    deps = [
        ":__support_macros_attributes",
        ":__support_macros_config",
    ],
)

libc_support_library(
    name = "__support_cpp_cstddef",
    hdrs = ["src/__support/CPP/cstddef.h"],
    deps = [
        ":__support_cpp_type_traits",
        ":__support_macros_attributes",
    ],
)

libc_support_library(
    name = "__support_cpp_expected",
    hdrs = ["src/__support/CPP/expected.h"],
    deps = [
        ":__support_macros_attributes",
        ":__support_macros_config",
    ],
)

libc_support_library(
    name = "__support_cpp_functional",
    hdrs = ["src/__support/CPP/functional.h"],
    deps = [
        "__support_cpp_type_traits",
        "__support_cpp_utility",
        "__support_macros_attributes",
    ],
)

libc_support_library(
    name = "__support_cpp_limits",
    hdrs = ["src/__support/CPP/limits.h"],
    deps = [
        "__support_cpp_type_traits",
        "__support_macros_attributes",
        ":__support_macros_properties_types",
        ":hdr_limits_macros",
    ],
)

libc_support_library(
    name = "__support_cpp_new",
    srcs = ["src/__support/CPP/new.cpp"],
    hdrs = ["src/__support/CPP/new.h"],
    deps = [
        ":__support_common",
        ":__support_macros_properties_os",
    ],
)

libc_support_library(
    name = "__support_cpp_optional",
    hdrs = ["src/__support/CPP/optional.h"],
    deps = [
        ":__support_cpp_utility",
    ],
)

libc_support_library(
    name = "__support_cpp_span",
    hdrs = ["src/__support/CPP/span.h"],
    deps = [
        ":__support_cpp_array",
        ":__support_cpp_type_traits",
    ],
)

libc_support_library(
    name = "__support_cpp_string_view",
    hdrs = ["src/__support/CPP/string_view.h"],
    deps = [
        ":__support_common",
    ],
)

libc_support_library(
    name = "__support_cpp_stringstream",
    hdrs = ["src/__support/CPP/stringstream.h"],
    deps = [
        ":__support_cpp_span",
        ":__support_cpp_string_view",
        ":__support_cpp_type_traits",
        ":__support_integer_to_string",
    ],
)

libc_support_library(
    name = "__support_cpp_string",
    hdrs = ["src/__support/CPP/string.h"],
    deps = [
        ":__support_common",
        ":__support_cpp_string_view",
        ":__support_integer_to_string",
        ":string_memory_utils",
        ":string_utils",
    ],
)

libc_support_library(
    name = "__support_cpp_type_traits",
    hdrs = glob(["src/__support/CPP/type_traits/*.h"]) + [
        "src/__support/CPP/type_traits.h",
        "src/__support/CPP/utility/declval.h",
        "src/__support/CPP/utility/forward.h",
    ],
    deps = [
        ":__support_macros_attributes",
        ":__support_macros_config",
        ":__support_macros_properties_types",
        ":llvm_libc_macros_stdfix_macros",
    ],
)

libc_support_library(
    name = "__support_cpp_utility",
    hdrs = glob(["src/__support/CPP/utility/*.h"]) + [
        "src/__support/CPP/utility.h",
    ],
    deps = [
        ":__support_cpp_type_traits",
        ":__support_macros_attributes",
    ],
)

libc_support_library(
    name = "__support_cpp_atomic",
    hdrs = ["src/__support/CPP/atomic.h"],
    deps = [
        ":__support_cpp_type_traits",
        ":__support_macros_attributes",
        ":__support_macros_properties_architectures",
    ],
)

libc_support_library(
    name = "__support_blockstore",
    hdrs = ["src/__support/blockstore.h"],
    deps = [
        ":__support_cpp_new",
        ":__support_libc_assert",
    ],
)

libc_support_library(
    name = "__support_arg_list",
    hdrs = ["src/__support/arg_list.h"],
    deps = [
        ":__support_common",
    ],
)

libc_support_library(
    name = "__support_c_string",
    hdrs = ["src/__support/c_string.h"],
    deps = [
        ":__support_cpp_string",
    ],
)

libc_support_library(
    name = "__support_fixedvector",
    hdrs = ["src/__support/fixedvector.h"],
    deps = [
        ":__support_cpp_array",
        ":__support_cpp_iterator",
    ],
)

libc_support_library(
    name = "__support_char_vector",
    hdrs = ["src/__support/char_vector.h"],
    deps = [
        ":__support_common",
    ],
)

libc_support_library(
    name = "__support_error_or",
    hdrs = ["src/__support/error_or.h"],
    deps = [
        ":__support_common",
        ":__support_cpp_expected",
    ],
)

libc_support_library(
    name = "__support_float_to_string",
    hdrs = [
        "src/__support/float_to_string.h",
        "src/__support/ryu_constants.h",
        "src/__support/ryu_long_double_constants.h",
    ],
    deps = [
        ":__support_big_int",
        ":__support_common",
        ":__support_cpp_type_traits",
        ":__support_fputil_dyadic_float",
        ":__support_fputil_fp_bits",
        ":__support_libc_assert",
    ],
)

libc_support_library(
    name = "__support_number_pair",
    hdrs = ["src/__support/number_pair.h"],
    deps = [
        ":__support_cpp_type_traits",
    ],
)

libc_support_library(
    name = "__support_big_int",
    hdrs = ["src/__support/big_int.h"],
    deps = [
        ":__support_cpp_array",
        ":__support_cpp_bit",
        ":__support_cpp_limits",
        ":__support_cpp_optional",
        ":__support_cpp_type_traits",
        ":__support_macros_attributes",
        ":__support_macros_optimization",
        ":__support_macros_properties_types",
        ":__support_math_extras",
        ":__support_number_pair",
    ],
)

libc_support_library(
    name = "__support_sign",
    hdrs = ["src/__support/sign.h"],
    deps = [
        ":__support_macros_attributes",
    ],
)

libc_support_library(
    name = "__support_uint128",
    hdrs = ["src/__support/uint128.h"],
    deps = [
        ":__support_big_int",
        ":__support_macros_attributes",
        ":__support_macros_properties_types",
    ],
)

libc_support_library(
    name = "__support_integer_literals",
    hdrs = ["src/__support/integer_literals.h"],
    deps = [
        ":__support_cpp_limits",
        ":__support_uint128",
    ],
)

libc_support_library(
    name = "__support_str_to_num_result",
    hdrs = ["src/__support/str_to_num_result.h"],
    deps = [
        ":__support_macros_attributes",
        ":__support_macros_config",
    ],
)

libc_support_library(
    name = "__support_integer_operations",
    hdrs = ["src/__support/integer_operations.h"],
    deps = [":__support_cpp_type_traits"],
)

libc_support_library(
    name = "__support_integer_to_string",
    hdrs = ["src/__support/integer_to_string.h"],
    deps = [
        ":__support_big_int",
        ":__support_common",
        ":__support_cpp_algorithm",
        ":__support_cpp_bit",
        ":__support_cpp_limits",
        ":__support_cpp_optional",
        ":__support_cpp_span",
        ":__support_cpp_string_view",
        ":__support_cpp_type_traits",
    ],
)

libc_support_library(
    name = "__support_libc_assert",
    hdrs = ["src/__support/libc_assert.h"],
    deps = [
        ":__support_integer_to_string",
        ":__support_macros_attributes",
        ":__support_osutil_exit",
        ":__support_osutil_io",
    ],
)

libc_support_library(
    name = "__support_ctype_utils",
    hdrs = ["src/__support/ctype_utils.h"],
    deps = [
        ":__support_macros_attributes",
        ":__support_macros_config",
    ],
)

libc_support_library(
    name = "__support_str_to_integer",
    hdrs = ["src/__support/str_to_integer.h"],
    deps = [
        ":__support_common",
        ":__support_cpp_limits",
        ":__support_cpp_type_traits",
        ":__support_ctype_utils",
        ":__support_str_to_num_result",
        ":__support_uint128",
        ":errno",
    ],
)

libc_support_library(
    name = "__support_str_to_float",
    hdrs = [
        "src/__support/detailed_powers_of_ten.h",
        "src/__support/high_precision_decimal.h",
        "src/__support/str_to_float.h",
    ],
    deps = [
        ":__support_common",
        ":__support_cpp_bit",
        ":__support_cpp_limits",
        ":__support_cpp_optional",
        ":__support_cpp_string_view",
        ":__support_ctype_utils",
        ":__support_fputil_fp_bits",
        ":__support_fputil_rounding_mode",
        ":__support_macros_null_check",
        ":__support_str_to_integer",
        ":__support_str_to_num_result",
        ":__support_uint128",
        ":errno",
    ],
)

libc_support_library(
    name = "__support_fputil_basic_operations",
    hdrs = [
        "src/__support/FPUtil/BasicOperations.h",
        "src/__support/FPUtil/generic/add_sub.h",
        "src/__support/FPUtil/generic/div.h",
        "src/__support/FPUtil/generic/mul.h",
    ],
    deps = [
        ":__support_common",
        ":__support_cpp_type_traits",
        ":__support_fputil_cast",
        ":__support_fputil_dyadic_float",
        ":__support_fputil_fenv_impl",
        ":__support_fputil_fp_bits",
        ":__support_fputil_rounding_mode",
        ":__support_macros_optimization",
        ":__support_uint128",
    ],
)

libc_support_library(
    name = "__support_file_file",
    srcs = [
        "include/llvm-libc-types/off_t.h",
        "src/__support/File/file.cpp",
    ],
    hdrs = ["src/__support/File/file.h"],
    deps = [
        ":__support_cpp_new",
        ":__support_cpp_span",
        ":__support_error_or",
        ":__support_threads_mutex",
        ":errno",
        ":hdr_stdio_macros",
        ":hdr_stdio_overlay",
        ":types_off_t",
    ],
)

libc_support_library(
    name = "__support_file_linux_lseekimpl",
    hdrs = ["src/__support/File/linux/lseekImpl.h"],
    deps = [
        ":__support_common",
        ":__support_error_or",
        ":__support_osutil_syscall",
        ":errno",
        ":hdr_stdio_overlay",
        ":types_off_t",
    ],
)

libc_support_library(
    name = "__support_math_extras",
    hdrs = ["src/__support/math_extras.h"],
    deps = [
        ":__support_cpp_bit",
        ":__support_cpp_limits",
        ":__support_cpp_type_traits",
        ":__support_macros_attributes",
    ],
)

libc_support_library(
    name = "__support_fixed_point",
    hdrs = [
        "src/__support/fixed_point/fx_bits.h",
        "src/__support/fixed_point/fx_rep.h",
    ],
    deps = [
        ":__support_cpp_bit",
        ":__support_cpp_type_traits",
        ":__support_macros_attributes",
        ":__support_macros_optimization",
        ":__support_math_extras",
        ":llvm_libc_macros_stdfix_macros",
    ],
)

libc_support_library(
    name = "__support_fputil_generic_fmod",
    hdrs = ["src/__support/FPUtil/generic/FMod.h"],
    deps = [
        ":__support_common",
        ":__support_cpp_bit",
        ":__support_cpp_limits",
        ":__support_cpp_type_traits",
        ":__support_fputil_fenv_impl",
        ":__support_fputil_fp_bits",
    ],
)

libc_support_library(
    name = "__support_fputil_cast",
    hdrs = ["src/__support/FPUtil/cast.h"],
    deps = [
        ":__support_cpp_algorithm",
        ":__support_cpp_type_traits",
        ":__support_fputil_dyadic_float",
        ":__support_fputil_fp_bits",
        ":__support_macros_properties_types",
        ":hdr_fenv_macros",
    ],
)

libc_support_library(
    name = "__support_fputil_division_and_remainder_operations",
    hdrs = ["src/__support/FPUtil/DivisionAndRemainderOperations.h"],
    deps = [
        ":__support_common",
        ":__support_cpp_type_traits",
        ":__support_fputil_fp_bits",
        ":__support_fputil_manipulation_functions",
        ":__support_fputil_normal_float",
    ],
)

libc_support_library(
    name = "__support_fputil_except_value_utils",
    hdrs = ["src/__support/FPUtil/except_value_utils.h"],
    deps = [
        ":__support_cpp_optional",
        ":__support_fputil_cast",
        ":__support_fputil_fenv_impl",
        ":__support_fputil_fp_bits",
        ":__support_fputil_rounding_mode",
        ":__support_macros_properties_cpu_features",
        ":__support_macros_properties_types",
    ],
)

libc_support_library(
    name = "__support_fputil_fenv_impl",
    hdrs = ["src/__support/FPUtil/FEnvImpl.h"],
    textual_hdrs = [
        "src/__support/FPUtil/x86_64/FEnvImpl.h",
        "src/__support/FPUtil/aarch64/FEnvImpl.h",
        "src/__support/FPUtil/aarch64/fenv_darwin_impl.h",
    ],
    deps = [
        ":__support_fputil_fp_bits",
        ":__support_macros_attributes",
        ":__support_macros_properties_architectures",
        ":__support_macros_sanitizer",
        ":errno",
        ":hdr_fenv_macros",
        ":hdr_math_macros",
        ":types_fenv_t",
    ],
)

libc_support_library(
    name = "__support_fputil_rounding_mode",
    hdrs = ["src/__support/FPUtil/rounding_mode.h"],
    deps = [
        ":__support_macros_attributes",
        ":__support_macros_config",
        ":hdr_fenv_macros",
    ],
)

libc_support_library(
    name = "__support_fputil_fp_bits",
    hdrs = ["src/__support/FPUtil/FPBits.h"],
    deps = [
        ":__support_common",
        ":__support_cpp_bit",
        ":__support_cpp_type_traits",
        ":__support_libc_assert",
        ":__support_macros_attributes",
        ":__support_macros_properties_types",
        ":__support_math_extras",
        ":__support_sign",
        ":__support_uint128",
    ],
)

libc_support_library(
    name = "__support_fputil_fpbits_str",
    hdrs = ["src/__support/FPUtil/fpbits_str.h"],
    deps = [
        ":__support_common",
        ":__support_cpp_string",
        ":__support_cpp_type_traits",
        ":__support_fputil_fp_bits",
        ":__support_integer_to_string",
        ":__support_uint128",
    ],
)

libc_support_library(
    name = "__support_fputil_hypot",
    hdrs = ["src/__support/FPUtil/Hypot.h"],
    deps = [
        ":__support_common",
        ":__support_cpp_bit",
        ":__support_cpp_type_traits",
        ":__support_fputil_basic_operations",
        ":__support_fputil_fenv_impl",
        ":__support_fputil_fp_bits",
        ":__support_fputil_rounding_mode",
        ":__support_uint128",
    ],
)

libc_support_library(
    name = "__support_fputil_manipulation_functions",
    hdrs = ["src/__support/FPUtil/ManipulationFunctions.h"],
    textual_hdrs = [
        "src/__support/FPUtil/x86_64/NextAfterLongDouble.h",
        "src/__support/FPUtil/x86_64/NextUpDownLongDouble.h",
    ],
    deps = [
        ":__support_common",
        ":__support_cpp_bit",
        ":__support_cpp_limits",
        ":__support_cpp_type_traits",
        ":__support_fputil_cast",
        ":__support_fputil_dyadic_float",
        ":__support_fputil_fp_bits",
        ":__support_fputil_nearest_integer_operations",
        ":__support_fputil_normal_float",
        ":__support_macros_optimization",
        ":__support_uint128",
        ":hdr_math_macros",
    ],
)

libc_support_library(
    name = "__support_fputil_nearest_integer_operations",
    hdrs = ["src/__support/FPUtil/NearestIntegerOperations.h"],
    deps = [
        ":__support_common",
        ":__support_cpp_type_traits",
        ":__support_fputil_fenv_impl",
        ":__support_fputil_fp_bits",
        ":__support_fputil_rounding_mode",
        ":__support_macros_attributes",
        ":hdr_math_macros",
    ],
)

libc_support_library(
    name = "__support_fputil_normal_float",
    hdrs = ["src/__support/FPUtil/NormalFloat.h"],
    deps = [
        ":__support_common",
        ":__support_cpp_type_traits",
        ":__support_fputil_fp_bits",
    ],
)

sqrt_common_hdrs = [
    "src/__support/FPUtil/sqrt.h",
    "src/__support/FPUtil/generic/sqrt.h",
    "src/__support/FPUtil/generic/sqrt_80_bit_long_double.h",
]

sqrt_hdrs = selects.with_or({
    "//conditions:default": sqrt_common_hdrs,
    PLATFORM_CPU_X86_64: sqrt_common_hdrs + [
        "src/__support/FPUtil/x86_64/sqrt.h",
    ],
    PLATFORM_CPU_ARM64: sqrt_common_hdrs + [
        "src/__support/FPUtil/aarch64/sqrt.h",
    ],
})

libc_support_library(
    name = "__support_fputil_sqrt",
    hdrs = sqrt_hdrs,
    deps = [
        ":__support_common",
        ":__support_cpp_bit",
        ":__support_cpp_type_traits",
        ":__support_fputil_cast",
        ":__support_fputil_dyadic_float",
        ":__support_fputil_fenv_impl",
        ":__support_fputil_fp_bits",
        ":__support_fputil_rounding_mode",
        ":__support_uint128",
    ],
)

fma_common_hdrs = [
    "src/__support/FPUtil/FMA.h",
    "src/__support/FPUtil/generic/FMA.h",
]

libc_support_library(
    name = "__support_fputil_fma",
    hdrs = fma_common_hdrs,
    deps = [
        ":__support_cpp_bit",
        ":__support_cpp_type_traits",
        ":__support_fputil_basic_operations",
        ":__support_fputil_dyadic_float",
        ":__support_fputil_fenv_impl",
        ":__support_fputil_fp_bits",
        ":__support_fputil_rounding_mode",
        ":__support_macros_attributes",
        ":__support_macros_optimization",
        ":__support_macros_properties_cpu_features",
        ":__support_uint128",
    ],
)

libc_support_library(
    name = "__support_fputil_multiply_add",
    hdrs = [
        "src/__support/FPUtil/multiply_add.h",
    ],
    deps = [
        ":__support_common",
        ":__support_cpp_type_traits",
    ],
)

libc_support_library(
    name = "__support_fputil_polyeval",
    hdrs = [
        "src/__support/FPUtil/PolyEval.h",
    ],
    deps = [
        ":__support_common",
        ":__support_fputil_multiply_add",
    ],
)

nearest_integer_common_hdrs = [
    "src/__support/FPUtil/nearest_integer.h",
]

nearest_integer_platform_hdrs = [
    "src/__support/FPUtil/x86_64/nearest_integer.h",
    "src/__support/FPUtil/aarch64/nearest_integer.h",
]

libc_support_library(
    name = "__support_fputil_nearest_integer",
    hdrs = nearest_integer_common_hdrs,
    # These are conditionally included and will #error out if the platform
    # doesn't support rounding instructions, so they can't be compiled on their
    # own.
    textual_hdrs = nearest_integer_platform_hdrs,
    deps = [
        ":__support_common",
        ":__support_macros_optimization",
        ":__support_macros_properties_architectures",
        ":__support_macros_properties_cpu_features",
    ],
)

libc_support_library(
    name = "__support_fputil_double_double",
    hdrs = ["src/__support/FPUtil/double_double.h"],
    deps = [
        ":__support_common",
        ":__support_fputil_multiply_add",
        ":__support_number_pair",
    ],
)

libc_support_library(
    name = "__support_fputil_triple_double",
    hdrs = ["src/__support/FPUtil/triple_double.h"],
    deps = [
        ":__support_common",
    ],
)

libc_support_library(
    name = "__support_fputil_dyadic_float",
    hdrs = ["src/__support/FPUtil/dyadic_float.h"],
    deps = [
        ":__support_big_int",
        ":__support_common",
        ":__support_cpp_type_traits",
        ":__support_fputil_fenv_impl",
        ":__support_fputil_fp_bits",
        ":__support_fputil_multiply_add",
        ":__support_fputil_rounding_mode",
        ":__support_macros_optimization",
    ],
)

libc_support_library(
    name = "__support_osutil_syscall",
    hdrs = ["src/__support/OSUtil/syscall.h"],
    textual_hdrs = select({
        "@platforms//os:macos": [
            "src/__support/OSUtil/darwin/syscall.h",
            "src/__support/OSUtil/darwin/arm/syscall.h",
        ],
        "@platforms//os:linux": [
            "src/__support/OSUtil/linux/syscall.h",
            "src/__support/OSUtil/linux/aarch64/syscall.h",
            "src/__support/OSUtil/linux/x86_64/syscall.h",
        ],
    }),
    deps = [
        ":__support_common",
        ":__support_cpp_bit",
        ":__support_macros_sanitizer",
    ],
)

libc_support_library(
    name = "__support_osutil_vdso",
    hdrs = [
        "src/__support/OSUtil/linux/vdso.h",
        "src/__support/OSUtil/linux/vdso_sym.h",
    ],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    textual_hdrs = [
        "src/__support/OSUtil/linux/riscv/vdso.h",
        "src/__support/OSUtil/linux/arm/vdso.h",
        "src/__support/OSUtil/linux/x86_64/vdso.h",
        "src/__support/OSUtil/linux/aarch64/vdso.h",
    ],
    deps = [
        ":__support_cpp_array",
        ":__support_cpp_optional",
        ":__support_cpp_string_view",
        ":__support_threads_callonce",
        ":types_clock_t",
        ":types_clockid_t",
        ":types_struct_timeval",
    ],
)

libc_support_library(
    name = "__support_osutil_io",
    hdrs = ["src/__support/OSUtil/io.h"],
    textual_hdrs = select({
        "@platforms//os:macos": ["src/__support/OSUtil/darwin/io.h"],
        "@platforms//os:linux": ["src/__support/OSUtil/linux/io.h"],
    }),
    deps = [
        ":__support_common",
        ":__support_cpp_string_view",
        ":__support_osutil_syscall",
        ":string_utils",
    ],
)

libc_support_library(
    name = "__support_osutil_exit",
    srcs = ["src/__support/OSUtil/linux/exit.cpp"],
    hdrs = ["src/__support/OSUtil/exit.h"],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    deps = [
        ":__support_osutil_syscall",
    ],
)

libc_support_library(
    name = "__support_stringutil",
    srcs = glob(["src/__support/StringUtil/tables/**/*.h"]) + [
        "src/__support/StringUtil/error_to_string.cpp",
        "src/__support/StringUtil/message_mapper.h",
        "src/__support/StringUtil/platform_errors.h",
        "src/__support/StringUtil/platform_signals.h",
        "src/__support/StringUtil/signal_to_string.cpp",
    ],
    hdrs = [
        "src/__support/StringUtil/error_to_string.h",
        "src/__support/StringUtil/signal_to_string.h",
    ],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    deps = [
        ":__support_cpp_array",
        ":__support_cpp_span",
        ":__support_cpp_string_view",
        ":__support_cpp_stringstream",
        ":__support_integer_to_string",
        ":__support_macros_attributes",
        ":errno",
    ],
)

libc_support_library(
    name = "__support_threads_linux_futex_word_type",
    hdrs = [
        "src/__support/threads/linux/futex_word.h",
    ],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    deps = [
        ":__support_osutil_syscall",
    ],
)

libc_support_library(
    name = "__support_threads_linux_futex_utils",
    hdrs = [
        "src/__support/threads/linux/futex_utils.h",
    ],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    deps = [
        ":__support_cpp_atomic",
        ":__support_cpp_optional",
        ":__support_osutil_syscall",
        ":__support_threads_linux_futex_word_type",
        ":__support_time_linux_abs_timeout",
        ":types_struct_timespec",
    ],
)

libc_support_library(
    name = "__support_threads_sleep",
    hdrs = ["src/__support/threads/sleep.h"],
    deps = [
        ":__support_macros_attributes",
        ":__support_macros_config",
    ],
)

libc_support_library(
    name = "__support_threads_raw_mutex",
    hdrs = [
        "src/__support/threads/linux/raw_mutex.h",
    ],
    defines = [
        "LIBC_COPT_TIMEOUT_ENSURE_MONOTONICITY",
        "LIBC_COPT_RAW_MUTEX_DEFAULT_SPIN_COUNT",
    ],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    deps = [
        ":__support_cpp_expected",
        ":__support_cpp_optional",
        ":__support_threads_linux_futex_utils",
        ":__support_threads_sleep",
        ":__support_time_linux_abs_timeout",
        ":__support_time_linux_monotonicity",
        ":types_pid_t",
    ],
)

libc_support_library(
    name = "__support_threads_mutex",
    hdrs = [
        "src/__support/threads/mutex.h",
        "src/__support/threads/mutex_common.h",
    ],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    textual_hdrs = [
        "src/__support/threads/linux/mutex.h",
    ],
    deps = [
        ":__support_cpp_atomic",
        ":__support_osutil_syscall",
        ":__support_threads_linux_futex_utils",
        ":__support_threads_raw_mutex",
        ":types_pid_t",
    ],
)

libc_support_library(
    name = "__support_threads_callonce",
    hdrs = [
        "src/__support/threads/callonce.h",
    ],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    textual_hdrs = [
        "src/__support/threads/linux/callonce.h",
    ],
    deps = [
        ":__support_macros_config",
        ":__support_macros_optimization",
        ":__support_threads_linux_futex_utils",
    ],
)

libc_support_library(
    name = "__support_time",
    hdrs = glob(["src/__support/time/*.h"]),
    deps = [
        ":__support_common",
        ":hdr_time_macros",
        ":types_time_t",
    ],
)

libc_support_library(
    name = "__support_time_linux_abs_timeout",
    hdrs = ["src/__support/time/linux/abs_timeout.h"],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    deps = [
        ":__support_cpp_expected",
        ":__support_time",
        ":hdr_time_macros",
        ":types_struct_timespec",
    ],
)

libc_support_library(
    name = "__support_time_linux_clock_conversion",
    hdrs = ["src/__support/time/linux/clock_conversion.h"],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    deps = [
        ":__support_time",
        ":__support_time_linux_clock_gettime",
    ],
)

libc_support_library(
    name = "__support_time_linux_clock_gettime",
    hdrs = ["src/__support/time/linux/clock_gettime.h"],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    deps = [
        ":__support_common",
        ":__support_error_or",
        ":__support_osutil_vdso",
    ],
)

libc_support_library(
    name = "__support_time_linux_monotonicity",
    hdrs = ["src/__support/time/linux/monotonicity.h"],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    deps = [
        ":__support_libc_assert",
        ":__support_time_linux_abs_timeout",
        ":__support_time_linux_clock_conversion",
        ":hdr_time_macros",
    ],
)

############################### errno targets ################################

libc_function(
    name = "errno",
    srcs = ["src/errno/libc_errno.cpp"],
    hdrs = ["src/errno/libc_errno.h"],
    deps = [
        ":__support_common",
        ":__support_cpp_atomic",
        ":__support_macros_attributes",
        ":__support_macros_properties_architectures",
        ":hdr_errno_macros",
    ],
)

################################ fenv targets ################################

libc_function(
    name = "fetestexcept",
    srcs = ["src/fenv/fetestexcept.cpp"],
    hdrs = ["src/fenv/fetestexcept.h"],
    deps = [
        ":__support_common",
        ":__support_fputil_fenv_impl",
    ],
)

libc_function(
    name = "fetestexceptflag",
    srcs = ["src/fenv/fetestexceptflag.cpp"],
    hdrs = ["src/fenv/fetestexceptflag.h"],
    deps = [
        ":__support_common",
        ":__support_fputil_fenv_impl",
        ":types_fexcept_t",
    ],
)

libc_function(
    name = "feclearexcept",
    srcs = ["src/fenv/feclearexcept.cpp"],
    hdrs = ["src/fenv/feclearexcept.h"],
    deps = [
        ":__support_common",
        ":__support_fputil_fenv_impl",
    ],
)

libc_function(
    name = "feraiseexcept",
    srcs = ["src/fenv/feraiseexcept.cpp"],
    hdrs = ["src/fenv/feraiseexcept.h"],
    deps = [
        ":__support_common",
        ":__support_fputil_fenv_impl",
    ],
)

libc_function(
    name = "fegetround",
    srcs = ["src/fenv/fegetround.cpp"],
    hdrs = ["src/fenv/fegetround.h"],
    deps = [
        ":__support_common",
        ":__support_fputil_fenv_impl",
    ],
)

libc_function(
    name = "fesetround",
    srcs = ["src/fenv/fesetround.cpp"],
    hdrs = ["src/fenv/fesetround.h"],
    deps = [
        ":__support_common",
        ":__support_fputil_fenv_impl",
    ],
)

libc_function(
    name = "fedisableexcept",
    srcs = ["src/fenv/fedisableexcept.cpp"],
    hdrs = ["src/fenv/fedisableexcept.h"],
    deps = [
        ":__support_common",
        ":__support_fputil_fenv_impl",
    ],
)

libc_function(
    name = "feenableexcept",
    srcs = ["src/fenv/feenableexcept.cpp"],
    hdrs = ["src/fenv/feenableexcept.h"],
    deps = [
        ":__support_common",
        ":__support_fputil_fenv_impl",
    ],
)

libc_function(
    name = "fegetexcept",
    srcs = ["src/fenv/fegetexcept.cpp"],
    hdrs = ["src/fenv/fegetexcept.h"],
    deps = [
        ":__support_common",
        ":__support_fputil_fenv_impl",
    ],
)

libc_function(
    name = "fegetenv",
    srcs = ["src/fenv/fegetenv.cpp"],
    hdrs = ["src/fenv/fegetenv.h"],
    deps = [
        ":__support_common",
        ":__support_fputil_fenv_impl",
    ],
)

libc_function(
    name = "fesetenv",
    srcs = ["src/fenv/fesetenv.cpp"],
    hdrs = ["src/fenv/fesetenv.h"],
    deps = [
        ":__support_common",
        ":__support_fputil_fenv_impl",
    ],
)

libc_function(
    name = "feupdateenv",
    srcs = ["src/fenv/feupdateenv.cpp"],
    hdrs = ["src/fenv/feupdateenv.h"],
    deps = [
        ":__support_common",
        ":__support_fputil_fenv_impl",
    ],
)

libc_function(
    name = "fesetexcept",
    srcs = ["src/fenv/fesetexcept.cpp"],
    hdrs = ["src/fenv/fesetexcept.h"],
    deps = [
        ":__support_common",
        ":__support_fputil_fenv_impl",
    ],
)

libc_function(
    name = "fegetexceptflag",
    srcs = ["src/fenv/fegetexceptflag.cpp"],
    hdrs = ["src/fenv/fegetexceptflag.h"],
    deps = [
        ":__support_common",
        ":__support_fputil_fenv_impl",
        ":types_fexcept_t",
    ],
)

libc_function(
    name = "fesetexceptflag",
    srcs = ["src/fenv/fesetexceptflag.cpp"],
    hdrs = ["src/fenv/fesetexceptflag.h"],
    deps = [
        ":__support_common",
        ":__support_fputil_fenv_impl",
        ":types_fexcept_t",
    ],
)

libc_function(
    name = "feholdexcept",
    srcs = ["src/fenv/feholdexcept.cpp"],
    hdrs = ["src/fenv/feholdexcept.h"],
    deps = [
        ":__support_common",
        ":__support_fputil_fenv_impl",
    ],
)

########################### math support library ###############################

libc_support_library(
    name = "common_constants",
    srcs = ["src/math/generic/common_constants.cpp"],
    hdrs = ["src/math/generic/common_constants.h"],
    deps = [
        ":__support_fputil_triple_double",
        ":__support_number_pair",
    ],
)

libc_support_library(
    name = "range_reduction",
    hdrs = [
        "src/math/generic/range_reduction.h",
        "src/math/generic/range_reduction_fma.h",
    ],
    deps = [
        ":__support_common",
        ":__support_fputil_fma",
        ":__support_fputil_fp_bits",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
    ],
)

libc_support_library(
    name = "range_reduction_double",
    hdrs = [
        "src/math/generic/range_reduction_double_common.h",
        "src/math/generic/range_reduction_double_fma.h",
        "src/math/generic/range_reduction_double_nofma.h",
    ],
    deps = [
        ":__support_common",
        ":__support_fputil_double_double",
        ":__support_fputil_dyadic_float",
        ":__support_fputil_fp_bits",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_rounding_mode",
        ":__support_integer_literals",
    ],
)

libc_support_library(
    name = "sincos_eval",
    hdrs = [
        "src/math/generic/sincos_eval.h",
    ],
    deps = [
        ":__support_common",
        ":__support_fputil_double_double",
        ":__support_fputil_dyadic_float",
        ":__support_fputil_fp_bits",
        ":__support_fputil_multiply_add",
        ":__support_fputil_polyeval",
        ":__support_integer_literals",
    ],
)

libc_support_library(
    name = "sincosf_utils",
    hdrs = ["src/math/generic/sincosf_utils.h"],
    deps = [
        ":__support_fputil_fp_bits",
        ":__support_fputil_polyeval",
        ":range_reduction",
    ],
)

libc_support_library(
    name = "explogxf",
    srcs = ["src/math/generic/explogxf.cpp"],
    hdrs = ["src/math/generic/explogxf.h"],
    deps = [
        ":__support_common",
        ":__support_fputil_fenv_impl",
        ":__support_fputil_fma",
        ":__support_fputil_fp_bits",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":common_constants",
    ],
)

libc_support_library(
    name = "inv_trigf_utils",
    srcs = ["src/math/generic/inv_trigf_utils.cpp"],
    hdrs = ["src/math/generic/inv_trigf_utils.h"],
    deps = [
        ":__support_common",
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_polyeval",
    ],
)

libc_support_library(
    name = "log_range_reduction",
    hdrs = ["src/math/generic/log_range_reduction.h"],
    deps = [
        ":__support_common",
        ":__support_fputil_dyadic_float",
        ":__support_uint128",
        ":common_constants",
    ],
)

libc_support_library(
    name = "exp10f_impl",
    hdrs = ["src/math/generic/exp10f_impl.h"],
    deps = [
        ":__support_fputil_basic_operations",
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_fputil_rounding_mode",
        ":__support_macros_optimization",
        ":common_constants",
        ":explogxf",
    ],
)

libc_support_library(
    name = "exp2f_impl",
    hdrs = ["src/math/generic/exp2f_impl.h"],
    deps = [
        ":__support_fputil_except_value_utils",
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_fputil_rounding_mode",
        ":__support_macros_optimization",
        ":common_constants",
        ":explogxf",
    ],
)

################################ math targets ##################################

libc_math_function(
    name = "acosf",
    additional_deps = [
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_fputil_sqrt",
        ":__support_macros_optimization",
        ":inv_trigf_utils",
    ],
)

libc_math_function(
    name = "acoshf",
    additional_deps = [
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_fputil_sqrt",
        ":__support_macros_optimization",
        ":common_constants",
        ":explogxf",
    ],
)

libc_math_function(
    name = "asinf",
    additional_deps = [
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_fputil_sqrt",
        ":__support_macros_optimization",
        ":__support_macros_properties_cpu_features",
        ":inv_trigf_utils",
    ],
)

libc_math_function(
    name = "asinhf",
    additional_deps = [
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_fputil_sqrt",
        ":__support_macros_optimization",
        ":common_constants",
        ":explogxf",
    ],
)

libc_math_function(
    name = "atanf",
    additional_deps = [
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_fputil_rounding_mode",
        ":__support_macros_optimization",
        ":inv_trigf_utils",
    ],
)

libc_math_function(
    name = "atan2f",
    additional_deps = [
        ":__support_fputil_double_double",
        ":__support_fputil_nearest_integer",
        ":inv_trigf_utils",
    ],
)

libc_math_function(
    name = "atan2",
    additional_deps = [
        ":__support_fputil_double_double",
        ":__support_fputil_nearest_integer",
        ":inv_trigf_utils",
    ],
)

libc_math_function(
    name = "atanhf",
    additional_deps = [
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_macros_optimization",
        ":common_constants",
        ":explogxf",
    ],
)

libc_math_function(name = "canonicalize")

libc_math_function(name = "canonicalizef")

libc_math_function(name = "canonicalizel")

libc_math_function(name = "canonicalizef128")

libc_math_function(
    name = "cbrt",
    additional_deps = [
        ":__support_fputil_double_double",
        ":__support_fputil_polyeval",
        ":__support_integer_literals",
    ],
)

libc_math_function(
    name = "cbrtf",
    additional_deps = [
        ":__support_fputil_polyeval",
    ],
)

libc_math_function(name = "ceil")

libc_math_function(name = "ceilf")

libc_math_function(name = "ceill")

libc_math_function(name = "ceilf128")

libc_math_function(name = "copysign")

libc_math_function(name = "copysignf")

libc_math_function(name = "copysignl")

libc_math_function(name = "copysignf128")

libc_math_function(
    name = "cos",
    additional_deps = [
        ":__support_fputil_multiply_add",
        ":__support_macros_optimization",
        ":__support_macros_properties_cpu_features",
        ":range_reduction_double",
        ":sincos_eval",
    ],
)

libc_math_function(
    name = "cosf",
    additional_deps = [
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_macros_optimization",
        ":__support_macros_properties_cpu_features",
        ":sincosf_utils",
    ],
)

libc_math_function(
    name = "coshf",
    additional_deps = [
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_fputil_rounding_mode",
        ":__support_macros_optimization",
        ":common_constants",
        ":explogxf",
    ],
)

libc_math_function(
    name = "cospif",
    additional_deps = [
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_fputil_rounding_mode",
        ":__support_macros_optimization",
        ":common_constants",
        ":explogxf",
        ":sincosf_utils",
    ],
)

libc_math_function(name = "daddl")

libc_math_function(name = "daddf128")

libc_math_function(name = "ddivl")

libc_math_function(name = "ddivf128")

libc_math_function(
    name = "dfmal",
    additional_deps = [
        ":__support_fputil_fma",
    ],
)

libc_math_function(
    name = "dfmaf128",
    additional_deps = [
        ":__support_fputil_fma",
    ],
)

libc_math_function(name = "dmull")

libc_math_function(name = "dmulf128")

libc_math_function(
    name = "dsqrtl",
    additional_deps = [
        ":__support_fputil_sqrt",
    ],
)

libc_math_function(
    name = "dsqrtf128",
    additional_deps = [
        ":__support_fputil_sqrt",
    ],
)

libc_math_function(name = "dsubl")

libc_math_function(name = "dsubf128")

libc_math_function(
    name = "erff",
    additional_deps = [
        ":__support_fputil_multiply_add",
        ":__support_fputil_polyeval",
        ":__support_macros_optimization",
    ],
)

libc_math_function(
    name = "exp",
    additional_deps = [
        ":__support_fputil_double_double",
        ":__support_fputil_dyadic_float",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_fputil_rounding_mode",
        ":__support_fputil_triple_double",
        ":__support_integer_literals",
        ":__support_macros_optimization",
        ":common_constants",
        ":explogxf",
    ],
)

libc_math_function(
    name = "expf",
    additional_deps = [
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_fputil_rounding_mode",
        ":__support_macros_optimization",
        ":common_constants",
    ],
)

libc_math_function(
    name = "exp10",
    additional_deps = [
        ":__support_fputil_double_double",
        ":__support_fputil_dyadic_float",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_fputil_rounding_mode",
        ":__support_fputil_triple_double",
        ":__support_integer_literals",
        ":__support_macros_optimization",
        ":common_constants",
        ":explogxf",
    ],
)

libc_math_function(
    name = "exp10f",
    additional_deps = [
        ":exp10f_impl",
    ],
)

libc_math_function(
    name = "exp2",
    additional_deps = [
        ":__support_fputil_double_double",
        ":__support_fputil_dyadic_float",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_fputil_rounding_mode",
        ":__support_fputil_triple_double",
        ":__support_integer_literals",
        ":__support_macros_optimization",
        ":common_constants",
        ":explogxf",
    ],
)

libc_math_function(
    name = "exp2f",
    additional_deps = [
        ":exp2f_impl",
    ],
)

libc_math_function(
    name = "exp2m1f",
    additional_deps = [
        ":__support_fputil_polyeval",
        ":explogxf",
    ],
)

libc_math_function(
    name = "expm1",
    additional_deps = [
        ":__support_fputil_double_double",
        ":__support_fputil_dyadic_float",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_fputil_rounding_mode",
        ":__support_fputil_triple_double",
        ":__support_integer_literals",
        ":__support_macros_optimization",
        ":common_constants",
        ":explogxf",
    ],
)

libc_math_function(
    name = "expm1f",
    additional_deps = [
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_fputil_rounding_mode",
        ":__support_macros_optimization",
        ":__support_macros_properties_cpu_features",
        ":common_constants",
    ],
)

libc_math_function(name = "fabs")

libc_math_function(name = "fabsf")

libc_math_function(name = "fabsl")

libc_math_function(name = "fabsf128")

libc_math_function(name = "fadd")

libc_math_function(name = "faddl")

libc_math_function(name = "faddf128")

libc_math_function(name = "fdim")

libc_math_function(name = "fdimf")

libc_math_function(name = "fdiml")

libc_math_function(name = "fdimf128")

libc_math_function(name = "fdiv")

libc_math_function(name = "fdivl")

libc_math_function(name = "fdivf128")

libc_math_function(
    name = "ffma",
    additional_deps = [
        ":__support_fputil_fma",
    ],
)

libc_math_function(
    name = "ffmal",
    additional_deps = [
        ":__support_fputil_fma",
    ],
)

libc_math_function(
    name = "ffmaf128",
    additional_deps = [
        ":__support_fputil_fma",
    ],
)

libc_math_function(name = "floor")

libc_math_function(name = "floorf")

libc_math_function(name = "floorl")

libc_math_function(name = "floorf128")

# TODO: Add fma, fmaf, fmal, fmaf128 functions.

libc_math_function(name = "fmax")

libc_math_function(name = "fmaxf")

libc_math_function(name = "fmaxl")

libc_math_function(name = "fmaxf128")

libc_math_function(name = "fmaximum")

libc_math_function(name = "fmaximumf")

libc_math_function(name = "fmaximuml")

libc_math_function(name = "fmaximumf128")

libc_math_function(name = "fmaximum_mag")

libc_math_function(name = "fmaximum_magf")

libc_math_function(name = "fmaximum_magl")

libc_math_function(name = "fmaximum_magf128")

libc_math_function(name = "fmaximum_mag_num")

libc_math_function(name = "fmaximum_mag_numf")

libc_math_function(name = "fmaximum_mag_numl")

libc_math_function(name = "fmaximum_mag_numf128")

libc_math_function(name = "fmaximum_num")

libc_math_function(name = "fmaximum_numf")

libc_math_function(name = "fmaximum_numl")

libc_math_function(name = "fmaximum_numf128")

libc_math_function(name = "fmin")

libc_math_function(name = "fminf")

libc_math_function(name = "fminl")

libc_math_function(name = "fminf128")

libc_math_function(name = "fminimum")

libc_math_function(name = "fminimumf")

libc_math_function(name = "fminimuml")

libc_math_function(name = "fminimumf128")

libc_math_function(name = "fminimum_mag")

libc_math_function(name = "fminimum_magf")

libc_math_function(name = "fminimum_magl")

libc_math_function(name = "fminimum_magf128")

libc_math_function(name = "fminimum_mag_num")

libc_math_function(name = "fminimum_mag_numf")

libc_math_function(name = "fminimum_mag_numl")

libc_math_function(name = "fminimum_mag_numf128")

libc_math_function(name = "fminimum_num")

libc_math_function(name = "fminimum_numf")

libc_math_function(name = "fminimum_numl")

libc_math_function(name = "fminimum_numf128")

libc_math_function(
    name = "fmod",
    additional_deps = [
        ":__support_fputil_generic_fmod",
    ],
)

libc_math_function(
    name = "fmodf",
    additional_deps = [
        ":__support_fputil_generic_fmod",
    ],
)

libc_math_function(
    name = "fmodl",
    additional_deps = [
        ":__support_fputil_generic_fmod",
    ],
)

libc_math_function(
    name = "fmodf128",
    additional_deps = [
        ":__support_fputil_generic_fmod",
    ],
)

libc_math_function(
    name = "fmul",
    additional_deps = [
        ":__support_fputil_double_double",
    ],
)

libc_math_function(name = "fmull")

libc_math_function(name = "fmulf128")

libc_math_function(name = "frexp")

libc_math_function(name = "frexpf")

libc_math_function(name = "frexpl")

libc_math_function(name = "frexpf128")

libc_math_function(name = "fromfp")

libc_math_function(name = "fromfpf")

libc_math_function(name = "fromfpl")

libc_math_function(name = "fromfpf128")

libc_math_function(name = "fromfpx")

libc_math_function(name = "fromfpxf")

libc_math_function(name = "fromfpxl")

libc_math_function(name = "fromfpxf128")

libc_math_function(
    name = "fsqrt",
    additional_deps = [
        ":__support_fputil_sqrt",
    ],
)

libc_math_function(
    name = "fsqrtl",
    additional_deps = [
        ":__support_fputil_sqrt",
    ],
)

libc_math_function(
    name = "fsqrtf128",
    additional_deps = [
        ":__support_fputil_sqrt",
    ],
)

libc_math_function(name = "fsub")

libc_math_function(name = "fsubl")

libc_math_function(name = "fsubf128")

libc_math_function(name = "getpayload")

libc_math_function(name = "getpayloadf")

libc_math_function(name = "getpayloadl")

libc_math_function(name = "getpayloadf128")

libc_math_function(name = "hypot")

libc_math_function(
    name = "hypotf",
    additional_deps = [
        ":__support_fputil_double_double",
        ":__support_fputil_sqrt",
    ],
)

libc_math_function(name = "ilogb")

libc_math_function(name = "ilogbf")

libc_math_function(name = "ilogbl")

libc_math_function(name = "ilogbf128")

libc_math_function(name = "ldexp")

libc_math_function(name = "ldexpf")

libc_math_function(name = "ldexpl")

libc_math_function(name = "ldexpf128")

libc_math_function(name = "llogb")

libc_math_function(name = "llogbf")

libc_math_function(name = "llogbl")

libc_math_function(name = "llogbf128")

libc_math_function(name = "llrint")

libc_math_function(name = "llrintf")

libc_math_function(name = "llrintl")

libc_math_function(name = "llrintf128")

libc_math_function(name = "llround")

libc_math_function(name = "llroundf")

libc_math_function(name = "llroundl")

libc_math_function(name = "llroundf128")

libc_math_function(
    name = "log",
    additional_deps = [
        ":__support_fputil_double_double",
        ":__support_fputil_dyadic_float",
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_polyeval",
        ":__support_integer_literals",
        ":__support_macros_optimization",
        ":__support_macros_properties_cpu_features",
        ":common_constants",
        ":log_range_reduction",
    ],
)

libc_math_function(
    name = "logf",
    additional_deps = [
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_polyeval",
        ":__support_macros_optimization",
        ":__support_macros_properties_cpu_features",
        ":common_constants",
    ],
)

libc_math_function(
    name = "log10",
    additional_deps = [
        ":__support_fputil_double_double",
        ":__support_fputil_dyadic_float",
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_polyeval",
        ":__support_integer_literals",
        ":__support_macros_optimization",
        ":__support_macros_properties_cpu_features",
        ":common_constants",
        ":log_range_reduction",
    ],
)

libc_math_function(
    name = "log10f",
    additional_deps = [
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_polyeval",
        ":__support_macros_optimization",
        ":__support_macros_properties_cpu_features",
        ":common_constants",
    ],
)

libc_math_function(
    name = "log1p",
    additional_deps = [
        ":__support_fputil_double_double",
        ":__support_fputil_dyadic_float",
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_polyeval",
        ":__support_integer_literals",
        ":__support_macros_optimization",
        ":__support_macros_properties_cpu_features",
        ":common_constants",
    ],
)

libc_math_function(
    name = "log1pf",
    additional_deps = [
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_polyeval",
        ":__support_macros_optimization",
        ":__support_macros_properties_cpu_features",
        ":common_constants",
    ],
)

libc_math_function(
    name = "log2",
    additional_deps = [
        ":__support_fputil_double_double",
        ":__support_fputil_dyadic_float",
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_polyeval",
        ":__support_integer_literals",
        ":__support_macros_optimization",
        ":__support_macros_properties_cpu_features",
        ":common_constants",
        ":log_range_reduction",
    ],
)

libc_math_function(
    name = "log2f",
    additional_deps = [
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_polyeval",
        ":__support_macros_optimization",
        ":common_constants",
    ],
)

libc_math_function(name = "logb")

libc_math_function(name = "logbf")

libc_math_function(name = "logbl")

libc_math_function(name = "logbf128")

libc_math_function(name = "lrint")

libc_math_function(name = "lrintf")

libc_math_function(name = "lrintl")

libc_math_function(name = "lrintf128")

libc_math_function(name = "lround")

libc_math_function(name = "lroundf")

libc_math_function(name = "lroundl")

libc_math_function(name = "lroundf128")

libc_math_function(name = "modf")

libc_math_function(name = "modff")

libc_math_function(name = "modfl")

libc_math_function(name = "modff128")

libc_math_function(
    name = "nan",
    additional_deps = [
        ":__support_str_to_float",
        ":errno",
    ],
)

libc_math_function(
    name = "nanf",
    additional_deps = [
        ":__support_str_to_float",
        ":errno",
    ],
)

libc_math_function(
    name = "nanl",
    additional_deps = [
        ":__support_str_to_float",
        ":errno",
    ],
)

libc_math_function(
    name = "nanf128",
    additional_deps = [
        ":__support_str_to_float",
        ":errno",
    ],
)

libc_math_function(name = "nearbyint")

libc_math_function(name = "nearbyintf")

libc_math_function(name = "nearbyintl")

libc_math_function(name = "nearbyintf128")

libc_math_function(name = "nextafter")

libc_math_function(name = "nextafterf")

libc_math_function(name = "nextafterl")

libc_math_function(name = "nextafterf128")

libc_math_function(name = "nextdown")

libc_math_function(name = "nextdownf")

libc_math_function(name = "nextdownl")

libc_math_function(name = "nextdownf128")

libc_math_function(name = "nexttoward")

libc_math_function(name = "nexttowardf")

libc_math_function(name = "nexttowardl")

libc_math_function(name = "nextup")

libc_math_function(name = "nextupf")

libc_math_function(name = "nextupl")

libc_math_function(name = "nextupf128")

libc_math_function(
    name = "pow",
    additional_deps = [
        ":__support_fputil_double_double",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_fputil_sqrt",
        ":common_constants",
    ],
)

libc_math_function(
    name = "powf",
    additional_deps = [
        ":__support_fputil_double_double",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_fputil_rounding_mode",
        ":__support_fputil_sqrt",
        ":__support_fputil_triple_double",
        ":__support_macros_optimization",
        ":common_constants",
        ":explogxf",
        ":exp2f_impl",
        ":exp10f_impl",
    ],
)

libc_math_function(name = "remainder")

libc_math_function(name = "remainderf")

libc_math_function(name = "remainderl")

libc_math_function(name = "remainderf128")

libc_math_function(name = "remquo")

libc_math_function(name = "remquof")

libc_math_function(name = "remquol")

libc_math_function(name = "remquof128")

libc_math_function(name = "rint")

libc_math_function(name = "rintf")

libc_math_function(name = "rintl")

libc_math_function(name = "rintf128")

libc_math_function(name = "round")

libc_math_function(name = "roundf")

libc_math_function(name = "roundl")

libc_math_function(name = "roundf128")

libc_math_function(name = "roundeven")

libc_math_function(name = "roundevenf")

libc_math_function(name = "roundevenl")

libc_math_function(name = "roundevenf128")

libc_math_function(name = "scalbln")

libc_math_function(name = "scalblnf")

libc_math_function(name = "scalblnl")

libc_math_function(name = "scalblnf128")

libc_math_function(name = "scalbn")

libc_math_function(name = "scalbnf")

libc_math_function(name = "scalbnl")

libc_math_function(name = "scalbnf128")

libc_math_function(name = "setpayload")

libc_math_function(name = "setpayloadf")

libc_math_function(name = "setpayloadl")

libc_math_function(name = "setpayloadf128")

libc_math_function(name = "setpayloadsig")

libc_math_function(name = "setpayloadsigf")

libc_math_function(name = "setpayloadsigl")

libc_math_function(name = "setpayloadsigf128")

libc_math_function(
    name = "sin",
    additional_deps = [
        ":__support_fputil_multiply_add",
        ":__support_macros_optimization",
        ":__support_macros_properties_cpu_features",
        ":range_reduction_double",
        ":sincos_eval",
    ],
)

libc_math_function(
    name = "sinf",
    additional_deps = [
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_polyeval",
        ":__support_fputil_rounding_mode",
        ":__support_macros_optimization",
        ":__support_macros_properties_cpu_features",
        ":range_reduction",
        ":sincosf_utils",
    ],
)

libc_math_function(
    name = "sincos",
    additional_deps = [
        ":__support_fputil_multiply_add",
        ":__support_macros_optimization",
        ":__support_macros_properties_cpu_features",
        ":range_reduction_double",
        ":sincos_eval",
    ],
)

libc_math_function(
    name = "sincosf",
    additional_deps = [
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_rounding_mode",
        ":__support_macros_optimization",
        ":__support_macros_properties_cpu_features",
        ":sincosf_utils",
    ],
)

libc_math_function(
    name = "sinhf",
    additional_deps = [
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_fputil_rounding_mode",
        ":__support_macros_optimization",
        ":common_constants",
        ":explogxf",
    ],
)

libc_math_function(
    name = "sinpif",
    additional_deps = [
        ":sincosf_utils",
    ],
)

libc_math_function(
    name = "sqrt",
    additional_deps = [
        ":__support_fputil_sqrt",
    ],
)

libc_math_function(
    name = "sqrtf",
    additional_deps = [
        ":__support_fputil_sqrt",
    ],
)

libc_math_function(
    name = "sqrtl",
    additional_deps = [
        ":__support_fputil_sqrt",
    ],
)

libc_math_function(
    name = "sqrtf128",
    additional_deps = [
        ":__support_fputil_sqrt",
    ],
)

libc_math_function(
    name = "tan",
    additional_deps = [
        ":__support_fputil_multiply_add",
        ":__support_macros_optimization",
        ":__support_macros_properties_cpu_features",
        ":range_reduction_double",
        ":sincos_eval",
    ],
)

libc_math_function(
    name = "tanf",
    additional_deps = [
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_macros_optimization",
        ":__support_macros_properties_cpu_features",
        ":range_reduction",
        ":sincosf_utils",
    ],
)

libc_math_function(
    name = "tanhf",
    additional_deps = [
        ":__support_fputil_fma",
        ":__support_fputil_multiply_add",
        ":__support_fputil_nearest_integer",
        ":__support_fputil_polyeval",
        ":__support_fputil_rounding_mode",
        ":__support_macros_optimization",
        ":__support_macros_properties_cpu_features",
        ":common_constants",
        ":explogxf",
    ],
)

libc_math_function(name = "totalorder")

libc_math_function(name = "totalorderf")

libc_math_function(name = "totalorderl")

libc_math_function(name = "totalorderf128")

libc_math_function(name = "totalordermag")

libc_math_function(name = "totalordermagf")

libc_math_function(name = "totalordermagl")

libc_math_function(name = "totalordermagf128")

libc_math_function(name = "trunc")

libc_math_function(name = "truncf")

libc_math_function(name = "truncl")

libc_math_function(name = "truncf128")

libc_math_function(name = "ufromfp")

libc_math_function(name = "ufromfpf")

libc_math_function(name = "ufromfpl")

libc_math_function(name = "ufromfpf128")

libc_math_function(name = "ufromfpx")

libc_math_function(name = "ufromfpxf")

libc_math_function(name = "ufromfpxl")

libc_math_function(name = "ufromfpxf128")

############################## inttypes targets ##############################

libc_function(
    name = "imaxabs",
    srcs = ["src/inttypes/imaxabs.cpp"],
    hdrs = ["src/inttypes/imaxabs.h"],
    deps = [
        ":__support_common",
        ":__support_integer_operations",
    ],
)

libc_function(
    name = "imaxdiv",
    srcs = ["src/inttypes/imaxdiv.cpp"],
    hdrs = ["src/inttypes/imaxdiv.h"],
    deps = [
        ":__support_common",
        ":__support_integer_operations",
    ],
)

############################### stdlib targets ###############################

libc_function(
    name = "abs",
    srcs = ["src/stdlib/abs.cpp"],
    hdrs = ["src/stdlib/abs.h"],
    deps = [
        ":__support_common",
        ":__support_integer_operations",
    ],
)

libc_function(
    name = "labs",
    srcs = ["src/stdlib/labs.cpp"],
    hdrs = ["src/stdlib/labs.h"],
    deps = [
        ":__support_common",
        ":__support_integer_operations",
    ],
)

libc_function(
    name = "llabs",
    srcs = ["src/stdlib/llabs.cpp"],
    hdrs = ["src/stdlib/llabs.h"],
    deps = [
        ":__support_common",
        ":__support_integer_operations",
    ],
)

libc_function(
    name = "div",
    srcs = ["src/stdlib/div.cpp"],
    hdrs = ["src/stdlib/div.h"],
    deps = [
        ":__support_common",
        ":__support_integer_operations",
    ],
)

libc_function(
    name = "ldiv",
    srcs = ["src/stdlib/ldiv.cpp"],
    hdrs = ["src/stdlib/ldiv.h"],
    deps = [
        ":__support_common",
        ":__support_integer_operations",
    ],
)

libc_function(
    name = "lldiv",
    srcs = ["src/stdlib/lldiv.cpp"],
    hdrs = ["src/stdlib/lldiv.h"],
    deps = [
        ":__support_common",
        ":__support_integer_operations",
    ],
)

libc_function(
    name = "atoi",
    srcs = ["src/stdlib/atoi.cpp"],
    hdrs = ["src/stdlib/atoi.h"],
    deps = [
        ":__support_common",
        ":__support_str_to_integer",
        ":errno",
    ],
)

libc_function(
    name = "atol",
    srcs = ["src/stdlib/atol.cpp"],
    hdrs = ["src/stdlib/atol.h"],
    deps = [
        ":__support_common",
        ":__support_str_to_integer",
        ":errno",
    ],
)

libc_function(
    name = "atoll",
    srcs = ["src/stdlib/atoll.cpp"],
    hdrs = ["src/stdlib/atoll.h"],
    deps = [
        ":__support_common",
        ":__support_str_to_integer",
        ":errno",
    ],
)

libc_function(
    name = "atof",
    srcs = ["src/stdlib/atof.cpp"],
    hdrs = ["src/stdlib/atof.h"],
    deps = [
        ":__support_common",
        ":__support_str_to_float",
        ":errno",
    ],
)

libc_function(
    name = "bsearch",
    srcs = ["src/stdlib/bsearch.cpp"],
    hdrs = ["src/stdlib/bsearch.h"],
    deps = [
        ":__support_common",
    ],
)

libc_support_library(
    name = "qsort_util",
    hdrs = [
        "src/stdlib/heap_sort.h",
        "src/stdlib/qsort_data.h",
        "src/stdlib/qsort_util.h",
        "src/stdlib/quick_sort.h",
    ],
    deps = [
        ":__support_common",
        ":__support_cpp_cstddef",
        ":__support_macros_attributes",
    ],
)

libc_function(
    name = "qsort",
    srcs = ["src/stdlib/qsort.cpp"],
    hdrs = ["src/stdlib/qsort.h"],
    deps = [
        ":__support_common",
        ":qsort_util",
    ],
)

libc_function(
    name = "qsort_r",
    srcs = ["src/stdlib/qsort_r.cpp"],
    hdrs = ["src/stdlib/qsort_r.h"],
    deps = [
        ":__support_common",
        ":qsort_util",
    ],
)

libc_function(
    name = "strtol",
    srcs = ["src/stdlib/strtol.cpp"],
    hdrs = ["src/stdlib/strtol.h"],
    deps = [
        ":__support_common",
        ":__support_str_to_integer",
        ":errno",
    ],
)

libc_function(
    name = "strtoll",
    srcs = ["src/stdlib/strtoll.cpp"],
    hdrs = ["src/stdlib/strtoll.h"],
    deps = [
        ":__support_common",
        ":__support_str_to_integer",
        ":errno",
    ],
)

libc_function(
    name = "strtoul",
    srcs = ["src/stdlib/strtoul.cpp"],
    hdrs = ["src/stdlib/strtoul.h"],
    deps = [
        ":__support_common",
        ":__support_str_to_integer",
        ":errno",
    ],
)

libc_function(
    name = "strtoull",
    srcs = ["src/stdlib/strtoull.cpp"],
    hdrs = ["src/stdlib/strtoull.h"],
    deps = [
        ":__support_common",
        ":__support_str_to_integer",
        ":errno",
    ],
)

libc_function(
    name = "strtof",
    srcs = ["src/stdlib/strtof.cpp"],
    hdrs = ["src/stdlib/strtof.h"],
    deps = [
        ":__support_common",
        ":__support_str_to_float",
        ":errno",
    ],
)

libc_function(
    name = "strtod",
    srcs = ["src/stdlib/strtod.cpp"],
    hdrs = ["src/stdlib/strtod.h"],
    deps = [
        ":__support_common",
        ":__support_str_to_float",
        ":errno",
    ],
)

libc_function(
    name = "strtold",
    srcs = ["src/stdlib/strtold.cpp"],
    hdrs = ["src/stdlib/strtold.h"],
    deps = [
        ":__support_common",
        ":__support_str_to_float",
        ":errno",
    ],
)

############################### string targets ###############################

no_sanitize_features = [
    "-asan",
    "-msan",
    "-tsan",
    "-ubsan",
]

libc_support_library(
    name = "string_memory_utils",
    hdrs = [
        "src/string/memory_utils/op_aarch64.h",
        "src/string/memory_utils/op_builtin.h",
        "src/string/memory_utils/op_generic.h",
        "src/string/memory_utils/op_riscv.h",
        "src/string/memory_utils/op_x86.h",
        "src/string/memory_utils/utils.h",
    ],
    textual_hdrs = [
        "src/string/memory_utils/aarch64/inline_bcmp.h",
        "src/string/memory_utils/aarch64/inline_memcmp.h",
        "src/string/memory_utils/aarch64/inline_memcpy.h",
        "src/string/memory_utils/aarch64/inline_memmove.h",
        "src/string/memory_utils/aarch64/inline_memset.h",
        "src/string/memory_utils/generic/aligned_access.h",
        "src/string/memory_utils/generic/byte_per_byte.h",
        "src/string/memory_utils/inline_bcmp.h",
        "src/string/memory_utils/inline_bzero.h",
        "src/string/memory_utils/inline_memcmp.h",
        "src/string/memory_utils/inline_memcpy.h",
        "src/string/memory_utils/inline_memmem.h",
        "src/string/memory_utils/inline_memmove.h",
        "src/string/memory_utils/inline_memset.h",
        "src/string/memory_utils/inline_strcmp.h",
        "src/string/memory_utils/inline_strstr.h",
        "src/string/memory_utils/riscv/inline_bcmp.h",
        "src/string/memory_utils/riscv/inline_memcmp.h",
        "src/string/memory_utils/riscv/inline_memcpy.h",
        "src/string/memory_utils/riscv/inline_memmove.h",
        "src/string/memory_utils/riscv/inline_memset.h",
        "src/string/memory_utils/x86_64/inline_bcmp.h",
        "src/string/memory_utils/x86_64/inline_memcmp.h",
        "src/string/memory_utils/x86_64/inline_memcpy.h",
        "src/string/memory_utils/x86_64/inline_memmove.h",
        "src/string/memory_utils/x86_64/inline_memset.h",
    ],
    deps = [
        ":__support_common",
        ":__support_cpp_array",
        ":__support_cpp_bit",
        ":__support_cpp_cstddef",
        ":__support_cpp_type_traits",
        ":__support_macros_attributes",
        ":__support_macros_optimization",
        ":__support_macros_properties_architectures",
        ":__support_macros_properties_cpu_features",
    ],
)

libc_support_library(
    name = "string_utils",
    hdrs = ["src/string/string_utils.h"],
    deps = [
        ":__support_common",
        ":__support_cpp_bitset",
        ":__support_macros_optimization",
        ":string_memory_utils",
    ],
)

libc_function(
    name = "memchr",
    srcs = ["src/string/memchr.cpp"],
    hdrs = ["src/string/memchr.h"],
    deps = [
        ":__support_common",
        ":string_utils",
    ],
)

libc_function(
    name = "memcpy",
    srcs = ["src/string/memcpy.cpp"],
    hdrs = ["src/string/memcpy.h"],
    copts = ["-mllvm --tail-merge-threshold=0"],
    features = no_sanitize_features,
    weak = True,
    deps = [
        ":__support_common",
        ":string_memory_utils",
    ],
)

libc_function(
    name = "memset",
    srcs = ["src/string/memset.cpp"],
    hdrs = ["src/string/memset.h"],
    features = no_sanitize_features,
    weak = True,
    deps = [
        ":__support_common",
        ":string_memory_utils",
    ],
)

libc_function(
    name = "memmove",
    srcs = ["src/string/memmove.cpp"],
    hdrs = ["src/string/memmove.h"],
    features = no_sanitize_features,
    weak = True,
    deps = [
        ":__support_common",
        ":string_memory_utils",
    ],
)

libc_function(
    name = "mempcpy",
    srcs = ["src/string/mempcpy.cpp"],
    hdrs = ["src/string/mempcpy.h"],
    copts = ["-mllvm --tail-merge-threshold=0"],
    features = no_sanitize_features,
    weak = True,
    deps = [
        ":__support_common",
        ":string_memory_utils",
    ],
)

libc_function(
    name = "bcopy",
    srcs = ["src/string/bcopy.cpp"],
    hdrs = ["src/string/bcopy.h"],
    features = no_sanitize_features,
    deps = [
        ":__support_common",
        ":string_memory_utils",
    ],
)

libc_function(
    name = "memcmp",
    srcs = ["src/string/memcmp.cpp"],
    hdrs = ["src/string/memcmp.h"],
    features = no_sanitize_features,
    weak = True,
    deps = [
        ":__support_common",
        ":__support_integer_operations",
        ":string_memory_utils",
    ],
)

libc_function(
    name = "bcmp",
    srcs = ["src/string/bcmp.cpp"],
    hdrs = ["src/string/bcmp.h"],
    features = no_sanitize_features,
    weak = True,
    deps = [
        ":__support_common",
        ":string_memory_utils",
    ],
)

libc_function(
    name = "bzero",
    srcs = ["src/string/bzero.cpp"],
    hdrs = ["src/string/bzero.h"],
    features = no_sanitize_features,
    weak = True,
    deps = [
        ":__support_common",
        ":string_memory_utils",
    ],
)

libc_function(
    name = "memrchr",
    srcs = ["src/string/memrchr.cpp"],
    hdrs = ["src/string/memrchr.h"],
    deps = [
        ":__support_common",
        ":string_utils",
    ],
)

libc_function(
    name = "strlen",
    srcs = ["src/string/strlen.cpp"],
    hdrs = ["src/string/strlen.h"],
    features = no_sanitize_features,
    deps = [
        ":__support_common",
        ":string_utils",
    ],
)

libc_function(
    name = "strcpy",
    srcs = ["src/string/strcpy.cpp"],
    hdrs = ["src/string/strcpy.h"],
    features = no_sanitize_features,
    deps = [
        ":__support_common",
        ":memcpy",
        ":string_memory_utils",
        ":string_utils",
    ],
)

# A sanitizer instrumented flavor of strcpy to be used with unittests.
libc_function(
    name = "strcpy_sanitized",
    testonly = 1,
    srcs = ["src/string/strcpy.cpp"],
    hdrs = ["src/string/strcpy.h"],
    deps = [
        ":__support_common",
        ":memcpy",
        ":string_memory_utils",
        ":string_utils",
    ],
)

libc_function(
    name = "strncpy",
    srcs = ["src/string/strncpy.cpp"],
    hdrs = ["src/string/strncpy.h"],
    deps = [
        ":__support_common",
    ],
)

libc_function(
    name = "strcmp",
    srcs = ["src/string/strcmp.cpp"],
    hdrs = ["src/string/strcmp.h"],
    deps = [
        ":__support_common",
        ":string_memory_utils",
        ":string_utils",
    ],
)

libc_function(
    name = "strchr",
    srcs = ["src/string/strchr.cpp"],
    hdrs = ["src/string/strchr.h"],
    deps = [
        ":__support_common",
        ":string_utils",
    ],
)

libc_function(
    name = "strrchr",
    srcs = ["src/string/strrchr.cpp"],
    hdrs = ["src/string/strrchr.h"],
    deps = [
        ":__support_common",
        ":string_utils",
    ],
)

libc_function(
    name = "strstr",
    srcs = ["src/string/strstr.cpp"],
    hdrs = ["src/string/strstr.h"],
    deps = [
        ":__support_common",
        ":string_memory_utils",
        ":string_utils",
    ],
)

libc_function(
    name = "strnlen",
    srcs = ["src/string/strnlen.cpp"],
    hdrs = ["src/string/strnlen.h"],
    deps = [
        ":__support_common",
        ":string_utils",
    ],
)

libc_function(
    name = "strcspn",
    srcs = ["src/string/strcspn.cpp"],
    hdrs = ["src/string/strcspn.h"],
    deps = [
        ":__support_common",
        ":string_utils",
    ],
)

libc_function(
    name = "strspn",
    srcs = ["src/string/strspn.cpp"],
    hdrs = ["src/string/strspn.h"],
    deps = [
        ":__support_common",
        ":__support_cpp_bitset",
        ":string_utils",
    ],
)

libc_function(
    name = "strpbrk",
    srcs = ["src/string/strpbrk.cpp"],
    hdrs = ["src/string/strpbrk.h"],
    deps = [
        ":__support_common",
        ":string_utils",
    ],
)

libc_function(
    name = "strtok",
    srcs = ["src/string/strtok.cpp"],
    hdrs = ["src/string/strtok.h"],
    deps = [
        ":__support_common",
        ":string_utils",
    ],
)

################################ fcntl targets #################################

libc_function(
    name = "open",
    srcs = ["src/fcntl/linux/open.cpp"],
    hdrs = ["src/fcntl/open.h"],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "openat",
    srcs = ["src/fcntl/linux/openat.cpp"],
    hdrs = ["src/fcntl/openat.h"],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "creat",
    srcs = ["src/fcntl/linux/creat.cpp"],
    hdrs = ["src/fcntl/creat.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

################################ unistd targets ################################

libc_function(
    name = "access",
    srcs = ["src/unistd/linux/access.cpp"],
    hdrs = ["src/unistd/access.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "chdir",
    srcs = ["src/unistd/linux/chdir.cpp"],
    hdrs = ["src/unistd/chdir.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "close",
    srcs = ["src/unistd/linux/close.cpp"],
    hdrs = ["src/unistd/close.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "dup",
    srcs = ["src/unistd/linux/dup.cpp"],
    hdrs = ["src/unistd/dup.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "dup2",
    srcs = ["src/unistd/linux/dup2.cpp"],
    hdrs = ["src/unistd/dup2.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "dup3",
    srcs = ["src/unistd/linux/dup3.cpp"],
    hdrs = ["src/unistd/dup3.h"],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "environ",
    srcs = ["src/unistd/environ.cpp"],
    hdrs = ["src/unistd/environ.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "fchdir",
    srcs = ["src/unistd/linux/fchdir.cpp"],
    hdrs = ["src/unistd/fchdir.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "fsync",
    srcs = ["src/unistd/linux/fsync.cpp"],
    hdrs = ["src/unistd/fsync.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "ftruncate",
    srcs = ["src/unistd/linux/ftruncate.cpp"],
    hdrs = ["src/unistd/ftruncate.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

# libc_function(
#     name = "getcwd",
#     srcs = ["src/unistd/linux/getcwd.cpp"],
#     hdrs = ["src/unistd/getcwd.h"],
#     deps = [
#         ":__support_common",
#         ":__support_osutil_syscall",
#         ":errno",
#     ],
# )

libc_function(
    name = "geteuid",
    srcs = ["src/unistd/linux/geteuid.cpp"],
    hdrs = ["src/unistd/geteuid.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "getppid",
    srcs = ["src/unistd/linux/getppid.cpp"],
    hdrs = ["src/unistd/getppid.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "getuid",
    srcs = ["src/unistd/linux/getuid.cpp"],
    hdrs = ["src/unistd/getuid.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

# libc_function(
#     name = "getopt",
#     srcs = ["src/unistd/getopt.cpp"],
#     hdrs = ["src/unistd/getopt.h"],
#     deps = [
#         ":__support_common",
#         ":__support_cpp_optional",
#         ":__support_cpp_string_view",
#         ":__support_file_file",
#         ":__support_osutil_syscall",
#         ":errno",
#     ],
# )

libc_function(
    name = "isatty",
    srcs = ["src/unistd/linux/isatty.cpp"],
    hdrs = ["src/unistd/isatty.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "link",
    srcs = ["src/unistd/linux/link.cpp"],
    hdrs = ["src/unistd/link.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "linkat",
    srcs = ["src/unistd/linux/linkat.cpp"],
    hdrs = ["src/unistd/linkat.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "pipe",
    srcs = ["src/unistd/linux/pipe.cpp"],
    hdrs = ["src/unistd/pipe.h"],
    deps = [
        ":__support_common",
        ":__support_macros_sanitizer",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "lseek",
    srcs = ["src/unistd/linux/lseek.cpp"],
    hdrs = ["src/unistd/lseek.h"],
    deps = [
        ":__support_common",
        ":__support_file_linux_lseekimpl",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "pread",
    srcs = ["src/unistd/linux/pread.cpp"],
    hdrs = ["src/unistd/pread.h"],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    deps = [
        ":__support_common",
        ":__support_macros_sanitizer",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "pwrite",
    srcs = ["src/unistd/linux/pwrite.cpp"],
    hdrs = ["src/unistd/pwrite.h"],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "read",
    srcs = ["src/unistd/linux/read.cpp"],
    hdrs = ["src/unistd/read.h"],
    weak = True,
    deps = [
        ":__support_common",
        ":__support_macros_sanitizer",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "readlink",
    srcs = ["src/unistd/linux/readlink.cpp"],
    hdrs = ["src/unistd/readlink.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "readlinkat",
    srcs = ["src/unistd/linux/readlinkat.cpp"],
    hdrs = ["src/unistd/readlinkat.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "rmdir",
    srcs = ["src/unistd/linux/rmdir.cpp"],
    hdrs = ["src/unistd/rmdir.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "symlink",
    srcs = ["src/unistd/linux/symlink.cpp"],
    hdrs = ["src/unistd/symlink.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "symlinkat",
    srcs = ["src/unistd/linux/symlinkat.cpp"],
    hdrs = ["src/unistd/symlinkat.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

#TODO: Enable once fullbuild is added to bazel, since this depends on a macro
# definition in the public header

# libc_function(
#     name = "syscall",
#     srcs = ["src/unistd/linux/syscall.cpp"],
#     hdrs = ["src/unistd/syscall.h"],
#     deps = [
#         ":__support_common",
#         ":__support_osutil_syscall",
#         ":errno",
#     ],
# )

libc_function(
    name = "swab",
    srcs = ["src/unistd/swab.cpp"],
    hdrs = ["src/unistd/swab.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "truncate",
    srcs = ["src/unistd/linux/truncate.cpp"],
    hdrs = ["src/unistd/truncate.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "unlink",
    srcs = ["src/unistd/linux/unlink.cpp"],
    hdrs = ["src/unistd/unlink.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "unlinkat",
    srcs = ["src/unistd/linux/unlinkat.cpp"],
    hdrs = ["src/unistd/unlinkat.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "write",
    srcs = ["src/unistd/linux/write.cpp"],
    hdrs = ["src/unistd/write.h"],
    weak = True,
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

################################ stdio targets #################################

libc_support_library(
    name = "printf_config",
    hdrs = ["src/stdio/printf_core/printf_config.h"],
    deps = [
    ],
)

libc_support_library(
    name = "printf_core_structs",
    hdrs = ["src/stdio/printf_core/core_structs.h"],
    deps = [
        ":__support_cpp_string_view",
        ":__support_fputil_fp_bits",
        ":printf_config",
    ],
)

libc_support_library(
    name = "printf_parser",
    hdrs = ["src/stdio/printf_core/parser.h"],
    deps = [
        ":__support_arg_list",
        ":__support_common",
        ":__support_cpp_algorithm",
        ":__support_cpp_bit",
        ":__support_cpp_optional",
        ":__support_cpp_string_view",
        ":__support_cpp_type_traits",
        ":__support_ctype_utils",
        ":__support_fputil_fp_bits",
        ":__support_str_to_integer",
        ":errno",
        ":printf_config",
        ":printf_core_structs",
    ],
)

# Only used for testing.
libc_support_library(
    name = "printf_mock_parser",
    hdrs = ["src/stdio/printf_core/parser.h"],
    local_defines = ["LIBC_COPT_MOCK_ARG_LIST"],
    deps = [
        ":__support_arg_list",
        ":__support_common",
        ":__support_cpp_bit",
        ":__support_cpp_optional",
        ":__support_cpp_string_view",
        ":__support_cpp_type_traits",
        ":__support_ctype_utils",
        ":__support_fputil_fp_bits",
        ":__support_str_to_integer",
        ":printf_config",
        ":printf_core_structs",
    ],
)

libc_support_library(
    name = "printf_writer",
    srcs = ["src/stdio/printf_core/writer.cpp"],
    hdrs = ["src/stdio/printf_core/writer.h"],
    deps = [
        ":__support_cpp_string_view",
        ":__support_macros_optimization",
        ":printf_core_structs",
        ":string_memory_utils",
    ],
)

libc_support_library(
    name = "printf_converter",
    srcs = ["src/stdio/printf_core/converter.cpp"],
    hdrs = [
        "src/stdio/printf_core/char_converter.h",
        "src/stdio/printf_core/converter.h",
        "src/stdio/printf_core/converter_atlas.h",
        "src/stdio/printf_core/converter_utils.h",
        "src/stdio/printf_core/float_dec_converter.h",
        "src/stdio/printf_core/float_hex_converter.h",
        "src/stdio/printf_core/float_inf_nan_converter.h",
        "src/stdio/printf_core/int_converter.h",
        "src/stdio/printf_core/ptr_converter.h",
        "src/stdio/printf_core/strerror_converter.h",
        "src/stdio/printf_core/string_converter.h",
        "src/stdio/printf_core/write_int_converter.h",
    ],
    deps = [
        ":__support_big_int",
        ":__support_common",
        ":__support_cpp_limits",
        ":__support_cpp_span",
        ":__support_cpp_string_view",
        ":__support_float_to_string",
        ":__support_fputil_fenv_impl",
        ":__support_fputil_fp_bits",
        ":__support_fputil_rounding_mode",
        ":__support_integer_to_string",
        ":__support_libc_assert",
        ":__support_stringutil",
        ":__support_uint128",
        ":printf_config",
        ":printf_core_structs",
        ":printf_writer",
    ],
)

libc_support_library(
    name = "printf_main",
    srcs = ["src/stdio/printf_core/printf_main.cpp"],
    hdrs = ["src/stdio/printf_core/printf_main.h"],
    deps = [
        ":__support_arg_list",
        ":printf_converter",
        ":printf_core_structs",
        ":printf_parser",
        ":printf_writer",
    ],
)

libc_support_library(
    name = "vfprintf_internal",
    hdrs = ["src/stdio/printf_core/vfprintf_internal.h"],
    deps = [
        ":__support_arg_list",
        ":__support_file_file",
        ":__support_macros_attributes",
        ":printf_main",
        ":printf_writer",
        ":types_FILE",
    ],
)

libc_function(
    name = "sprintf",
    srcs = ["src/stdio/sprintf.cpp"],
    hdrs = ["src/stdio/sprintf.h"],
    deps = [
        ":__support_arg_list",
        ":__support_cpp_limits",
        ":errno",
        ":printf_main",
        ":printf_writer",
    ],
)

libc_function(
    name = "snprintf",
    srcs = ["src/stdio/snprintf.cpp"],
    hdrs = ["src/stdio/snprintf.h"],
    deps = [
        ":__support_arg_list",
        ":errno",
        ":printf_main",
        ":printf_writer",
    ],
)

libc_function(
    name = "printf",
    srcs = ["src/stdio/generic/printf.cpp"],
    hdrs = ["src/stdio/printf.h"],
    deps = [
        ":__support_arg_list",
        ":__support_file_file",
        ":errno",
        ":types_FILE",
        ":vfprintf_internal",
    ],
)

libc_function(
    name = "fprintf",
    srcs = ["src/stdio/generic/fprintf.cpp"],
    hdrs = ["src/stdio/fprintf.h"],
    deps = [
        ":__support_arg_list",
        ":__support_file_file",
        ":errno",
        ":types_FILE",
        ":vfprintf_internal",
    ],
)

libc_function(
    name = "vsprintf",
    srcs = ["src/stdio/vsprintf.cpp"],
    hdrs = ["src/stdio/vsprintf.h"],
    deps = [
        ":__support_arg_list",
        ":__support_cpp_limits",
        ":errno",
        ":printf_main",
        ":printf_writer",
    ],
)

libc_function(
    name = "vsnprintf",
    srcs = ["src/stdio/vsnprintf.cpp"],
    hdrs = ["src/stdio/vsnprintf.h"],
    deps = [
        ":__support_arg_list",
        ":errno",
        ":printf_main",
        ":printf_writer",
    ],
)

libc_function(
    name = "vprintf",
    srcs = ["src/stdio/generic/vprintf.cpp"],
    hdrs = ["src/stdio/vprintf.h"],
    deps = [
        ":__support_arg_list",
        ":__support_file_file",
        ":errno",
        ":types_FILE",
        ":vfprintf_internal",
    ],
)

libc_function(
    name = "vfprintf",
    srcs = ["src/stdio/generic/vfprintf.cpp"],
    hdrs = ["src/stdio/vfprintf.h"],
    deps = [
        ":__support_arg_list",
        ":__support_file_file",
        ":errno",
        ":types_FILE",
        ":vfprintf_internal",
    ],
)

libc_function(
    name = "remove",
    srcs = ["src/stdio/linux/remove.cpp"],
    hdrs = ["src/stdio/remove.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
        ":hdr_stdio_overlay",
        ":types_FILE",
    ],
)

libc_function(
    name = "rename",
    srcs = ["src/stdio/linux/rename.cpp"],
    hdrs = ["src/stdio/rename.h"],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
        ":llvm_libc_macros_fcntl_macros",
    ],
)

############################### sys/stat targets ###############################

libc_function(
    name = "mkdir",
    srcs = ["src/sys/stat/linux/mkdir.cpp"],
    hdrs = ["src/sys/stat/mkdir.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "mkdirat",
    srcs = ["src/sys/stat/linux/mkdirat.cpp"],
    hdrs = ["src/sys/stat/mkdirat.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

############################## sys/socket targets ##############################

libc_function(
    name = "socket",
    srcs = ["src/sys/socket/linux/socket.cpp"],
    hdrs = ["src/sys/socket/socket.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "socketpair",
    srcs = ["src/sys/socket/linux/socketpair.cpp"],
    hdrs = ["src/sys/socket/socketpair.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "send",
    srcs = ["src/sys/socket/linux/send.cpp"],
    hdrs = ["src/sys/socket/send.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
        ":types_socklen_t",
        ":types_ssize_t",
        ":types_struct_sockaddr",
    ],
)

libc_function(
    name = "sendto",
    srcs = ["src/sys/socket/linux/sendto.cpp"],
    hdrs = ["src/sys/socket/sendto.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
        ":types_socklen_t",
        ":types_ssize_t",
        ":types_struct_sockaddr",
    ],
)

libc_function(
    name = "sendmsg",
    srcs = ["src/sys/socket/linux/sendmsg.cpp"],
    hdrs = ["src/sys/socket/sendmsg.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
        ":types_ssize_t",
        ":types_struct_msghdr",
    ],
)

libc_function(
    name = "recv",
    srcs = ["src/sys/socket/linux/recv.cpp"],
    hdrs = ["src/sys/socket/recv.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
        ":types_socklen_t",
        ":types_ssize_t",
        ":types_struct_sockaddr",
    ],
)

libc_function(
    name = "recvfrom",
    srcs = ["src/sys/socket/linux/recvfrom.cpp"],
    hdrs = ["src/sys/socket/recvfrom.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
        ":types_socklen_t",
        ":types_ssize_t",
        ":types_struct_sockaddr",
    ],
)

libc_function(
    name = "recvmsg",
    srcs = ["src/sys/socket/linux/recvmsg.cpp"],
    hdrs = ["src/sys/socket/recvmsg.h"],
    deps = [
        ":__support_common",
        ":__support_osutil_syscall",
        ":errno",
        ":types_ssize_t",
        ":types_struct_msghdr",
    ],
)

############################## sys/epoll targets ###############################

libc_function(
    name = "epoll_create",
    srcs = ["src/sys/epoll/linux/epoll_create.cpp"],
    hdrs = ["src/sys/epoll/epoll_create.h"],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    weak = True,
    deps = [
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "epoll_create1",
    srcs = ["src/sys/epoll/linux/epoll_create1.cpp"],
    hdrs = ["src/sys/epoll/epoll_create1.h"],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    weak = True,
    deps = [
        ":__support_osutil_syscall",
        ":errno",
    ],
)

libc_function(
    name = "epoll_ctl",
    srcs = ["src/sys/epoll/linux/epoll_ctl.cpp"],
    hdrs = ["src/sys/epoll/epoll_ctl.h"],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    weak = True,
    deps = [
        ":__support_osutil_syscall",
        ":errno",
        ":hdr_sys_epoll_macros",
        ":types_struct_epoll_event",
    ],
)

libc_function(
    name = "epoll_wait",
    srcs = ["src/sys/epoll/linux/epoll_wait.cpp"],
    hdrs = ["src/sys/epoll/epoll_wait.h"],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    weak = True,
    deps = [
        ":__support_macros_sanitizer",
        ":__support_osutil_syscall",
        ":errno",
        ":hdr_signal_macros",
        ":hdr_sys_epoll_macros",
        ":types_sigset_t",
        ":types_struct_epoll_event",
    ],
)

libc_function(
    name = "epoll_pwait",
    srcs = ["src/sys/epoll/linux/epoll_pwait.cpp"],
    hdrs = ["src/sys/epoll/epoll_pwait.h"],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    weak = True,
    deps = [
        ":__support_macros_sanitizer",
        ":__support_osutil_syscall",
        ":errno",
        ":hdr_signal_macros",
        ":hdr_sys_epoll_macros",
        ":types_sigset_t",
        ":types_struct_epoll_event",
    ],
)

libc_function(
    name = "epoll_pwait2",
    srcs = ["src/sys/epoll/linux/epoll_pwait2.cpp"],
    hdrs = ["src/sys/epoll/epoll_pwait2.h"],
    target_compatible_with = select({
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
    weak = True,
    deps = [
        ":__support_macros_sanitizer",
        ":__support_osutil_syscall",
        ":errno",
        ":hdr_signal_macros",
        ":hdr_sys_epoll_macros",
        ":types_sigset_t",
        ":types_struct_epoll_event",
        ":types_struct_timespec",
    ],
)