From 6df9562cc0092253d4f92fbd5d093371e2597b9e Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Mon, 24 Oct 2016 13:38:27 +0000 Subject: [PATCH] [Object] Replace TimeValue with std::chrono Summary: Most of the changes are very straight-forward. The only choice I had to make was to use second-precision time points in the Archive classes. I did this because the archive files use that precision in the on-disk representation anyway. Reviewers: rafael, zturner Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D25773 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@284974 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/Archive.h | 6 ++-- include/llvm/Object/ArchiveWriter.h | 2 +- lib/Object/Archive.cpp | 7 ++--- lib/Object/ArchiveWriter.cpp | 45 +++++++++++++++-------------- tools/llvm-ar/llvm-ar.cpp | 2 +- 5 files changed, 32 insertions(+), 30 deletions(-) diff --git a/include/llvm/Object/Archive.h b/include/llvm/Object/Archive.h index 4d924ca5704..08128b0c251 100644 --- a/include/llvm/Object/Archive.h +++ b/include/llvm/Object/Archive.h @@ -18,11 +18,11 @@ #include "llvm/ADT/StringRef.h" #include "llvm/ADT/iterator_range.h" #include "llvm/Object/Binary.h" +#include "llvm/Support/Chrono.h" #include "llvm/Support/Error.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/MemoryBuffer.h" -#include "llvm/Support/TimeValue.h" namespace llvm { namespace object { @@ -46,7 +46,7 @@ public: Expected getSize() const; Expected getAccessMode() const; - Expected getLastModified() const; + Expected> getLastModified() const; llvm::StringRef getRawLastModified() const { return StringRef(ArMemHdr->LastModified, sizeof(ArMemHdr->LastModified)).rtrim(' '); @@ -103,7 +103,7 @@ public: Expected getName() const; Expected getFullName() const; Expected getRawName() const { return Header.getRawName(); } - Expected getLastModified() const { + Expected> getLastModified() const { return Header.getLastModified(); } StringRef getRawLastModified() const { diff --git a/include/llvm/Object/ArchiveWriter.h b/include/llvm/Object/ArchiveWriter.h index cabccc89685..6b4084351dd 100644 --- a/include/llvm/Object/ArchiveWriter.h +++ b/include/llvm/Object/ArchiveWriter.h @@ -22,7 +22,7 @@ namespace llvm { struct NewArchiveMember { std::unique_ptr Buf; - sys::TimeValue ModTime = sys::TimeValue::PosixZeroTime(); + sys::TimePoint ModTime; unsigned UID = 0, GID = 0, Perms = 0644; NewArchiveMember() = default; diff --git a/lib/Object/Archive.cpp b/lib/Object/Archive.cpp index 9a83f69705c..4684c186fb4 100644 --- a/lib/Object/Archive.cpp +++ b/lib/Object/Archive.cpp @@ -239,7 +239,8 @@ Expected ArchiveMemberHeader::getAccessMode() const { return static_cast(Ret); } -Expected ArchiveMemberHeader::getLastModified() const { +Expected> +ArchiveMemberHeader::getLastModified() const { unsigned Seconds; if (StringRef(ArMemHdr->LastModified, sizeof(ArMemHdr->LastModified)).rtrim(' ') @@ -256,9 +257,7 @@ Expected ArchiveMemberHeader::getLastModified() const { "archive member header at offset " + Twine(Offset)); } - sys::TimeValue Ret; - Ret.fromEpochTime(Seconds); - return Ret; + return sys::toTimePoint(Seconds); } Expected ArchiveMemberHeader::getUID() const { diff --git a/lib/Object/ArchiveWriter.cpp b/lib/Object/ArchiveWriter.cpp index 4ede536169e..a7cd95f5fdb 100644 --- a/lib/Object/ArchiveWriter.cpp +++ b/lib/Object/ArchiveWriter.cpp @@ -47,7 +47,7 @@ NewArchiveMember::getOldMember(const object::Archive::Child &OldMember, NewArchiveMember M; M.Buf = MemoryBuffer::getMemBuffer(*BufOrErr, false); if (!Deterministic) { - Expected ModTimeOrErr = OldMember.getLastModified(); + auto ModTimeOrErr = OldMember.getLastModified(); if (!ModTimeOrErr) return ModTimeOrErr.takeError(); M.ModTime = ModTimeOrErr.get(); @@ -95,7 +95,8 @@ Expected NewArchiveMember::getFile(StringRef FileName, NewArchiveMember M; M.Buf = std::move(*MemberBufferOrErr); if (!Deterministic) { - M.ModTime = Status.getLastModificationTime(); + M.ModTime = std::chrono::time_point_cast( + Status.getLastModificationTime()); M.UID = Status.getUser(); M.GID = Status.getGroup(); M.Perms = Status.permissions(); @@ -127,11 +128,10 @@ static void print32(raw_ostream &Out, object::Archive::Kind Kind, support::endian::Writer(Out).write(Val); } -static void printRestOfMemberHeader(raw_fd_ostream &Out, - const sys::TimeValue &ModTime, unsigned UID, - unsigned GID, unsigned Perms, - unsigned Size) { - printWithSpacePadding(Out, ModTime.toEpochTime(), 12); +static void printRestOfMemberHeader( + raw_fd_ostream &Out, const sys::TimePoint &ModTime, + unsigned UID, unsigned GID, unsigned Perms, unsigned Size) { + printWithSpacePadding(Out, sys::toTimeT(ModTime), 12); printWithSpacePadding(Out, UID, 6, true); printWithSpacePadding(Out, GID, 6, true); printWithSpacePadding(Out, format("%o", Perms), 8); @@ -139,17 +139,20 @@ static void printRestOfMemberHeader(raw_fd_ostream &Out, Out << "`\n"; } -static void printGNUSmallMemberHeader(raw_fd_ostream &Out, StringRef Name, - const sys::TimeValue &ModTime, - unsigned UID, unsigned GID, - unsigned Perms, unsigned Size) { +static void +printGNUSmallMemberHeader(raw_fd_ostream &Out, StringRef Name, + const sys::TimePoint &ModTime, + unsigned UID, unsigned GID, unsigned Perms, + unsigned Size) { printWithSpacePadding(Out, Twine(Name) + "/", 16); printRestOfMemberHeader(Out, ModTime, UID, GID, Perms, Size); } -static void printBSDMemberHeader(raw_fd_ostream &Out, StringRef Name, - const sys::TimeValue &ModTime, unsigned UID, - unsigned GID, unsigned Perms, unsigned Size) { +static void +printBSDMemberHeader(raw_fd_ostream &Out, StringRef Name, + const sys::TimePoint &ModTime, + unsigned UID, unsigned GID, unsigned Perms, + unsigned Size) { uint64_t PosAfterHeader = Out.tell() + 60 + Name.size(); // Pad so that even 64 bit object files are aligned. unsigned Pad = OffsetToAlignment(PosAfterHeader, 8); @@ -171,8 +174,8 @@ static void printMemberHeader(raw_fd_ostream &Out, object::Archive::Kind Kind, bool Thin, StringRef Name, std::vector::iterator &StringMapIndexIter, - const sys::TimeValue &ModTime, unsigned UID, unsigned GID, - unsigned Perms, unsigned Size) { + const sys::TimePoint &ModTime, + unsigned UID, unsigned GID, unsigned Perms, unsigned Size) { if (Kind == object::Archive::K_BSD) return printBSDMemberHeader(Out, Name, ModTime, UID, GID, Perms, Size); if (!useStringTable(Thin, Name)) @@ -239,12 +242,12 @@ static void writeStringTable(raw_fd_ostream &Out, StringRef ArcName, Out.seek(Pos); } -static sys::TimeValue now(bool Deterministic) { +static sys::TimePoint now(bool Deterministic) { + using namespace std::chrono; + if (!Deterministic) - return sys::TimeValue::now(); - sys::TimeValue TV; - TV.fromEpochTime(0); - return TV; + return time_point_cast(system_clock::now()); + return sys::TimePoint(); } // Returns the offset of the first reference to a member offset. diff --git a/tools/llvm-ar/llvm-ar.cpp b/tools/llvm-ar/llvm-ar.cpp index 18a5f2497f4..a59eec9cf9f 100644 --- a/tools/llvm-ar/llvm-ar.cpp +++ b/tools/llvm-ar/llvm-ar.cpp @@ -528,7 +528,7 @@ static InsertAction computeInsertAction(ArchiveOperation Operation, failIfError(sys::fs::status(*MI, Status), *MI); auto ModTimeOrErr = Member.getLastModified(); failIfError(ModTimeOrErr.takeError()); - if (sys::TimeValue(Status.getLastModificationTime()) < ModTimeOrErr.get()) { + if (Status.getLastModificationTime() < ModTimeOrErr.get()) { if (PosName.empty()) return IA_AddOldMember; return IA_MoveOldMember; -- 2.40.0