From 92ed0c7ffd628ae2ffdaaeabd7e2937f9c57263f Mon Sep 17 00:00:00 2001 From: Kewen Meng Date: Tue, 4 Nov 2025 20:53:26 -0600 Subject: [PATCH] Revert commit d8e5698 and 15b19c7 --- libc/src/stdio/CMakeLists.txt | 24 --------- libc/src/stdio/asprintf.cpp | 18 +------ libc/src/stdio/baremetal/CMakeLists.txt | 8 --- libc/src/stdio/baremetal/printf.cpp | 23 ++------ libc/src/stdio/baremetal/vprintf.cpp | 23 ++------ libc/src/stdio/generic/CMakeLists.txt | 4 -- libc/src/stdio/generic/fprintf.cpp | 17 +----- libc/src/stdio/generic/printf.cpp | 17 +----- libc/src/stdio/generic/vfprintf.cpp | 17 +----- libc/src/stdio/generic/vprintf.cpp | 17 +----- libc/src/stdio/printf_core/CMakeLists.txt | 25 --------- libc/src/stdio/printf_core/core_structs.h | 19 +++---- libc/src/stdio/printf_core/error_mapper.h | 21 -------- .../stdio/printf_core/generic/CMakeLists.txt | 8 --- .../stdio/printf_core/generic/error_mapper.h | 49 ----------------- .../stdio/printf_core/linux/CMakeLists.txt | 8 --- .../stdio/printf_core/linux/error_mapper.h | 54 ------------------- libc/src/stdio/printf_core/printf_main.h | 9 ++-- .../stdio/printf_core/vasprintf_internal.h | 20 ++++--- .../src/stdio/printf_core/vfprintf_internal.h | 41 +++++--------- .../stdio/printf_core/write_int_converter.h | 4 +- libc/src/stdio/printf_core/writer.h | 8 +-- libc/src/stdio/snprintf.cpp | 19 +------ libc/src/stdio/sprintf.cpp | 18 +------ libc/src/stdio/vasprintf.cpp | 16 +----- libc/src/stdio/vsnprintf.cpp | 19 +------ libc/src/stdio/vsprintf.cpp | 17 +----- libc/src/stdlib/CMakeLists.txt | 6 --- libc/src/stdlib/strfromd.cpp | 11 +--- libc/src/stdlib/strfromf.cpp | 11 +--- libc/src/stdlib/strfroml.cpp | 11 +--- libc/src/time/strftime_core/strftime_main.h | 3 +- libc/test/src/stdio/CMakeLists.txt | 2 - libc/test/src/stdio/fprintf_test.cpp | 24 --------- .../src/stdio/printf_core/converter_test.cpp | 30 +++++------ .../src/stdio/printf_core/writer_test.cpp | 32 +++++------ libc/test/src/stdio/snprintf_test.cpp | 15 ------ libc/test/src/stdio/vfprintf_test.cpp | 5 -- libc/test/src/stdlib/StrfromTest.h | 19 +------ 39 files changed, 104 insertions(+), 588 deletions(-) delete mode 100644 libc/src/stdio/printf_core/error_mapper.h delete mode 100644 libc/src/stdio/printf_core/generic/CMakeLists.txt delete mode 100644 libc/src/stdio/printf_core/generic/error_mapper.h delete mode 100644 libc/src/stdio/printf_core/linux/CMakeLists.txt delete mode 100644 libc/src/stdio/printf_core/linux/error_mapper.h diff --git a/libc/src/stdio/CMakeLists.txt b/libc/src/stdio/CMakeLists.txt index c75c8b11be2b5..b0a6ef1e291b5 100644 --- a/libc/src/stdio/CMakeLists.txt +++ b/libc/src/stdio/CMakeLists.txt @@ -125,10 +125,6 @@ add_entrypoint_object( DEPENDS libc.src.stdio.printf_core.printf_main libc.src.stdio.printf_core.writer - libc.src.stdio.printf_core.core_structs - libc.src.stdio.printf_core.error_mapper - libc.src.__support.libc_errno - libc.src.__support.CPP.limits ) add_entrypoint_object( @@ -140,10 +136,6 @@ add_entrypoint_object( DEPENDS libc.src.stdio.printf_core.printf_main libc.src.stdio.printf_core.writer - libc.src.stdio.printf_core.core_structs - libc.src.stdio.printf_core.error_mapper - libc.src.__support.libc_errno - libc.src.__support.CPP.limits ) add_entrypoint_object( @@ -154,10 +146,6 @@ add_entrypoint_object( asprintf.h DEPENDS libc.src.stdio.printf_core.vasprintf_internal - libc.src.stdio.printf_core.core_structs - libc.src.stdio.printf_core.error_mapper - libc.src.__support.libc_errno - libc.src.__support.CPP.limits ) add_entrypoint_object( @@ -169,10 +157,6 @@ add_entrypoint_object( DEPENDS libc.src.stdio.printf_core.printf_main libc.src.stdio.printf_core.writer - libc.src.stdio.printf_core.core_structs - libc.src.stdio.printf_core.error_mapper - libc.src.__support.libc_errno - libc.src.__support.CPP.limits ) add_entrypoint_object( @@ -184,10 +168,6 @@ add_entrypoint_object( DEPENDS libc.src.stdio.printf_core.printf_main libc.src.stdio.printf_core.writer - libc.src.stdio.printf_core.core_structs - libc.src.stdio.printf_core.error_mapper - libc.src.__support.libc_errno - libc.src.__support.CPP.limits ) add_entrypoint_object( @@ -198,10 +178,6 @@ add_entrypoint_object( vasprintf.h DEPENDS libc.src.stdio.printf_core.vasprintf_internal - libc.src.stdio.printf_core.core_structs - libc.src.stdio.printf_core.error_mapper - libc.src.__support.libc_errno - libc.src.__support.CPP.limits ) add_subdirectory(printf_core) diff --git a/libc/src/stdio/asprintf.cpp b/libc/src/stdio/asprintf.cpp index 0991dfca6a059..f8cfb74ce48ea 100644 --- a/libc/src/stdio/asprintf.cpp +++ b/libc/src/stdio/asprintf.cpp @@ -7,12 +7,8 @@ //===----------------------------------------------------------------------===// #include "src/stdio/asprintf.h" -#include "src/__support/CPP/limits.h" #include "src/__support/arg_list.h" -#include "src/__support/libc_errno.h" #include "src/__support/macros/config.h" -#include "src/stdio/printf_core/core_structs.h" -#include "src/stdio/printf_core/error_mapper.h" #include "src/stdio/printf_core/vasprintf_internal.h" namespace LIBC_NAMESPACE_DECL { @@ -26,18 +22,8 @@ LLVM_LIBC_FUNCTION(int, asprintf, // and pointer semantics, as well as handling // destruction automatically. va_end(vlist); - auto ret_val = printf_core::vasprintf_internal(buffer, format, args); - if (!ret_val.has_value()) { - libc_errno = printf_core::internal_error_to_errno(ret_val.error()); - return -1; - } - if (ret_val.value() > static_cast(cpp::numeric_limits::max())) { - libc_errno = - printf_core::internal_error_to_errno(-printf_core::OVERFLOW_ERROR); - return -1; - } - - return static_cast(ret_val.value()); + int ret = printf_core::vasprintf_internal(buffer, format, args); + return ret; } } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/stdio/baremetal/CMakeLists.txt b/libc/src/stdio/baremetal/CMakeLists.txt index bfeff0e2b5880..548938f885c94 100644 --- a/libc/src/stdio/baremetal/CMakeLists.txt +++ b/libc/src/stdio/baremetal/CMakeLists.txt @@ -29,12 +29,8 @@ add_entrypoint_object( DEPENDS libc.src.stdio.printf_core.printf_main libc.src.stdio.printf_core.writer - libc.src.stdio.printf_core.error_mapper - libc.src.stdio.printf_core.core_structs libc.src.__support.arg_list libc.src.__support.OSUtil.osutil - libc.src.__support.libc_errno - libc.src.__support.CPP.limits ) add_entrypoint_object( @@ -91,12 +87,8 @@ add_entrypoint_object( DEPENDS libc.src.stdio.printf_core.printf_main libc.src.stdio.printf_core.writer - libc.src.stdio.printf_core.error_mapper - libc.src.stdio.printf_core.core_structs libc.src.__support.arg_list libc.src.__support.OSUtil.osutil - libc.src.__support.libc_errno - libc.src.__support.CPP.limits ) add_entrypoint_object( diff --git a/libc/src/stdio/baremetal/printf.cpp b/libc/src/stdio/baremetal/printf.cpp index 5a9b19ff20471..7253c6549a4e4 100644 --- a/libc/src/stdio/baremetal/printf.cpp +++ b/libc/src/stdio/baremetal/printf.cpp @@ -7,13 +7,10 @@ //===----------------------------------------------------------------------===// #include "src/stdio/printf.h" -#include "src/__support/CPP/limits.h" #include "src/__support/OSUtil/io.h" #include "src/__support/arg_list.h" -#include "src/__support/libc_errno.h" #include "src/__support/macros/config.h" #include "src/stdio/printf_core/core_structs.h" -#include "src/stdio/printf_core/error_mapper.h" #include "src/stdio/printf_core/printf_main.h" #include "src/stdio/printf_core/writer.h" @@ -45,25 +42,13 @@ LLVM_LIBC_FUNCTION(int, printf, (const char *__restrict format, ...)) { buffer, BUFF_SIZE, &stdout_write_hook, nullptr); printf_core::Writer writer(wb); - auto retval = printf_core::printf_main(&writer, format, args); - if (!retval.has_value()) { - libc_errno = printf_core::internal_error_to_errno(retval.error()); - return -1; - } + int retval = printf_core::printf_main(&writer, format, args); int flushval = wb.overflow_write(""); - if (flushval != printf_core::WRITE_OK) { - libc_errno = printf_core::internal_error_to_errno(-flushval); - return -1; - } + if (flushval != printf_core::WRITE_OK) + retval = flushval; - if (retval.value() > static_cast(cpp::numeric_limits::max())) { - libc_errno = - printf_core::internal_error_to_errno(-printf_core::OVERFLOW_ERROR); - return -1; - } - - return static_cast(retval.value()); + return retval; } } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/stdio/baremetal/vprintf.cpp b/libc/src/stdio/baremetal/vprintf.cpp index c172b368d15f3..ab02533f14911 100644 --- a/libc/src/stdio/baremetal/vprintf.cpp +++ b/libc/src/stdio/baremetal/vprintf.cpp @@ -7,13 +7,10 @@ //===----------------------------------------------------------------------===// #include "src/stdio/vprintf.h" -#include "src/__support/CPP/limits.h" #include "src/__support/OSUtil/io.h" #include "src/__support/arg_list.h" -#include "src/__support/libc_errno.h" #include "src/__support/macros/config.h" #include "src/stdio/printf_core/core_structs.h" -#include "src/stdio/printf_core/error_mapper.h" #include "src/stdio/printf_core/printf_main.h" #include "src/stdio/printf_core/writer.h" @@ -43,25 +40,13 @@ LLVM_LIBC_FUNCTION(int, vprintf, buffer, BUFF_SIZE, &stdout_write_hook, nullptr); printf_core::Writer writer(wb); - auto retval = printf_core::printf_main(&writer, format, args); - if (!retval.has_value()) { - libc_errno = printf_core::internal_error_to_errno(retval.error()); - return -1; - } + int retval = printf_core::printf_main(&writer, format, args); int flushval = wb.overflow_write(""); - if (flushval != printf_core::WRITE_OK) { - libc_errno = printf_core::internal_error_to_errno(-flushval); - return -1; - } + if (flushval != printf_core::WRITE_OK) + retval = flushval; - if (retval.value() > static_cast(cpp::numeric_limits::max())) { - libc_errno = - printf_core::internal_error_to_errno(-printf_core::OVERFLOW_ERROR); - return -1; - } - - return static_cast(retval.value()); + return retval; } } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/stdio/generic/CMakeLists.txt b/libc/src/stdio/generic/CMakeLists.txt index 71055edea3d9e..6361822b61999 100644 --- a/libc/src/stdio/generic/CMakeLists.txt +++ b/libc/src/stdio/generic/CMakeLists.txt @@ -393,11 +393,7 @@ add_generic_entrypoint_object( list(APPEND fprintf_deps libc.hdr.types.FILE libc.src.__support.arg_list - libc.src.__support.CPP.limits - libc.src.__support.libc_errno libc.src.stdio.printf_core.vfprintf_internal - libc.src.stdio.printf_core.core_structs - libc.src.stdio.printf_core.error_mapper ) if(LLVM_LIBC_FULL_BUILD) diff --git a/libc/src/stdio/generic/fprintf.cpp b/libc/src/stdio/generic/fprintf.cpp index b2033901557a0..087aeadfc52c5 100644 --- a/libc/src/stdio/generic/fprintf.cpp +++ b/libc/src/stdio/generic/fprintf.cpp @@ -8,12 +8,9 @@ #include "src/stdio/fprintf.h" -#include "src/__support/CPP/limits.h" #include "src/__support/File/file.h" #include "src/__support/arg_list.h" #include "src/__support/macros/config.h" -#include "src/stdio/printf_core/core_structs.h" -#include "src/stdio/printf_core/error_mapper.h" #include "src/stdio/printf_core/vfprintf_internal.h" #include "hdr/types/FILE.h" @@ -30,18 +27,8 @@ LLVM_LIBC_FUNCTION(int, fprintf, // and pointer semantics, as well as handling // destruction automatically. va_end(vlist); - auto ret_val = printf_core::vfprintf_internal(stream, format, args); - if (!ret_val.has_value()) { - libc_errno = printf_core::internal_error_to_errno(ret_val.error()); - return -1; - } - if (ret_val.value() > static_cast(cpp::numeric_limits::max())) { - libc_errno = - printf_core::internal_error_to_errno(-printf_core::OVERFLOW_ERROR); - return -1; - } - - return static_cast(ret_val.value()); + int ret_val = printf_core::vfprintf_internal(stream, format, args); + return ret_val; } } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/stdio/generic/printf.cpp b/libc/src/stdio/generic/printf.cpp index 8d159d5c70870..bb7c7c86f843f 100644 --- a/libc/src/stdio/generic/printf.cpp +++ b/libc/src/stdio/generic/printf.cpp @@ -8,12 +8,9 @@ #include "src/stdio/printf.h" -#include "src/__support/CPP/limits.h" #include "src/__support/File/file.h" #include "src/__support/arg_list.h" #include "src/__support/macros/config.h" -#include "src/stdio/printf_core/core_structs.h" -#include "src/stdio/printf_core/error_mapper.h" #include "src/stdio/printf_core/vfprintf_internal.h" #include "hdr/types/FILE.h" @@ -34,19 +31,9 @@ LLVM_LIBC_FUNCTION(int, printf, (const char *__restrict format, ...)) { // and pointer semantics, as well as handling // destruction automatically. va_end(vlist); - auto ret_val = printf_core::vfprintf_internal( + int ret_val = printf_core::vfprintf_internal( reinterpret_cast<::FILE *>(PRINTF_STDOUT), format, args); - if (!ret_val.has_value()) { - libc_errno = printf_core::internal_error_to_errno(ret_val.error()); - return -1; - } - if (ret_val.value() > static_cast(cpp::numeric_limits::max())) { - libc_errno = - printf_core::internal_error_to_errno(-printf_core::OVERFLOW_ERROR); - return -1; - } - - return static_cast(ret_val.value()); + return ret_val; } } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/stdio/generic/vfprintf.cpp b/libc/src/stdio/generic/vfprintf.cpp index a26f082ed9347..01f4265f118a6 100644 --- a/libc/src/stdio/generic/vfprintf.cpp +++ b/libc/src/stdio/generic/vfprintf.cpp @@ -8,12 +8,9 @@ #include "src/stdio/vfprintf.h" -#include "src/__support/CPP/limits.h" #include "src/__support/File/file.h" #include "src/__support/arg_list.h" #include "src/__support/macros/config.h" -#include "src/stdio/printf_core/core_structs.h" -#include "src/stdio/printf_core/error_mapper.h" #include "src/stdio/printf_core/vfprintf_internal.h" #include "hdr/types/FILE.h" @@ -27,18 +24,8 @@ LLVM_LIBC_FUNCTION(int, vfprintf, internal::ArgList args(vlist); // This holder class allows for easier copying // and pointer semantics, as well as handling // destruction automatically. - auto ret_val = printf_core::vfprintf_internal(stream, format, args); - if (!ret_val.has_value()) { - libc_errno = printf_core::internal_error_to_errno(ret_val.error()); - return -1; - } - if (ret_val.value() > static_cast(cpp::numeric_limits::max())) { - libc_errno = - printf_core::internal_error_to_errno(-printf_core::OVERFLOW_ERROR); - return -1; - } - - return static_cast(ret_val.value()); + int ret_val = printf_core::vfprintf_internal(stream, format, args); + return ret_val; } } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/stdio/generic/vprintf.cpp b/libc/src/stdio/generic/vprintf.cpp index ae2160219f2bb..08d71515646ed 100644 --- a/libc/src/stdio/generic/vprintf.cpp +++ b/libc/src/stdio/generic/vprintf.cpp @@ -8,12 +8,9 @@ #include "src/stdio/vprintf.h" -#include "src/__support/CPP/limits.h" #include "src/__support/File/file.h" #include "src/__support/arg_list.h" #include "src/__support/macros/config.h" -#include "src/stdio/printf_core/core_structs.h" -#include "src/stdio/printf_core/error_mapper.h" #include "src/stdio/printf_core/vfprintf_internal.h" #include "hdr/types/FILE.h" @@ -32,19 +29,9 @@ LLVM_LIBC_FUNCTION(int, vprintf, internal::ArgList args(vlist); // This holder class allows for easier copying // and pointer semantics, as well as handling // destruction automatically. - auto ret_val = printf_core::vfprintf_internal( + int ret_val = printf_core::vfprintf_internal( reinterpret_cast<::FILE *>(PRINTF_STDOUT), format, args); - if (!ret_val.has_value()) { - libc_errno = printf_core::internal_error_to_errno(ret_val.error()); - return -1; - } - if (ret_val.value() > static_cast(cpp::numeric_limits::max())) { - libc_errno = - printf_core::internal_error_to_errno(-printf_core::OVERFLOW_ERROR); - return -1; - } - - return static_cast(ret_val.value()); + return ret_val; } } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/stdio/printf_core/CMakeLists.txt b/libc/src/stdio/printf_core/CMakeLists.txt index 624129b2b36e7..ee66145e60156 100644 --- a/libc/src/stdio/printf_core/CMakeLists.txt +++ b/libc/src/stdio/printf_core/CMakeLists.txt @@ -32,17 +32,6 @@ if(printf_config_copts) list(PREPEND printf_config_copts "COMPILE_OPTIONS") endif() -if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS}) - add_subdirectory(${LIBC_TARGET_OS}) -else() - add_subdirectory(generic) -endif() - -set(target_error_mapper libc.src.stdio.printf_core.${LIBC_TARGET_OS}.error_mapper) -if(NOT TARGET ${target_error_mapper}) - set(target_error_mapper libc.src.stdio.printf_core.generic.error_mapper) -endif() - add_header_library( printf_config HDRS @@ -58,7 +47,6 @@ add_header_library( libc.include.inttypes libc.src.__support.CPP.string_view libc.src.__support.FPUtil.fp_bits - libc.hdr.errno_macros ) add_header_library( @@ -137,7 +125,6 @@ add_header_library( .writer .core_structs libc.src.__support.arg_list - libc.src.__support.error_or ) add_header_library( @@ -149,20 +136,10 @@ add_header_library( libc.hdr.func.free libc.hdr.func.realloc libc.src.__support.arg_list - libc.src.__support.error_or libc.src.stdio.printf_core.printf_main libc.src.stdio.printf_core.writer ) -add_header_library( - error_mapper - HDRS - error_mapper.h - DEPENDS - ${target_error_mapper} - libc.src.__support.macros.properties.architectures -) - if(NOT (TARGET libc.src.__support.File.file) AND LLVM_LIBC_FULL_BUILD) # Not all platforms have a file implementation. If file is unvailable, and a # full build is requested, then we must skip all file based printf sections. @@ -175,10 +152,8 @@ add_header_library( vfprintf_internal.h DEPENDS libc.src.__support.File.file - libc.src.__support.error_or libc.src.__support.arg_list libc.src.stdio.printf_core.printf_main libc.src.stdio.printf_core.writer ${use_system_file} ) - diff --git a/libc/src/stdio/printf_core/core_structs.h b/libc/src/stdio/printf_core/core_structs.h index 0d41f2244d8da..e27f77b6b594a 100644 --- a/libc/src/stdio/printf_core/core_structs.h +++ b/libc/src/stdio/printf_core/core_structs.h @@ -132,17 +132,14 @@ template LIBC_INLINE constexpr TypeDesc type_desc_from_type() { // This is the value to be returned by conversions when no error has occurred. constexpr int WRITE_OK = 0; -// These are the error return values used by the printf engine when an -// error has occurred. They are all large negative, distinct values starting -// from -1000 to not overlap with system errors. -constexpr int FILE_WRITE_ERROR = -1001; -constexpr int FILE_STATUS_ERROR = -1002; -constexpr int NULLPTR_WRITE_ERROR = -1003; -constexpr int INT_CONVERSION_ERROR = -1004; -constexpr int FIXED_POINT_CONVERSION_ERROR = -1005; -constexpr int ALLOCATION_ERROR = -1006; -constexpr int OVERFLOW_ERROR = -1007; - +// These are the printf return values for when an error has occurred. They are +// all negative, and should be distinct. +constexpr int FILE_WRITE_ERROR = -1; +constexpr int FILE_STATUS_ERROR = -2; +constexpr int NULLPTR_WRITE_ERROR = -3; +constexpr int INT_CONVERSION_ERROR = -4; +constexpr int FIXED_POINT_CONVERSION_ERROR = -5; +constexpr int ALLOCATION_ERROR = -6; } // namespace printf_core } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/stdio/printf_core/error_mapper.h b/libc/src/stdio/printf_core/error_mapper.h deleted file mode 100644 index 23030930133a1..0000000000000 --- a/libc/src/stdio/printf_core/error_mapper.h +++ /dev/null @@ -1,21 +0,0 @@ -//===-- Error mapper for printf ---------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_LIBC_SRC_STDIO_PRINTF_CORE_ERROR_MAPPER_H -#define LLVM_LIBC_SRC_STDIO_PRINTF_CORE_ERROR_MAPPER_H - -#include "src/__support/macros/properties/architectures.h" - -// Maps internal errors to the available errnos on the platform. -#if defined(__linux__) -#include "linux/error_mapper.h" -#else -#include "generic/error_mapper.h" -#endif - -#endif // LLVM_LIBC_SRC_STDIO_PRINTF_CORE_ERROR_MAPPER_H diff --git a/libc/src/stdio/printf_core/generic/CMakeLists.txt b/libc/src/stdio/printf_core/generic/CMakeLists.txt deleted file mode 100644 index 2f0143d992e31..0000000000000 --- a/libc/src/stdio/printf_core/generic/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -add_header_library( - error_mapper - HDRS - error_mapper.h - DEPENDS - libc.src.stdio.printf_core.core_structs - libc.hdr.errno_macros -) diff --git a/libc/src/stdio/printf_core/generic/error_mapper.h b/libc/src/stdio/printf_core/generic/error_mapper.h deleted file mode 100644 index d8cdd2cc2dbaa..0000000000000 --- a/libc/src/stdio/printf_core/generic/error_mapper.h +++ /dev/null @@ -1,49 +0,0 @@ -//===-- Generic implementation of error mapper ------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_LIBC_SRC_STDIO_PRINTF_CORE_GENERIC_ERROR_MAPPER_H -#define LLVM_LIBC_SRC_STDIO_PRINTF_CORE_GENERIC_ERROR_MAPPER_H - -#include "hdr/errno_macros.h" -#include "src/stdio/printf_core/core_structs.h" -#include "src/stdio/printf_core/error_mapper.h" - -namespace LIBC_NAMESPACE_DECL { -namespace printf_core { - -LIBC_INLINE static int internal_error_to_errno(int internal_error) { - // System error occured, return error as is. - if (internal_error < 1001 && internal_error > 0) { - return internal_error; - } - - // Map internal error to the available C standard errnos. - switch (-internal_error) { - case WRITE_OK: - return 0; - case FILE_WRITE_ERROR: - case FILE_STATUS_ERROR: - case NULLPTR_WRITE_ERROR: - case ALLOCATION_ERROR: - return EDOM; - case INT_CONVERSION_ERROR: - case FIXED_POINT_CONVERSION_ERROR: - case OVERFLOW_ERROR: - return ERANGE; - default: - LIBC_ASSERT( - false && - "Invalid internal printf error code passed to internal_error_to_errno"); - return EDOM; - } -} - -} // namespace printf_core -} // namespace LIBC_NAMESPACE_DECL - -#endif // LLVM_LIBC_SRC_STDIO_PRINTF_CORE_GENERIC_ERROR_MAPPER_H diff --git a/libc/src/stdio/printf_core/linux/CMakeLists.txt b/libc/src/stdio/printf_core/linux/CMakeLists.txt deleted file mode 100644 index 2f0143d992e31..0000000000000 --- a/libc/src/stdio/printf_core/linux/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -add_header_library( - error_mapper - HDRS - error_mapper.h - DEPENDS - libc.src.stdio.printf_core.core_structs - libc.hdr.errno_macros -) diff --git a/libc/src/stdio/printf_core/linux/error_mapper.h b/libc/src/stdio/printf_core/linux/error_mapper.h deleted file mode 100644 index 3c2fe663072d0..0000000000000 --- a/libc/src/stdio/printf_core/linux/error_mapper.h +++ /dev/null @@ -1,54 +0,0 @@ -//===-- Linux implementation of error mapper --------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_LIBC_SRC_STDIO_PRINTF_CORE_LINUX_ERROR_MAPPER_H -#define LLVM_LIBC_SRC_STDIO_PRINTF_CORE_LINUX_ERROR_MAPPER_H - -#include "hdr/errno_macros.h" -#include "src/stdio/printf_core/core_structs.h" -#include "src/stdio/printf_core/error_mapper.h" - -namespace LIBC_NAMESPACE_DECL { -namespace printf_core { - -LIBC_INLINE static int internal_error_to_errno(int internal_error) { - // System error occured, return error as is. - if (internal_error < 1001 && internal_error > 0) { - return internal_error; - } - - // Map internal error to POSIX errnos. - switch (-internal_error) { - case WRITE_OK: - return 0; - case FILE_WRITE_ERROR: - return EIO; - case FILE_STATUS_ERROR: - return EIO; - case NULLPTR_WRITE_ERROR: - return EINVAL; - case INT_CONVERSION_ERROR: - return ERANGE; - case FIXED_POINT_CONVERSION_ERROR: - return EINVAL; - case ALLOCATION_ERROR: - return ENOMEM; - case OVERFLOW_ERROR: - return EOVERFLOW; - default: - LIBC_ASSERT( - false && - "Invalid internal printf error code passed to internal_error_to_errno"); - return EINVAL; - } -} - -} // namespace printf_core -} // namespace LIBC_NAMESPACE_DECL - -#endif // LLVM_LIBC_SRC_STDIO_PRINTF_CORE_LINUX_ERROR_MAPPER_H diff --git a/libc/src/stdio/printf_core/printf_main.h b/libc/src/stdio/printf_core/printf_main.h index 1c7a7237c097d..57f29858d5298 100644 --- a/libc/src/stdio/printf_core/printf_main.h +++ b/libc/src/stdio/printf_core/printf_main.h @@ -10,7 +10,6 @@ #define LLVM_LIBC_SRC_STDIO_PRINTF_CORE_PRINTF_MAIN_H #include "src/__support/arg_list.h" -#include "src/__support/error_or.h" #include "src/__support/macros/config.h" #include "src/stdio/printf_core/converter.h" #include "src/stdio/printf_core/core_structs.h" @@ -23,9 +22,8 @@ namespace LIBC_NAMESPACE_DECL { namespace printf_core { template -ErrorOr printf_main(Writer *writer, - const char *__restrict str, - internal::ArgList &args) { +int printf_main(Writer *writer, const char *__restrict str, + internal::ArgList &args) { Parser parser(str, args); int result = 0; for (FormatSection cur_section = parser.get_next_section(); @@ -35,8 +33,9 @@ ErrorOr printf_main(Writer *writer, result = convert(writer, cur_section); else result = writer->write(cur_section.raw_string); + if (result < 0) - return Error(-result); + return result; } return writer->get_chars_written(); diff --git a/libc/src/stdio/printf_core/vasprintf_internal.h b/libc/src/stdio/printf_core/vasprintf_internal.h index 41df17b67f35b..283d8df2810fb 100644 --- a/libc/src/stdio/printf_core/vasprintf_internal.h +++ b/libc/src/stdio/printf_core/vasprintf_internal.h @@ -10,7 +10,6 @@ #include "hdr/func/malloc.h" #include "hdr/func/realloc.h" #include "src/__support/arg_list.h" -#include "src/__support/error_or.h" #include "src/stdio/printf_core/core_structs.h" #include "src/stdio/printf_core/printf_main.h" #include "src/stdio/printf_core/writer.h" @@ -30,7 +29,7 @@ LIBC_INLINE int resize_overflow_hook(cpp::string_view new_str, void *target) { if (new_buff == nullptr) { if (wb->buff != wb->init_buff) free(wb->buff); - return ALLOCATION_ERROR; + return printf_core::ALLOCATION_ERROR; } if (isBuffOnStack) inline_memcpy(new_buff, wb->buff, wb->buff_cur); @@ -43,28 +42,27 @@ LIBC_INLINE int resize_overflow_hook(cpp::string_view new_str, void *target) { constexpr size_t DEFAULT_BUFFER_SIZE = 200; -LIBC_INLINE ErrorOr vasprintf_internal(char **ret, - const char *__restrict format, - internal::ArgList args) { +LIBC_INLINE int vasprintf_internal(char **ret, const char *__restrict format, + internal::ArgList args) { char init_buff_on_stack[DEFAULT_BUFFER_SIZE]; printf_core::WriteBuffer::value> wb( init_buff_on_stack, DEFAULT_BUFFER_SIZE, resize_overflow_hook); printf_core::Writer writer(wb); auto ret_val = printf_core::printf_main(&writer, format, args); - if (!ret_val.has_value()) { + if (ret_val < 0) { *ret = nullptr; - return ret_val; + return -1; } if (wb.buff == init_buff_on_stack) { - *ret = static_cast(malloc(ret_val.value() + 1)); + *ret = static_cast(malloc(ret_val + 1)); if (ret == nullptr) - return Error(ALLOCATION_ERROR); - inline_memcpy(*ret, wb.buff, ret_val.value()); + return printf_core::ALLOCATION_ERROR; + inline_memcpy(*ret, wb.buff, ret_val); } else { *ret = wb.buff; } - (*ret)[ret_val.value()] = '\0'; + (*ret)[ret_val] = '\0'; return ret_val; } } // namespace printf_core diff --git a/libc/src/stdio/printf_core/vfprintf_internal.h b/libc/src/stdio/printf_core/vfprintf_internal.h index 564441d3bf51a..630de9d9d43dd 100644 --- a/libc/src/stdio/printf_core/vfprintf_internal.h +++ b/libc/src/stdio/printf_core/vfprintf_internal.h @@ -11,7 +11,6 @@ #include "src/__support/File/file.h" #include "src/__support/arg_list.h" -#include "src/__support/error_or.h" #include "src/__support/macros/attributes.h" // For LIBC_INLINE #include "src/__support/macros/config.h" #include "src/stdio/printf_core/core_structs.h" @@ -36,8 +35,8 @@ LIBC_INLINE void funlockfile(FILE *f) { reinterpret_cast(f)->unlock(); } -LIBC_INLINE FileIOResult fwrite_unlocked(const void *ptr, size_t size, - size_t nmemb, FILE *f) { +LIBC_INLINE size_t fwrite_unlocked(const void *ptr, size_t size, size_t nmemb, + FILE *f) { return reinterpret_cast(f)->write_unlocked( ptr, size * nmemb); } @@ -48,11 +47,9 @@ LIBC_INLINE void flockfile(::FILE *f) { ::flockfile(f); } LIBC_INLINE void funlockfile(::FILE *f) { ::funlockfile(f); } -LIBC_INLINE FileIOResult fwrite_unlocked(const void *ptr, size_t size, - size_t nmemb, ::FILE *f) { - // Need to use system errno in this case, as system write will set this errno - // which we need to propagate back into our code. - return {::fwrite_unlocked(ptr, size, nmemb, f), errno}; +LIBC_INLINE size_t fwrite_unlocked(const void *ptr, size_t size, size_t nmemb, + ::FILE *f) { + return ::fwrite_unlocked(ptr, size, nmemb, f); } #endif // LIBC_COPT_STDIO_USE_SYSTEM_FILE } // namespace internal @@ -63,38 +60,26 @@ LIBC_INLINE int file_write_hook(cpp::string_view new_str, void *fp) { ::FILE *target_file = reinterpret_cast<::FILE *>(fp); // Write new_str to the target file. The logic preventing a zero-length write // is in the writer, so we don't check here. - auto write_result = internal::fwrite_unlocked(new_str.data(), sizeof(char), - new_str.size(), target_file); - // Propagate actual system error in FileIOResult. - if (write_result.has_error()) - return -write_result.error; - - // In case short write occured or error was not set on FileIOResult for some - // reason. - if (write_result.value != new_str.size() || - internal::ferror_unlocked(target_file)) + size_t written = internal::fwrite_unlocked(new_str.data(), sizeof(char), + new_str.size(), target_file); + if (written != new_str.size() || internal::ferror_unlocked(target_file)) return FILE_WRITE_ERROR; - return WRITE_OK; } -LIBC_INLINE ErrorOr vfprintf_internal(::FILE *__restrict stream, - const char *__restrict format, - internal::ArgList &args) { +LIBC_INLINE int vfprintf_internal(::FILE *__restrict stream, + const char *__restrict format, + internal::ArgList &args) { constexpr size_t BUFF_SIZE = 1024; char buffer[BUFF_SIZE]; printf_core::WriteBuffer::value> wb( buffer, BUFF_SIZE, &file_write_hook, reinterpret_cast(stream)); Writer writer(wb); internal::flockfile(stream); - auto retval = printf_main(&writer, format, args); - if (!retval.has_value()) { - internal::funlockfile(stream); - return retval; - } + int retval = printf_main(&writer, format, args); int flushval = wb.overflow_write(""); if (flushval != WRITE_OK) - retval = Error(-flushval); + retval = flushval; internal::funlockfile(stream); return retval; } diff --git a/libc/src/stdio/printf_core/write_int_converter.h b/libc/src/stdio/printf_core/write_int_converter.h index 04b2bef05bc7b..efcff278bd284 100644 --- a/libc/src/stdio/printf_core/write_int_converter.h +++ b/libc/src/stdio/printf_core/write_int_converter.h @@ -29,11 +29,11 @@ LIBC_INLINE int convert_write_int(Writer *writer, return NULLPTR_WRITE_ERROR; #endif // LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS - size_t written = writer->get_chars_written(); + int written = writer->get_chars_written(); switch (to_conv.length_modifier) { case LengthModifier::none: - *reinterpret_cast(to_conv.conv_val_ptr) = static_cast(written); + *reinterpret_cast(to_conv.conv_val_ptr) = written; break; case LengthModifier::l: *reinterpret_cast(to_conv.conv_val_ptr) = written; diff --git a/libc/src/stdio/printf_core/writer.h b/libc/src/stdio/printf_core/writer.h index 9de108ece510f..1d4734a51b9b8 100644 --- a/libc/src/stdio/printf_core/writer.h +++ b/libc/src/stdio/printf_core/writer.h @@ -127,7 +127,7 @@ template struct WriteBuffer { template class Writer final { WriteBuffer &wb; - size_t chars_written = 0; + int chars_written = 0; LIBC_INLINE int pad(char new_char, size_t length) { // First, fill as much of the buffer as possible with the padding char. @@ -161,7 +161,7 @@ template class Writer final { // Takes a string, copies it into the buffer if there is space, else passes it // to the overflow mechanism to be handled separately. LIBC_INLINE int write(cpp::string_view new_string) { - chars_written += new_string.size(); + chars_written += static_cast(new_string.size()); if (LIBC_LIKELY(wb.buff_cur + new_string.size() <= wb.buff_len)) { inline_memcpy(wb.buff + wb.buff_cur, new_string.data(), new_string.size()); @@ -175,7 +175,7 @@ template class Writer final { // if there is space, else calls pad which will loop and call the overflow // mechanism on a secondary buffer. LIBC_INLINE int write(char new_char, size_t length) { - chars_written += length; + chars_written += static_cast(length); if (LIBC_LIKELY(wb.buff_cur + length <= wb.buff_len)) { inline_memset(wb.buff + wb.buff_cur, static_cast(new_char), @@ -199,7 +199,7 @@ template class Writer final { return wb.overflow_write(char_string_view); } - LIBC_INLINE size_t get_chars_written() { return chars_written; } + LIBC_INLINE int get_chars_written() { return chars_written; } }; // Class-template auto deduction helpers. diff --git a/libc/src/stdio/snprintf.cpp b/libc/src/stdio/snprintf.cpp index d95195f6f485f..c8940862f711f 100644 --- a/libc/src/stdio/snprintf.cpp +++ b/libc/src/stdio/snprintf.cpp @@ -8,12 +8,8 @@ #include "src/stdio/snprintf.h" -#include "src/__support/CPP/limits.h" #include "src/__support/arg_list.h" -#include "src/__support/libc_errno.h" #include "src/__support/macros/config.h" -#include "src/stdio/printf_core/core_structs.h" -#include "src/stdio/printf_core/error_mapper.h" #include "src/stdio/printf_core/printf_main.h" #include "src/stdio/printf_core/writer.h" @@ -36,21 +32,10 @@ LLVM_LIBC_FUNCTION(int, snprintf, wb(buffer, (buffsz > 0 ? buffsz - 1 : 0)); printf_core::Writer writer(wb); - auto ret_val = printf_core::printf_main(&writer, format, args); - if (!ret_val.has_value()) { - libc_errno = printf_core::internal_error_to_errno(ret_val.error()); - return -1; - } + int ret_val = printf_core::printf_main(&writer, format, args); if (buffsz > 0) // if the buffsz is 0 the buffer may be a null pointer. wb.buff[wb.buff_cur] = '\0'; - - if (ret_val.value() > static_cast(cpp::numeric_limits::max())) { - libc_errno = - printf_core::internal_error_to_errno(-printf_core::OVERFLOW_ERROR); - return -1; - } - - return static_cast(ret_val.value()); + return ret_val; } } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/stdio/sprintf.cpp b/libc/src/stdio/sprintf.cpp index 2a9b6ea7c5e50..7be97d3591aaf 100644 --- a/libc/src/stdio/sprintf.cpp +++ b/libc/src/stdio/sprintf.cpp @@ -10,10 +10,7 @@ #include "src/__support/CPP/limits.h" #include "src/__support/arg_list.h" -#include "src/__support/libc_errno.h" #include "src/__support/macros/config.h" -#include "src/stdio/printf_core/core_structs.h" -#include "src/stdio/printf_core/error_mapper.h" #include "src/stdio/printf_core/printf_main.h" #include "src/stdio/printf_core/writer.h" @@ -36,20 +33,9 @@ LLVM_LIBC_FUNCTION(int, sprintf, wb(buffer, cpp::numeric_limits::max()); printf_core::Writer writer(wb); - auto ret_val = printf_core::printf_main(&writer, format, args); - if (!ret_val.has_value()) { - libc_errno = printf_core::internal_error_to_errno(ret_val.error()); - return -1; - } + int ret_val = printf_core::printf_main(&writer, format, args); wb.buff[wb.buff_cur] = '\0'; - - if (ret_val.value() > static_cast(cpp::numeric_limits::max())) { - libc_errno = - printf_core::internal_error_to_errno(-printf_core::OVERFLOW_ERROR); - return -1; - } - - return static_cast(ret_val.value()); + return ret_val; } } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/stdio/vasprintf.cpp b/libc/src/stdio/vasprintf.cpp index bd77cd8864312..4a44d4a0f8842 100644 --- a/libc/src/stdio/vasprintf.cpp +++ b/libc/src/stdio/vasprintf.cpp @@ -7,11 +7,7 @@ //===----------------------------------------------------------------------===// #include "src/stdio/vasprintf.h" -#include "src/__support/CPP/limits.h" #include "src/__support/arg_list.h" -#include "src/__support/libc_errno.h" -#include "src/stdio/printf_core/core_structs.h" -#include "src/stdio/printf_core/error_mapper.h" #include "src/stdio/printf_core/vasprintf_internal.h" namespace LIBC_NAMESPACE_DECL { @@ -22,17 +18,7 @@ LLVM_LIBC_FUNCTION(int, vasprintf, internal::ArgList args(vlist); // This holder class allows for easier copying // and pointer semantics, as well as handling // destruction automatically. - auto ret_val = printf_core::vasprintf_internal(ret, format, args); - if (!ret_val.has_value()) { - libc_errno = printf_core::internal_error_to_errno(ret_val.error()); - return -1; - } - if (ret_val.value() > static_cast(cpp::numeric_limits::max())) { - libc_errno = - printf_core::internal_error_to_errno(-printf_core::OVERFLOW_ERROR); - return -1; - } - return static_cast(ret_val.value()); + return printf_core::vasprintf_internal(ret, format, args); } } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/stdio/vsnprintf.cpp b/libc/src/stdio/vsnprintf.cpp index 5d936360c0857..b07a2499a0dd3 100644 --- a/libc/src/stdio/vsnprintf.cpp +++ b/libc/src/stdio/vsnprintf.cpp @@ -8,12 +8,8 @@ #include "src/stdio/vsnprintf.h" -#include "src/__support/CPP/limits.h" #include "src/__support/arg_list.h" -#include "src/__support/libc_errno.h" #include "src/__support/macros/config.h" -#include "src/stdio/printf_core/core_structs.h" -#include "src/stdio/printf_core/error_mapper.h" #include "src/stdio/printf_core/printf_main.h" #include "src/stdio/printf_core/writer.h" @@ -33,21 +29,10 @@ LLVM_LIBC_FUNCTION(int, vsnprintf, wb(buffer, (buffsz > 0 ? buffsz - 1 : 0)); printf_core::Writer writer(wb); - auto ret_val = printf_core::printf_main(&writer, format, args); - if (!ret_val.has_value()) { - libc_errno = printf_core::internal_error_to_errno(ret_val.error()); - return -1; - } + int ret_val = printf_core::printf_main(&writer, format, args); if (buffsz > 0) // if the buffsz is 0 the buffer may be a null pointer. wb.buff[wb.buff_cur] = '\0'; - - if (ret_val.value() > static_cast(cpp::numeric_limits::max())) { - libc_errno = - printf_core::internal_error_to_errno(-printf_core::OVERFLOW_ERROR); - return -1; - } - - return static_cast(ret_val.value()); + return ret_val; } } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/stdio/vsprintf.cpp b/libc/src/stdio/vsprintf.cpp index f9cf8118534f6..26d497be42125 100644 --- a/libc/src/stdio/vsprintf.cpp +++ b/libc/src/stdio/vsprintf.cpp @@ -10,10 +10,7 @@ #include "src/__support/CPP/limits.h" #include "src/__support/arg_list.h" -#include "src/__support/libc_errno.h" #include "src/__support/macros/config.h" -#include "src/stdio/printf_core/core_structs.h" -#include "src/stdio/printf_core/error_mapper.h" #include "src/stdio/printf_core/printf_main.h" #include "src/stdio/printf_core/writer.h" @@ -33,19 +30,9 @@ LLVM_LIBC_FUNCTION(int, vsprintf, wb(buffer, cpp::numeric_limits::max()); printf_core::Writer writer(wb); - auto ret_val = printf_core::printf_main(&writer, format, args); - if (!ret_val.has_value()) { - libc_errno = printf_core::internal_error_to_errno(ret_val.error()); - return -1; - } + int ret_val = printf_core::printf_main(&writer, format, args); wb.buff[wb.buff_cur] = '\0'; - - if (ret_val.value() > static_cast(cpp::numeric_limits::max())) { - libc_errno = - printf_core::internal_error_to_errno(-printf_core::OVERFLOW_ERROR); - return -1; - } - return static_cast(ret_val.value()); + return ret_val; } } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/stdlib/CMakeLists.txt b/libc/src/stdlib/CMakeLists.txt index 1ccdcc8bec148..c464f82dcbda7 100644 --- a/libc/src/stdlib/CMakeLists.txt +++ b/libc/src/stdlib/CMakeLists.txt @@ -73,8 +73,6 @@ add_entrypoint_object( strfromf.h DEPENDS .str_from_util - libc.src.__support.CPP.limits - libc.src.stdio.printf_core.error_mapper ) add_entrypoint_object( @@ -85,8 +83,6 @@ add_entrypoint_object( strfromd.h DEPENDS .str_from_util - libc.src.__support.CPP.limits - libc.src.stdio.printf_core.error_mapper ) add_entrypoint_object( @@ -97,8 +93,6 @@ add_entrypoint_object( strfroml.h DEPENDS .str_from_util - libc.src.__support.CPP.limits - libc.src.stdio.printf_core.error_mapper ) add_header_library( diff --git a/libc/src/stdlib/strfromd.cpp b/libc/src/stdlib/strfromd.cpp index 71e257f08645b..f51e6d4c7f1df 100644 --- a/libc/src/stdlib/strfromd.cpp +++ b/libc/src/stdlib/strfromd.cpp @@ -7,10 +7,7 @@ //===----------------------------------------------------------------------===// #include "src/stdlib/strfromd.h" -#include "src/__support/CPP/limits.h" #include "src/__support/macros/config.h" -#include "src/stdio/printf_core/core_structs.h" -#include "src/stdio/printf_core/error_mapper.h" #include "src/stdlib/str_from_util.h" namespace LIBC_NAMESPACE_DECL { @@ -39,13 +36,7 @@ LLVM_LIBC_FUNCTION(int, strfromd, if (n > 0) wb.buff[wb.buff_cur] = '\0'; - if (writer.get_chars_written() > - static_cast(cpp::numeric_limits::max())) { - libc_errno = - printf_core::internal_error_to_errno(-printf_core::OVERFLOW_ERROR); - return -1; - } - return static_cast(writer.get_chars_written()); + return writer.get_chars_written(); } } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/stdlib/strfromf.cpp b/libc/src/stdlib/strfromf.cpp index 65f242b200f18..14dbfdb25bab6 100644 --- a/libc/src/stdlib/strfromf.cpp +++ b/libc/src/stdlib/strfromf.cpp @@ -7,10 +7,7 @@ //===----------------------------------------------------------------------===// #include "src/stdlib/strfromf.h" -#include "src/__support/CPP/limits.h" #include "src/__support/macros/config.h" -#include "src/stdio/printf_core/core_structs.h" -#include "src/stdio/printf_core/error_mapper.h" #include "src/stdlib/str_from_util.h" namespace LIBC_NAMESPACE_DECL { @@ -39,13 +36,7 @@ LLVM_LIBC_FUNCTION(int, strfromf, if (n > 0) wb.buff[wb.buff_cur] = '\0'; - if (writer.get_chars_written() > - static_cast(cpp::numeric_limits::max())) { - libc_errno = - printf_core::internal_error_to_errno(-printf_core::OVERFLOW_ERROR); - return -1; - } - return static_cast(writer.get_chars_written()); + return writer.get_chars_written(); } } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/stdlib/strfroml.cpp b/libc/src/stdlib/strfroml.cpp index 31668a0323c93..12f22a8a2fb65 100644 --- a/libc/src/stdlib/strfroml.cpp +++ b/libc/src/stdlib/strfroml.cpp @@ -7,10 +7,7 @@ //===----------------------------------------------------------------------===// #include "src/stdlib/strfroml.h" -#include "src/__support/CPP/limits.h" #include "src/__support/macros/config.h" -#include "src/stdio/printf_core/core_structs.h" -#include "src/stdio/printf_core/error_mapper.h" #include "src/stdlib/str_from_util.h" namespace LIBC_NAMESPACE_DECL { @@ -44,13 +41,7 @@ LLVM_LIBC_FUNCTION(int, strfroml, if (n > 0) wb.buff[wb.buff_cur] = '\0'; - if (writer.get_chars_written() > - static_cast(cpp::numeric_limits::max())) { - libc_errno = - printf_core::internal_error_to_errno(-printf_core::OVERFLOW_ERROR); - return -1; - } - return static_cast(writer.get_chars_written()); + return writer.get_chars_written(); } } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/time/strftime_core/strftime_main.h b/libc/src/time/strftime_core/strftime_main.h index 2b136d83234cd..c7e590627094a 100644 --- a/libc/src/time/strftime_core/strftime_main.h +++ b/libc/src/time/strftime_core/strftime_main.h @@ -36,8 +36,7 @@ int strftime_main(printf_core::Writer *writer, return result; } - // TODO: Use ErrorOr - return static_cast(writer->get_chars_written()); + return writer->get_chars_written(); } } // namespace strftime_core diff --git a/libc/test/src/stdio/CMakeLists.txt b/libc/test/src/stdio/CMakeLists.txt index d71f1dff11943..eec108bc12ca5 100644 --- a/libc/test/src/stdio/CMakeLists.txt +++ b/libc/test/src/stdio/CMakeLists.txt @@ -186,8 +186,6 @@ add_libc_test( fprintf_test.cpp DEPENDS libc.src.stdio.fprintf - libc.test.UnitTest.ErrnoCheckingTest - libc.test.UnitTest.ErrnoSetterMatcher ${fprintf_test_deps} COMPILE_OPTIONS ${use_system_file} diff --git a/libc/test/src/stdio/fprintf_test.cpp b/libc/test/src/stdio/fprintf_test.cpp index 2cea7f554ce38..6799323cc6ad9 100644 --- a/libc/test/src/stdio/fprintf_test.cpp +++ b/libc/test/src/stdio/fprintf_test.cpp @@ -15,9 +15,6 @@ #include "src/stdio/fprintf.h" -#include "src/__support/CPP/limits.h" -#include "test/UnitTest/ErrnoCheckingTest.h" -#include "test/UnitTest/ErrnoSetterMatcher.h" #include "test/UnitTest/Test.h" namespace printf_test { @@ -34,8 +31,6 @@ using ::fread; #endif // LIBC_COPT_STDIO_USE_SYSTEM_FILE } // namespace printf_test -using LlvmLibcFPrintfTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest; - TEST(LlvmLibcFPrintfTest, WriteToFile) { const char *FILENAME = APPEND_LIBC_TEST("fprintf_output.test"); auto FILE_PATH = libc_make_test_file_path(FILENAME); @@ -83,25 +78,6 @@ TEST(LlvmLibcFPrintfTest, WriteToFile) { written = LIBC_NAMESPACE::fprintf(file, "Writing to a read only file should fail."); EXPECT_LT(written, 0); - ASSERT_ERRNO_FAILURE(); - - ASSERT_EQ(printf_test::fclose(file), 0); -} - -#if !defined(LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS) && \ - !defined(LIBC_COPT_PRINTF_DISABLE_WRITE_INT) -TEST(LlvmLibcFPrintfTest, NullPtrCheck) { - const char *FILENAME = APPEND_LIBC_TEST("fprintf_nullptr.test"); - auto FILE_PATH = libc_make_test_file_path(FILENAME); - - ::FILE *file = printf_test::fopen(FILE_PATH, "w"); - ASSERT_FALSE(file == nullptr); - - int ret = - LIBC_NAMESPACE::fprintf(file, "hello %n", static_cast(nullptr)); - EXPECT_LT(ret, 0); - ASSERT_ERRNO_FAILURE(); ASSERT_EQ(printf_test::fclose(file), 0); } -#endif // LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS diff --git a/libc/test/src/stdio/printf_core/converter_test.cpp b/libc/test/src/stdio/printf_core/converter_test.cpp index 2dae2a22c864c..bf088937e4104 100644 --- a/libc/test/src/stdio/printf_core/converter_test.cpp +++ b/libc/test/src/stdio/printf_core/converter_test.cpp @@ -38,7 +38,7 @@ TEST_F(LlvmLibcPrintfConverterTest, SimpleRawConversion) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ(str, "abc"); - ASSERT_EQ(writer.get_chars_written(), size_t{3}); + ASSERT_EQ(writer.get_chars_written(), 3); } TEST_F(LlvmLibcPrintfConverterTest, PercentConversion) { @@ -52,7 +52,7 @@ TEST_F(LlvmLibcPrintfConverterTest, PercentConversion) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ(str, "%"); - ASSERT_EQ(writer.get_chars_written(), size_t{1}); + ASSERT_EQ(writer.get_chars_written(), 1); } TEST_F(LlvmLibcPrintfConverterTest, CharConversionSimple) { @@ -70,7 +70,7 @@ TEST_F(LlvmLibcPrintfConverterTest, CharConversionSimple) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ(str, "D"); - ASSERT_EQ(writer.get_chars_written(), size_t{1}); + ASSERT_EQ(writer.get_chars_written(), 1); } TEST_F(LlvmLibcPrintfConverterTest, CharConversionRightJustified) { @@ -85,7 +85,7 @@ TEST_F(LlvmLibcPrintfConverterTest, CharConversionRightJustified) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ(str, " E"); - ASSERT_EQ(writer.get_chars_written(), size_t{4}); + ASSERT_EQ(writer.get_chars_written(), 4); } TEST_F(LlvmLibcPrintfConverterTest, CharConversionLeftJustified) { @@ -102,7 +102,7 @@ TEST_F(LlvmLibcPrintfConverterTest, CharConversionLeftJustified) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ(str, "F "); - ASSERT_EQ(writer.get_chars_written(), size_t{4}); + ASSERT_EQ(writer.get_chars_written(), 4); } TEST_F(LlvmLibcPrintfConverterTest, StringConversionSimple) { @@ -118,7 +118,7 @@ TEST_F(LlvmLibcPrintfConverterTest, StringConversionSimple) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ(str, "DEF"); - ASSERT_EQ(writer.get_chars_written(), size_t{3}); + ASSERT_EQ(writer.get_chars_written(), 3); } TEST_F(LlvmLibcPrintfConverterTest, StringConversionPrecisionHigh) { @@ -133,7 +133,7 @@ TEST_F(LlvmLibcPrintfConverterTest, StringConversionPrecisionHigh) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ(str, "456"); - ASSERT_EQ(writer.get_chars_written(), size_t{3}); + ASSERT_EQ(writer.get_chars_written(), 3); } TEST_F(LlvmLibcPrintfConverterTest, StringConversionPrecisionLow) { @@ -148,7 +148,7 @@ TEST_F(LlvmLibcPrintfConverterTest, StringConversionPrecisionLow) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ(str, "xy"); - ASSERT_EQ(writer.get_chars_written(), size_t{2}); + ASSERT_EQ(writer.get_chars_written(), 2); } TEST_F(LlvmLibcPrintfConverterTest, StringConversionRightJustified) { @@ -163,7 +163,7 @@ TEST_F(LlvmLibcPrintfConverterTest, StringConversionRightJustified) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ(str, " 789"); - ASSERT_EQ(writer.get_chars_written(), size_t{4}); + ASSERT_EQ(writer.get_chars_written(), 4); } TEST_F(LlvmLibcPrintfConverterTest, StringConversionLeftJustified) { @@ -180,7 +180,7 @@ TEST_F(LlvmLibcPrintfConverterTest, StringConversionLeftJustified) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ(str, "ghi "); - ASSERT_EQ(writer.get_chars_written(), size_t{4}); + ASSERT_EQ(writer.get_chars_written(), 4); } TEST_F(LlvmLibcPrintfConverterTest, IntConversionSimple) { @@ -194,7 +194,7 @@ TEST_F(LlvmLibcPrintfConverterTest, IntConversionSimple) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ(str, "12345"); - ASSERT_EQ(writer.get_chars_written(), size_t{5}); + ASSERT_EQ(writer.get_chars_written(), 5); } TEST_F(LlvmLibcPrintfConverterTest, HexConversion) { @@ -211,7 +211,7 @@ TEST_F(LlvmLibcPrintfConverterTest, HexConversion) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ(str, "0x00000000123456ab"); - ASSERT_EQ(writer.get_chars_written(), size_t{18}); + ASSERT_EQ(writer.get_chars_written(), 18); } TEST_F(LlvmLibcPrintfConverterTest, BinaryConversion) { @@ -225,7 +225,7 @@ TEST_F(LlvmLibcPrintfConverterTest, BinaryConversion) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ(str, "101010"); - ASSERT_EQ(writer.get_chars_written(), size_t{6}); + ASSERT_EQ(writer.get_chars_written(), 6); } TEST_F(LlvmLibcPrintfConverterTest, PointerConversion) { @@ -239,7 +239,7 @@ TEST_F(LlvmLibcPrintfConverterTest, PointerConversion) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ(str, "0x123456ab"); - ASSERT_EQ(writer.get_chars_written(), size_t{10}); + ASSERT_EQ(writer.get_chars_written(), 10); } TEST_F(LlvmLibcPrintfConverterTest, OctConversion) { @@ -253,5 +253,5 @@ TEST_F(LlvmLibcPrintfConverterTest, OctConversion) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ(str, "1234"); - ASSERT_EQ(writer.get_chars_written(), size_t{4}); + ASSERT_EQ(writer.get_chars_written(), 4); } diff --git a/libc/test/src/stdio/printf_core/writer_test.cpp b/libc/test/src/stdio/printf_core/writer_test.cpp index d263cf55aa474..d036341be7981 100644 --- a/libc/test/src/stdio/printf_core/writer_test.cpp +++ b/libc/test/src/stdio/printf_core/writer_test.cpp @@ -39,7 +39,7 @@ TEST(LlvmLibcPrintfWriterTest, Write) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ("abc", str); - ASSERT_EQ(writer.get_chars_written(), size_t{3}); + ASSERT_EQ(writer.get_chars_written(), 3); } TEST(LlvmLibcPrintfWriterTest, WriteMultipleTimes) { @@ -53,7 +53,7 @@ TEST(LlvmLibcPrintfWriterTest, WriteMultipleTimes) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ("abcDEF123", str); - ASSERT_EQ(writer.get_chars_written(), size_t{9}); + ASSERT_EQ(writer.get_chars_written(), 9); } TEST(LlvmLibcPrintfWriterTest, WriteChars) { @@ -66,7 +66,7 @@ TEST(LlvmLibcPrintfWriterTest, WriteChars) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ("aaa", str); - ASSERT_EQ(writer.get_chars_written(), size_t{3}); + ASSERT_EQ(writer.get_chars_written(), 3); } TEST(LlvmLibcPrintfWriterTest, WriteCharsMultipleTimes) { @@ -80,7 +80,7 @@ TEST(LlvmLibcPrintfWriterTest, WriteCharsMultipleTimes) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ("aaaDDD111", str); - ASSERT_EQ(writer.get_chars_written(), size_t{9}); + ASSERT_EQ(writer.get_chars_written(), 9); } TEST(LlvmLibcPrintfWriterTest, WriteManyChars) { @@ -102,7 +102,7 @@ TEST(LlvmLibcPrintfWriterTest, WriteManyChars) { "ZZZZZZZZZZ" "ZZZZZZZZZ", str); - ASSERT_EQ(writer.get_chars_written(), size_t{99}); + ASSERT_EQ(writer.get_chars_written(), 99); } TEST(LlvmLibcPrintfWriterTest, MixedWrites) { @@ -117,7 +117,7 @@ TEST(LlvmLibcPrintfWriterTest, MixedWrites) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ("aaaDEF111456", str); - ASSERT_EQ(writer.get_chars_written(), size_t{12}); + ASSERT_EQ(writer.get_chars_written(), 12); } TEST(LlvmLibcPrintfWriterTest, WriteWithMaxLength) { @@ -129,7 +129,7 @@ TEST(LlvmLibcPrintfWriterTest, WriteWithMaxLength) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ("abcDEF1234", str); - ASSERT_EQ(writer.get_chars_written(), size_t{12}); + ASSERT_EQ(writer.get_chars_written(), 12); } TEST(LlvmLibcPrintfWriterTest, WriteCharsWithMaxLength) { @@ -141,7 +141,7 @@ TEST(LlvmLibcPrintfWriterTest, WriteCharsWithMaxLength) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ("1111111111", str); - ASSERT_EQ(writer.get_chars_written(), size_t{15}); + ASSERT_EQ(writer.get_chars_written(), 15); } TEST(LlvmLibcPrintfWriterTest, MixedWriteWithMaxLength) { @@ -157,7 +157,7 @@ TEST(LlvmLibcPrintfWriterTest, MixedWriteWithMaxLength) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ("aaaDEF1114", str); - ASSERT_EQ(writer.get_chars_written(), size_t{12}); + ASSERT_EQ(writer.get_chars_written(), 12); } TEST(LlvmLibcPrintfWriterTest, StringWithMaxLengthOne) { @@ -175,7 +175,7 @@ TEST(LlvmLibcPrintfWriterTest, StringWithMaxLengthOne) { wb.buff[wb.buff_cur] = '\0'; ASSERT_STREQ("", str); - ASSERT_EQ(writer.get_chars_written(), size_t{12}); + ASSERT_EQ(writer.get_chars_written(), 12); } TEST(LlvmLibcPrintfWriterTest, NullStringWithZeroMaxLength) { @@ -187,7 +187,7 @@ TEST(LlvmLibcPrintfWriterTest, NullStringWithZeroMaxLength) { writer.write('1', 3); writer.write({"456", 3}); - ASSERT_EQ(writer.get_chars_written(), size_t{12}); + ASSERT_EQ(writer.get_chars_written(), 12); } struct OutBuff { @@ -226,7 +226,7 @@ TEST(LlvmLibcPrintfWriterTest, WriteWithMaxLengthWithCallback) { str[out_buff.cur_pos] = '\0'; ASSERT_STREQ("abcDEF123456", str); - ASSERT_EQ(writer.get_chars_written(), size_t{12}); + ASSERT_EQ(writer.get_chars_written(), 12); } TEST(LlvmLibcPrintfWriterTest, WriteCharsWithMaxLengthWithCallback) { @@ -246,7 +246,7 @@ TEST(LlvmLibcPrintfWriterTest, WriteCharsWithMaxLengthWithCallback) { str[out_buff.cur_pos] = '\0'; ASSERT_STREQ("111111111111111", str); - ASSERT_EQ(writer.get_chars_written(), size_t{15}); + ASSERT_EQ(writer.get_chars_written(), 15); } TEST(LlvmLibcPrintfWriterTest, MixedWriteWithMaxLengthWithCallback) { @@ -269,7 +269,7 @@ TEST(LlvmLibcPrintfWriterTest, MixedWriteWithMaxLengthWithCallback) { str[out_buff.cur_pos] = '\0'; ASSERT_STREQ("aaaDEF111456", str); - ASSERT_EQ(writer.get_chars_written(), size_t{12}); + ASSERT_EQ(writer.get_chars_written(), 12); } TEST(LlvmLibcPrintfWriterTest, ZeroLengthBufferWithCallback) { @@ -292,7 +292,7 @@ TEST(LlvmLibcPrintfWriterTest, ZeroLengthBufferWithCallback) { str[out_buff.cur_pos] = '\0'; ASSERT_STREQ("aaaDEF111456", str); - ASSERT_EQ(writer.get_chars_written(), size_t{12}); + ASSERT_EQ(writer.get_chars_written(), 12); } TEST(LlvmLibcPrintfWriterTest, NullStringWithZeroMaxLengthWithCallback) { @@ -312,7 +312,7 @@ TEST(LlvmLibcPrintfWriterTest, NullStringWithZeroMaxLengthWithCallback) { wb.overflow_write(""); str[out_buff.cur_pos] = '\0'; - ASSERT_EQ(writer.get_chars_written(), size_t{12}); + ASSERT_EQ(writer.get_chars_written(), 12); ASSERT_STREQ("aaaDEF111456", str); } diff --git a/libc/test/src/stdio/snprintf_test.cpp b/libc/test/src/stdio/snprintf_test.cpp index 95507e0885dbf..baaa664cdc9ee 100644 --- a/libc/test/src/stdio/snprintf_test.cpp +++ b/libc/test/src/stdio/snprintf_test.cpp @@ -8,12 +8,8 @@ #include "src/stdio/snprintf.h" -#include "test/UnitTest/ErrnoCheckingTest.h" -#include "test/UnitTest/ErrnoSetterMatcher.h" #include "test/UnitTest/Test.h" -using LlvmLibcSNPrintfTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest; - // The sprintf test cases cover testing the shared printf functionality, so // these tests will focus on snprintf exclusive features. @@ -63,14 +59,3 @@ TEST(LlvmLibcSNPrintfTest, NoCutOff) { EXPECT_EQ(written, 10); ASSERT_STREQ(buff, "1234567890"); } - -TEST(LlvmLibcSNPrintfTest, CharsWrittenOverflow) { - char buff[0]; - - // Trigger an overflow in the return value of snprintf by writing more than - // INT_MAX bytes. - int int_max = LIBC_NAMESPACE::cpp::numeric_limits::max(); - int written = LIBC_NAMESPACE::snprintf(buff, 0, "%*stest", int_max, ""); - EXPECT_LT(written, 0); - ASSERT_ERRNO_FAILURE(); -} diff --git a/libc/test/src/stdio/vfprintf_test.cpp b/libc/test/src/stdio/vfprintf_test.cpp index 9b5f09db8fd41..f50565a0f68ca 100644 --- a/libc/test/src/stdio/vfprintf_test.cpp +++ b/libc/test/src/stdio/vfprintf_test.cpp @@ -19,8 +19,6 @@ #include "src/stdio/vfprintf.h" -#include "test/UnitTest/ErrnoCheckingTest.h" -#include "test/UnitTest/ErrnoSetterMatcher.h" #include "test/UnitTest/Test.h" namespace printf_test { @@ -46,8 +44,6 @@ int call_vfprintf(::FILE *__restrict stream, const char *__restrict format, return ret; } -using LlvmLibcVFPrintfTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest; - TEST(LlvmLibcVFPrintfTest, WriteToFile) { const char *FILENAME = APPEND_LIBC_TEST("vfprintf_output.test"); auto FILE_PATH = libc_make_test_file_path(FILENAME); @@ -94,7 +90,6 @@ TEST(LlvmLibcVFPrintfTest, WriteToFile) { written = call_vfprintf(file, "Writing to a read only file should fail."); EXPECT_LT(written, 0); - ASSERT_ERRNO_EQ(EBADF); ASSERT_EQ(printf_test::fclose(file), 0); } diff --git a/libc/test/src/stdlib/StrfromTest.h b/libc/test/src/stdlib/StrfromTest.h index fd2e0f120e90e..e82c94499aa11 100644 --- a/libc/test/src/stdlib/StrfromTest.h +++ b/libc/test/src/stdlib/StrfromTest.h @@ -8,8 +8,6 @@ #include "src/__support/CPP/type_traits.h" #include "src/__support/FPUtil/FPBits.h" -#include "test/UnitTest/ErrnoCheckingTest.h" -#include "test/UnitTest/ErrnoSetterMatcher.h" #include "test/UnitTest/Test.h" #define ASSERT_STREQ_LEN(actual_written, actual_str, expected_str) \ @@ -17,7 +15,7 @@ EXPECT_STREQ(actual_str, expected_str); template -class StrfromTest : public LIBC_NAMESPACE::testing::ErrnoCheckingTest { +class StrfromTest : public LIBC_NAMESPACE::testing::Test { static constexpr bool is_single_prec = LIBC_NAMESPACE::cpp::is_same::value; @@ -483,16 +481,6 @@ class StrfromTest : public LIBC_NAMESPACE::testing::ErrnoCheckingTest { written = func(buff, 10, "%A", -ld_nan); ASSERT_STREQ_LEN(written, buff, "-NAN"); } - - void charsWrittenOverflow(FunctionT func) { - char buff[100]; - // Trigger an overflow in the return value of strfrom by writing more than - // INT_MAX bytes. - int result = func(buff, sizeof(buff), "%.2147483647f", 1.0f); - - EXPECT_LT(result, 0); - ASSERT_ERRNO_FAILURE(); - } }; #define STRFROM_TEST(InputType, name, func) \ @@ -513,7 +501,4 @@ class StrfromTest : public LIBC_NAMESPACE::testing::ErrnoCheckingTest { TEST_F(LlvmLibc##name##Test, InsufficientBufferSize) { \ insufficentBufsize(func); \ } \ - TEST_F(LlvmLibc##name##Test, InfAndNanValues) { infNanValues(func); } \ - TEST_F(LlvmLibc##name##Test, CharsWrittenOverflow) { \ - charsWrittenOverflow(func); \ - } + TEST_F(LlvmLibc##name##Test, InfAndNanValues) { infNanValues(func); }