diff --git a/libc/src/stdio/printf_core/parser.h b/libc/src/stdio/printf_core/parser.h --- a/libc/src/stdio/printf_core/parser.h +++ b/libc/src/stdio/printf_core/parser.h @@ -11,6 +11,7 @@ #include "src/__support/arg_list.h" #include "src/stdio/printf_core/core_structs.h" +#include "src/stdio/printf_core/printf_config.h" #include "src/string/memory_utils/memset_implementations.h" #include @@ -42,14 +43,16 @@ return (size == other.size) && (primary_type == other.primary_type); } }; - // TODO: Make this size configurable via a compile option. - static constexpr size_t DESC_ARR_LEN = 32; + + // Defined in printf_config.h + static constexpr size_t DESC_ARR_LEN = LLVM_LIBC_PRINTF_INDEX_ARR_LEN; + // desc_arr stores the sizes of the variables in the ArgList. This is used in // index mode to reduce repeated string parsing. The sizes are stored as // TypeDesc objects, which store the size as well as minimal type information. // This is necessary because some systems separate the floating point and // integer values in va_args. - TypeDesc desc_arr[DESC_ARR_LEN]; + TypeDesc desc_arr[DESC_ARR_LEN] = {{0, Integer}}; // TODO: Look into object stores for optimization. @@ -58,10 +61,7 @@ public: #ifndef LLVM_LIBC_PRINTF_DISABLE_INDEX_MODE Parser(const char *__restrict new_str, internal::ArgList &args) - : str(new_str), args_cur(args), args_start(args) { - inline_memset(reinterpret_cast(desc_arr), 0, - DESC_ARR_LEN * sizeof(TypeDesc)); - } + : str(new_str), args_cur(args), args_start(args) {} #else Parser(const char *__restrict new_str, internal::ArgList &args) : str(new_str), args_cur(args) {} diff --git a/libc/src/stdio/printf_core/printf_config.h b/libc/src/stdio/printf_core/printf_config.h new file mode 100644 --- /dev/null +++ b/libc/src/stdio/printf_core/printf_config.h @@ -0,0 +1,24 @@ +//===-- Printf Configuration Handler ----------------------------*- 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_PRINTF_CONFIG_H +#define LLVM_LIBC_SRC_STDIO_PRINTF_CORE_PRINTF_CONFIG_H + +// The index array buffer is always initialized when printf is called. In cases +// where index mode is necessary but memory is limited, or when index mode +// performance is important and memory is available, this compile option +// provides a knob to adjust memory usage to an appropriate level. 128 is picked +// as the default size since that's big enough to handle even extreme cases and +// the runtime penalty for not having enough space is severe. +#ifndef LLVM_LIBC_PRINTF_INDEX_ARR_LEN +#define LLVM_LIBC_PRINTF_INDEX_ARR_LEN 128 +#endif + +// TODO(michaelrj): Move the other printf configuration options into this file. + +#endif // LLVM_LIBC_SRC_STDIO_PRINTF_CORE_PRINTF_CONFIG_H