<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";
        mso-fareast-language:EN-GB;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Thanks for this, I’ll take a look.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I have another buildbot reporting the same failure, I’ll see what I can do.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Thanks,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Simon<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Sam McCall [mailto:sam.mccall@gmail.com]
<br>
<b>Sent:</b> 25 October 2017 11:41<br>
<b>To:</b> Simon Dardis; benny.kra@gmail.com; brendan.kirby@imgtec.com<br>
<b>Subject:</b> Re: [llvm] r316419 - Support formatv of TimePoint with strftime-style formats.<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Hi Simon, +Brendan who's listed as the buildslave owner.<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Sorry about the break!<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">My concern with reverting is I don't know what the problem is and have a MIPS machine to test on, so it's hard to fix.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">And I suspect the issue is with the buildslave's toolchain, which makes it really hard for me to fix.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">The code doesn't look platform-specific, Ben suggests the most likely culprit is a bad std::chrono implementation.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">The buildbot is running gcc 4.7 which <a href="https://llvm.org/docs/GettingStarted.html#software">
isn't supported anymore</a> for building llvm - a more recent gcc may work?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><a href="https://stackoverflow.com/questions/17405997/c-chrono-duration-cast-to-milliseconds-results-in-seconds/17408315">https://stackoverflow.com/questions/17405997/c-chrono-duration-cast-to-milliseconds-results-in-seconds/17408315</a>
 also seems like a possible explanation.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">We can disable the test for this bot (I think?) but maybe better to do that once we have a clearer idea what's wrong.<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On Wed, Oct 25, 2017 at 11:12 AM, Simon Dardis <<a href="mailto:Simon.Dardis@mips.com" target="_blank">Simon.Dardis@mips.com</a>> wrote:<o:p></o:p></p>
<p class="MsoNormal">Resending as I mis-spelt the list name.<o:p></o:p></p>
<div>
<div>
<p class="MsoNormal"><br>
Hi Sam,<br>
<br>
This change appears to have broken llvm-mips-linux, would you be able to take a look?<br>
<br>
<a href="http://lab.llvm.org:8011/builders/llvm-mips-linux/builds/2658" target="_blank">http://lab.llvm.org:8011/builders/llvm-mips-linux/builds/2658</a><br>
<br>
Thanks,<br>
Simon<br>
<br>
-----Original Message-----<br>
From: llvm-commits [mailto:<a href="mailto:llvm-commits-bounces@lists.llvm.org">llvm-commits-bounces@lists.llvm.org</a>] On Behalf Of Sam McCall via llvm-commits<br>
Sent: 24 October 2017 09:30<br>
To: <a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
Subject: [llvm] r316419 - Support formatv of TimePoint with strftime-style formats.<br>
<br>
Author: sammccall<br>
Date: Tue Oct 24 01:30:19 2017<br>
New Revision: 316419<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=316419&view=rev" target="_blank">
http://llvm.org/viewvc/llvm-project?rev=316419&view=rev</a><br>
Log:<br>
Support formatv of TimePoint with strftime-style formats.<br>
<br>
Summary:<br>
Support formatv of TimePoint with strftime-style formats.<br>
<br>
Extensions for millis/micros/nanos are added.<br>
Inital use case is HH:MM:SS.MMM timestamps in clangd logs.<br>
<br>
Reviewers: bkramer, ilya-biryukov<br>
<br>
Subscribers: labath, llvm-commits<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D38992" target="_blank">
https://reviews.llvm.org/D38992</a><br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/Support/Chrono.h<br>
    llvm/trunk/lib/Support/Chrono.cpp<br>
    llvm/trunk/unittests/Support/Chrono.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/Support/Chrono.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Chrono.h?rev=316419&r1=316418&r2=316419&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Chrono.h?rev=316419&r1=316418&r2=316419&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Support/Chrono.h (original)<br>
+++ llvm/trunk/include/llvm/Support/Chrono.h Tue Oct 24 01:30:19 2017<br>
@@ -51,6 +51,20 @@ toTimePoint(std::time_t T) {<br>
<br>
 raw_ostream &operator<<(raw_ostream &OS, sys::TimePoint<> TP);<br>
<br>
+/// Format provider for TimePoint<><br>
+///<br>
+/// The options string is a strftime format string, with extensions:<br>
+///   - %L is millis: 000-999<br>
+///   - %f is micros: 000000-999999<br>
+///   - %N is nanos: 000000000 - 999999999<br>
+///<br>
+/// If no options are given, the default format is "%Y-%m-%d %H:%M:%S.%N".<br>
+template <><br>
+struct format_provider<sys::TimePoint<>> {<br>
+  static void format(const sys::TimePoint<> &TP, llvm::raw_ostream &OS,<br>
+                     StringRef Style);<br>
+};<br>
+<br>
 /// Implementation of format_provider<T> for duration types.<br>
 ///<br>
 /// The options string of a duration  type has the grammar:<br>
<br>
Modified: llvm/trunk/lib/Support/Chrono.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Chrono.cpp?rev=316419&r1=316418&r2=316419&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Chrono.cpp?rev=316419&r1=316418&r2=316419&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Support/Chrono.cpp (original)<br>
+++ llvm/trunk/lib/Support/Chrono.cpp Tue Oct 24 01:30:19 2017<br>
@@ -51,4 +51,44 @@ raw_ostream &operator<<(raw_ostream &OS,<br>
                                .count()));  }<br>
