From 5bb4ff54d92e0a4520f02d08601a0c25f4d2505f Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Thu, 12 May 2022 14:32:32 -0400 Subject: [PATCH] format: add a custom formatter for std::type_info MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The name() returned by std::type_info is implementation-dependant. In practice, it is typically the type's mangled name. For GCC and clang, it is possible to use abi::__cxa_demangle to demangle the name at runtime while formatting a string. If this poses any compatibility problem on other platforms, we can fallback to using name() directly. Signed-off-by: Jérémie Galarneau Change-Id: Ib80babe4039c91ce6fdf6d9a9442c31645a43b08 --- src/common/format.hpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/common/format.hpp b/src/common/format.hpp index b49a793b9..73b363408 100644 --- a/src/common/format.hpp +++ b/src/common/format.hpp @@ -9,6 +9,9 @@ #include +#include +#include + DIAGNOSTIC_PUSH DIAGNOSTIC_IGNORE_SUGGEST_ATTRIBUTE_FORMAT DIAGNOSTIC_IGNORE_DUPLICATED_BRANCHES @@ -16,4 +19,19 @@ DIAGNOSTIC_IGNORE_DUPLICATED_BRANCHES #include DIAGNOSTIC_POP +template <> +struct fmt::formatter : fmt::formatter { + template + typename FormatCtx::iterator format(const std::type_info& type_info, FormatCtx& ctx) + { + int status; + auto demangled_name = abi::__cxa_demangle(type_info.name(), nullptr, 0, &status); + auto it = status == 0 ? fmt::formatter::format(demangled_name, ctx) : + fmt::formatter::format(type_info.name(), ctx); + + free(demangled_name); + return it; + } +}; + #endif /* LTTNG_FORMAT_H */ -- 2.34.1