[libc-commits] [PATCH] D131993: [libc] add compile option for printf arg type array

Michael Jones via Phabricator via libc-commits libc-commits at lists.llvm.org
Fri Aug 26 11:38:10 PDT 2022

This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGecca895295e6: [libc] add compile option for printf arg type array (authored by michaelrj).

  rG LLVM Github Monorepo




Index: libc/src/stdio/printf_core/printf_config.h
--- /dev/null
+++ libc/src/stdio/printf_core/printf_config.h
@@ -0,0 +1,34 @@
+//===-- 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
+// 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.
+// When an index mode argument is requested, if its index is before the most
+// recently read index, then the arg list must be restarted from the beginning,
+// and all of the arguments before the new index must be requested with the
+// correct types. The index array caches the types of the values in the arg
+// list. For every number between the last index cached in the array and the
+// requested index, the format string must be parsed again to find the
+// type of that index. As an example, if the format string has 20 indexes, and
+// the index array is 10, then when the 20th index is requested the first 10
+// types can be found immediately, and then the format string must be parsed 10
+// times to find the types of the next 10 arguments.
+// TODO(michaelrj): Move the other printf configuration options into this file.
Index: libc/src/stdio/printf_core/parser.h
--- libc/src/stdio/printf_core/parser.h
+++ 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 <stddef.h>
@@ -41,8 +42,10 @@
       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.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D131993.455972.patch
Type: text/x-patch
Size: 3077 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libc-commits/attachments/20220826/a7ca163a/attachment-0001.bin>

More information about the libc-commits mailing list