<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 12, 2016 at 1:28 PM, Zachary Turner <span dir="ltr"><<a href="mailto:zturner@google.com" target="_blank">zturner@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><br><div class="gmail_quote"><span class="m_-8573396319951359218gmail-"><div dir="ltr">On Wed, Oct 12, 2016 at 10:13 AM James Y Knight <<a href="mailto:jyknight@google.com" target="_blank">jyknight@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"><div class="m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"><br></div></div><div dir="ltr" class="m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"><div class="gmail_extra m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"><div class="gmail_quote m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"><div class="m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"><br class="m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"></div></div></div></div><div dir="ltr" class="m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"><div class="gmail_extra m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"><div class="gmail_quote m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"><div class="m_-8573396319951359218gmail-m_4680252615225930183gmail_msg">I wonder what use cases you envision for this? Why does LLVM need a super extensible flexible formatting library? I mean -- if you were developing this as a standalone project, that seems like maybe a nice feature. But I see no rationale as to why LLVM should include it.</div></div></div></div></blockquote></span><div>We were discussing this on IRC chat the other night, but I believe many people underestimate the need for string formatting.  Here are some data points:<div><br></div><div>1. There are currently 1,637 calls to llvm::format() across the codebase, and this doesn't include calls to format_hex(), format_decimal(), and the other variants.</div><div>2. LLVM consists of a large number (20+ at a minimum) of focused tools (llc, lli, llvm-dwarfdump, llvm-objdump, etc) whose sole purpose is to output formatted text.  Consider the use case of printing a verbose disassembly listing which is fed into FileCheck.</div><div>3. Even the "flagship" tools such as clang have need for string formatting when writing diagnostic messages.</div><div>4. LLDB in particular has this kind of thing *everywhere*.  I'm talking about anywhere from 3-50+ times <b>per function</b> (and that's not an exaggeration) for logging purposes.</div><div><br></div><div>That said, LLVM already includes a formatting library.  llvm::format().  So what would be the rationale *against* a better, safer, and easier version of the same thing?</div></div></div></div></blockquote><div><br></div><div>The arguments against for me are roughly:</div><div>1. It introduces a new formatting language that people need to learn.</div><div>2. People will still continue using printf-style formattings strings, too, because everyone **always** does, whenever anyone's ever introduced another formatting language anywhere.</div><div>3. The extensible formatting support is a) not obviously necessary, and b) will be more difficult to understand for readers, versus calling a function with normal function arguments.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><span class="m_-8573396319951359218gmail-"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"><div class="gmail_extra m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"><div class="gmail_quote m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"><div class="m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"><br class="m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"></div><div class="m_-8573396319951359218gmail-m_4680252615225930183gmail_msg">That is to say: wouldn't a much-simpler printf replacement, implemented with variadic templates instead of C varargs (and which therefore doesn't require size/signedness prefixes on %d) be sufficient for LLVM?</div></div></div></div></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"><div class="gmail_extra m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"><div class="gmail_quote m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"><div class="m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"><br class="m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"></div><div class="m_-8573396319951359218gmail-m_4680252615225930183gmail_msg">You can do that as a drop-in improvement for llvm::format, replacing the call to snprintf inside the implementation with a new implementation that actually uses the type information.<br class="m_-8573396319951359218gmail-m_4680252615225930183gmail_msg"></div></div></div></div></blockquote></span><div>How would you format user-defined types using this?  I gave an example earlier:  Consider you have a start time and an end time in std::chrono types, and you want to print the start, end, and duration.  The code to do this using llvm::format() or stream operators is horrible.</div></div></div>
</blockquote></div><br class="m_-8573396319951359218gmail-Apple-interchange-newline">I'd call a function that returns a string, and print the string.<br></div><div class="gmail_extra">E.g.:</div><div class="gmail_extra">format("Started at %s, ended at %s", </div><div class="gmail_extra">  format_date("%d/%m/%Y %T", start_time),</div><div class="gmail_extra">  format_date("%d/%m/%Y %T", end_time)<span style="font-size:12.8px">);</span></div></div>