<br>
+void format_provider<TimePoint<>>::format(const TimePoint<> &T, raw_ostream &OS,<br>
+                                          StringRef Style) {<br>
+  using namespace std::chrono;<br>
+  TimePoint<seconds> Truncated = time_point_cast<seconds>(T);<br>
+  auto Fractional = T - Truncated;<br>
+  struct tm LT = getStructTM(Truncated);<br>
+  // Handle extensions first. strftime mangles unknown %x on some platforms.<br>
+  if (Style.empty()) Style = "%Y-%m-%d %H:%M:%S.%N";<br>
+  std::string Format;<br>
+  raw_string_ostream FStream(Format);<br>
+  for (unsigned I = 0; I < Style.size(); ++I) {<br>
+    if (Style[I] == '%' && Style.size() > I + 1) switch (Style[I + 1]) {<br>
+        case 'L':  // Milliseconds, from Ruby.<br>
+          FStream << llvm::format(<br>
+              "%.3lu", duration_cast<milliseconds>(Fractional).count());<br>
+          ++I;<br>
+          continue;<br>
+        case 'f':  // Microseconds, from Python.<br>
+          FStream << llvm::format(<br>
+              "%.6lu", duration_cast<microseconds>(Fractional).count());<br>
+          ++I;<br>
+          continue;<br>
+        case 'N':  // Nanoseconds, from date(1).<br>
+          FStream << llvm::format(<br>
+              "%.6lu", duration_cast<nanoseconds>(Fractional).count());<br>
+          ++I;<br>
+          continue;<br>
+        case '%':  // Consume %%, so %%f parses as (%%)f not %(%f)<br>
+          FStream << "%%";<br>
+          ++I;<br>
+          continue;<br>
+      }<br>
+    FStream << Style[I];<br>
+  }<br>
+  FStream.flush();<br>
+  char Buffer[256];  // Should be enough for anywhen.<br>
+  size_t Len = strftime(Buffer, sizeof(Buffer), Format.c_str(), &LT);<br>
+  OS << (Len ? Buffer : "BAD-DATE-FORMAT"); }<br>
+<br>
 } // namespace llvm<br>
<br>
Modified: llvm/trunk/unittests/Support/Chrono.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/Chrono.cpp?rev=316419&r1=316418&r2=316419&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/Chrono.cpp?rev=316419&r1=316418&r2=316419&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/unittests/Support/Chrono.cpp (original)<br>
+++ llvm/trunk/unittests/Support/Chrono.cpp Tue Oct 24 01:30:19 2017<br>
@@ -31,33 +31,35 @@ TEST(Chrono, TimeTConversion) {<br>
   EXPECT_EQ(TP, toTimePoint(toTimeT(TP)));  }<br>
<br>
-TEST(Chrono, StringConversion) {<br>
+TEST(Chrono, TimePointFormat) {<br>
+  using namespace std::chrono;<br>
+  struct tm TM {};<br>
+  TM.tm_year = 106;<br>
+  TM.tm_mon = 0;<br>
+  TM.tm_mday = 2;<br>
+  TM.tm_hour = 15;<br>
+  TM.tm_min = 4;<br>
+  TM.tm_sec = 5;<br>
+  TM.tm_isdst = -1;<br>
+  TimePoint<> T =<br>
+      system_clock::from_time_t(mktime(&TM)) + nanoseconds(123456789);<br>
+<br>
+  // operator<< uses the format YYYY-MM-DD HH:MM:SS.NNNNNNNNN<br>
   std::string S;<br>
   raw_string_ostream OS(S);<br>
-  OS << system_clock::now();<br>
-<br>
-  // Do a basic sanity check on the output.<br>
-  // The format we expect is YYYY-MM-DD HH:MM:SS.MMMUUUNNN<br>
-  StringRef Date, Time;<br>
-  std::tie(Date, Time) = StringRef(OS.str()).split(' ');<br>
-<br>
-  SmallVector<StringRef, 3> Components;<br>
-  Date.split(Components, '-');<br>
-  ASSERT_EQ(3u, Components.size());<br>
-  EXPECT_EQ(4u, Components[0].size());<br>
-  EXPECT_EQ(2u, Components[1].size());<br>
-  EXPECT_EQ(2u, Components[2].size());<br>
-<br>
-  StringRef Sec, Nano;<br>
-  std::tie(Sec, Nano) = Time.split('.');<br>
+  OS << T;<br>
+  EXPECT_EQ("2006-01-02 15:04:05.123456789", OS.str());<br>
<br>
-  Components.clear();<br>
-  Sec.split(Components, ':');<br>
-  ASSERT_EQ(3u, Components.size());<br>
-  EXPECT_EQ(2u, Components[0].size());<br>
-  EXPECT_EQ(2u, Components[1].size());<br>
-  EXPECT_EQ(2u, Components[2].size());<br>
-  EXPECT_EQ(9u, Nano.size());<br>
+  // formatv default style matches operator<<.<br>
+  EXPECT_EQ("2006-01-02 15:04:05.123456789", formatv("{0}", T).str());<br>
+ // formatv supports strftime-style format strings.<br>
+  EXPECT_EQ("15:04:05", formatv("{0:%H:%M:%S}", T).str());  // formatv<br>
+ supports our strftime extensions for sub-second precision.<br>
+  EXPECT_EQ("123", formatv("{0:%L}", T).str());  EXPECT_EQ("123456",<br>
+ formatv("{0:%f}", T).str());  EXPECT_EQ("123456789", formatv("{0:%N}",<br>
+ T).str());  // our extensions don't interfere with %% escaping.<br>
+  EXPECT_EQ("%foo", formatv("{0:%%foo}", T).str());<br>
 }<br>
<br>
 // Test that toTimePoint and toTimeT can be called with a arguments with varying<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><o:p></o:p></p>
</div>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</body>
</html>