LLVM  10.0.0svn
Chrono.cpp
Go to the documentation of this file.
1 //===- Support/Chrono.cpp - Utilities for Timing Manipulation ---*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "llvm/Support/Chrono.h"
10 #include "llvm/Config/llvm-config.h"
11 #include "llvm/Support/Format.h"
13 
14 namespace llvm {
15 
16 using namespace sys;
17 
18 const char llvm::detail::unit<std::ratio<3600>>::value[] = "h";
19 const char llvm::detail::unit<std::ratio<60>>::value[] = "m";
20 const char llvm::detail::unit<std::ratio<1>>::value[] = "s";
21 const char llvm::detail::unit<std::milli>::value[] = "ms";
22 const char llvm::detail::unit<std::micro>::value[] = "us";
23 const char llvm::detail::unit<std::nano>::value[] = "ns";
24 
25 static inline struct tm getStructTM(TimePoint<> TP) {
26  struct tm Storage;
27  std::time_t OurTime = toTimeT(TP);
28 
29 #if defined(LLVM_ON_UNIX)
30  struct tm *LT = ::localtime_r(&OurTime, &Storage);
31  assert(LT);
32  (void)LT;
33 #endif
34 #if defined(_WIN32)
35  int Error = ::localtime_s(&Storage, &OurTime);
36  assert(!Error);
37  (void)Error;
38 #endif
39 
40  return Storage;
41 }
42 
43 raw_ostream &operator<<(raw_ostream &OS, TimePoint<> TP) {
44  struct tm LT = getStructTM(TP);
45  char Buffer[sizeof("YYYY-MM-DD HH:MM:SS")];
46  strftime(Buffer, sizeof(Buffer), "%Y-%m-%d %H:%M:%S", &LT);
47  return OS << Buffer << '.'
48  << format("%.9lu",
49  long((TP.time_since_epoch() % std::chrono::seconds(1))
50  .count()));
51 }
52 
54  StringRef Style) {
55  using namespace std::chrono;
56  TimePoint<seconds> Truncated = time_point_cast<seconds>(T);
57  auto Fractional = T - Truncated;
58  struct tm LT = getStructTM(Truncated);
59  // Handle extensions first. strftime mangles unknown %x on some platforms.
60  if (Style.empty()) Style = "%Y-%m-%d %H:%M:%S.%N";
61  std::string Format;
62  raw_string_ostream FStream(Format);
63  for (unsigned I = 0; I < Style.size(); ++I) {
64  if (Style[I] == '%' && Style.size() > I + 1) switch (Style[I + 1]) {
65  case 'L': // Milliseconds, from Ruby.
66  FStream << llvm::format(
67  "%.3lu", (long)duration_cast<milliseconds>(Fractional).count());
68  ++I;
69  continue;
70  case 'f': // Microseconds, from Python.
71  FStream << llvm::format(
72  "%.6lu", (long)duration_cast<microseconds>(Fractional).count());
73  ++I;
74  continue;
75  case 'N': // Nanoseconds, from date(1).
76  FStream << llvm::format(
77  "%.6lu", (long)duration_cast<nanoseconds>(Fractional).count());
78  ++I;
79  continue;
80  case '%': // Consume %%, so %%f parses as (%%)f not %(%f)
81  FStream << "%%";
82  ++I;
83  continue;
84  }
85  FStream << Style[I];
86  }
87  FStream.flush();
88  char Buffer[256]; // Should be enough for anywhen.
89  size_t Len = strftime(Buffer, sizeof(Buffer), Format.c_str(), &LT);
90  OS << (Len ? Buffer : "BAD-DATE-FORMAT");
91 }
92 
93 } // namespace llvm
This class represents lattice values for constants.
Definition: AllocatorList.h:23
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
Definition: Format.h:124
Format
The format used for serializing/deserializing remarks.
Definition: RemarkFormat.h:25
static struct tm getStructTM(TimePoint<> TP)
Definition: Chrono.cpp:25
LLVM_NODISCARD bool empty() const
empty - Check if the string is empty.
Definition: StringRef.h:140
LLVM_NODISCARD size_t size() const
size - Get the string size.
Definition: StringRef.h:144
auto count(R &&Range, const E &Element) -> typename std::iterator_traits< decltype(adl_begin(Range))>::difference_type
Wrapper function around std::count to count the number of times an element Element occurs in the give...
Definition: STLExtras.h:1231
std::time_t toTimeT(TimePoint<> TP)
Convert a TimePoint to std::time_t.
Definition: Chrono.h:36
#define I(x, y, z)
Definition: MD5.cpp:58
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
A raw_ostream that writes to an std::string.
Definition: raw_ostream.h:503
Lightweight error class with error context and mandatory checking.
Definition: Error.h:157
This class implements an extremely fast bulk output stream that can only output to a stream...
Definition: raw_ostream.h:45
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:48
std::chrono::time_point< std::chrono::system_clock, D > TimePoint
A time point on the system clock.
Definition: Chrono.h:33