diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Support/Chrono.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Support/Chrono.cpp | 45 |
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 <, 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 |