aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/Support/Chrono.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Support/Chrono.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/Support/Chrono.cpp45
1 files changed, 40 insertions, 5 deletions
diff --git a/contrib/llvm-project/llvm/lib/Support/Chrono.cpp b/contrib/llvm-project/llvm/lib/Support/Chrono.cpp
index 859ece8f5500..993d200675fe 100644
--- a/contrib/llvm-project/llvm/lib/Support/Chrono.cpp
+++ b/contrib/llvm-project/llvm/lib/Support/Chrono.cpp
@@ -40,6 +40,24 @@ static inline struct tm getStructTM(TimePoint<> TP) {
return Storage;
}
+static inline struct tm getStructTMUtc(UtcTime<> TP) {
+ struct tm Storage;
+ std::time_t OurTime = toTimeT(TP);
+
+#if defined(LLVM_ON_UNIX)
+ struct tm *LT = ::gmtime_r(&OurTime, &Storage);
+ assert(LT);
+ (void)LT;
+#endif
+#if defined(_WIN32)
+ int Error = ::gmtime_s(&Storage, &OurTime);
+ assert(!Error);
+ (void)Error;
+#endif
+
+ return Storage;
+}
+
raw_ostream &operator<<(raw_ostream &OS, TimePoint<> TP) {
struct tm LT = getStructTM(TP);
char Buffer[sizeof("YYYY-MM-DD HH:MM:SS")];
@@ -50,12 +68,10 @@ raw_ostream &operator<<(raw_ostream &OS, TimePoint<> TP) {
.count()));
}
-void format_provider<TimePoint<>>::format(const TimePoint<> &T, raw_ostream &OS,
- StringRef Style) {
+template <class T>
+static void format(const T &Fractional, struct tm &LT, raw_ostream &OS,
+ StringRef Style) {
using namespace std::chrono;
- TimePoint<seconds> Truncated = time_point_cast<seconds>(T);
- auto Fractional = T - Truncated;
- struct tm LT = getStructTM(Truncated);
// Handle extensions first. strftime mangles unknown %x on some platforms.
if (Style.empty()) Style = "%Y-%m-%d %H:%M:%S.%N";
std::string Format;
@@ -90,4 +106,23 @@ void format_provider<TimePoint<>>::format(const TimePoint<> &T, raw_ostream &OS,
OS << (Len ? Buffer : "BAD-DATE-FORMAT");
}
+void format_provider<UtcTime<std::chrono::seconds>>::format(
+ const UtcTime<std::chrono::seconds> &T, raw_ostream &OS, StringRef Style) {
+ using namespace std::chrono;
+ UtcTime<seconds> Truncated =
+ UtcTime<seconds>(duration_cast<seconds>(T.time_since_epoch()));
+ auto Fractional = T - Truncated;
+ struct tm LT = getStructTMUtc(Truncated);
+ llvm::format(Fractional, LT, OS, Style);
+}
+
+void format_provider<TimePoint<>>::format(const TimePoint<> &T, raw_ostream &OS,
+ StringRef Style) {
+ using namespace std::chrono;
+ TimePoint<seconds> Truncated = time_point_cast<seconds>(T);
+ auto Fractional = T - Truncated;
+ struct tm LT = getStructTM(Truncated);
+ llvm::format(Fractional, LT, OS, Style);
+}
+
} // namespace llvm