[libc-commits] [PATCH] D127995: [libc] add printf pointer conv
Michael Jones via Phabricator via libc-commits
libc-commits at lists.llvm.org
Thu Jun 16 11:26:16 PDT 2022
michaelrj created this revision.
michaelrj added reviewers: sivachandra, lntue.
Herald added subscribers: libc-commits, ecnelises, tschuett.
Herald added projects: libc-project, All.
michaelrj requested review of this revision.
The pointer converter handles the %p conversion. It uses the hex
converter for most of the conversion.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D127995
Files:
libc/src/stdio/printf_core/converter.cpp
libc/src/stdio/printf_core/converter_atlas.h
libc/src/stdio/printf_core/ptr_converter.h
libc/test/src/stdio/sprintf_test.cpp
Index: libc/test/src/stdio/sprintf_test.cpp
===================================================================
--- libc/test/src/stdio/sprintf_test.cpp
+++ libc/test/src/stdio/sprintf_test.cpp
@@ -346,6 +346,22 @@
ASSERT_STREQ(buff, "007F 0x1000000000 002 ");
}
+TEST(LlvmLibcSPrintfTest, PointerConv) {
+ char buff[64];
+ int written;
+
+ written = __llvm_libc::sprintf(buff, "%p", nullptr);
+ EXPECT_EQ(written, 9);
+ ASSERT_STREQ(buff, "(nullptr)");
+
+ written = __llvm_libc::sprintf(buff, "%p", 0x1a2b3c4d);
+ EXPECT_EQ(written, 10);
+ ASSERT_STREQ(buff, "0x1a2b3c4d");
+
+ written = __llvm_libc::sprintf(buff, "%p", buff);
+ EXPECT_GT(written, 0);
+}
+
#ifndef LLVM_LIBC_PRINTF_DISABLE_INDEX_MODE
TEST(LlvmLibcSPrintfTest, IndexModeParsing) {
char buff[64];
Index: libc/src/stdio/printf_core/ptr_converter.h
===================================================================
--- /dev/null
+++ libc/src/stdio/printf_core/ptr_converter.h
@@ -0,0 +1,39 @@
+//===-- Pointer Converter 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_PTR_CONVERTER_H
+#define LLVM_LIBC_SRC_STDIO_PRINTF_CORE_PTR_CONVERTER_H
+
+#include "src/stdio/printf_core/converter_utils.h"
+#include "src/stdio/printf_core/core_structs.h"
+#include "src/stdio/printf_core/hex_converter.h"
+#include "src/stdio/printf_core/writer.h"
+
+namespace __llvm_libc {
+namespace printf_core {
+
+int inline convert_pointer(Writer *writer, const FormatSection &to_conv) {
+ if (to_conv.conv_val_ptr == (void *)(nullptr)) {
+ const char ZERO_STR[] = "(nullptr)";
+ // subtract 1 from sizeof to remove the null byte at the end.
+ RET_IF_RESULT_NEGATIVE(writer->write(ZERO_STR, sizeof(ZERO_STR) - 1));
+ } else {
+ FormatSection hex_conv;
+ hex_conv.has_conv = true;
+ hex_conv.conv_name = 'x';
+ hex_conv.flags = FormatFlags::ALTERNATE_FORM;
+ hex_conv.conv_val_raw = reinterpret_cast<uintptr_t>(to_conv.conv_val_ptr);
+ return convert_hex(writer, hex_conv);
+ }
+ return 0;
+}
+
+} // namespace printf_core
+} // namespace __llvm_libc
+
+#endif // LLVM_LIBC_SRC_STDIO_PRINTF_CORE_PTR_CONVERTER_H
Index: libc/src/stdio/printf_core/converter_atlas.h
===================================================================
--- libc/src/stdio/printf_core/converter_atlas.h
+++ libc/src/stdio/printf_core/converter_atlas.h
@@ -36,5 +36,6 @@
// defines convert_write_int
// defines convert_pointer
+#include "src/stdio/printf_core/ptr_converter.h"
#endif // LLVM_LIBC_SRC_STDIO_PRINTF_CORE_CONVERTER_ATLAS_H
Index: libc/src/stdio/printf_core/converter.cpp
===================================================================
--- libc/src/stdio/printf_core/converter.cpp
+++ libc/src/stdio/printf_core/converter.cpp
@@ -61,7 +61,7 @@
case 'n':
// return convert_write_int(writer, to_conv);
case 'p':
- // return convert_pointer(writer, to_conv);
+ return convert_pointer(writer, to_conv);
default:
return writer->write(to_conv.raw_string, to_conv.raw_len);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D127995.437628.patch
Type: text/x-patch
Size: 3342 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libc-commits/attachments/20220616/e177fe63/attachment-0001.bin>
More information about the libc-commits
mailing list