[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 llvm-svn: 284974
This commit is contained in:
@@ -18,11 +18,11 @@
|
|||||||
#include "llvm/ADT/StringRef.h"
|
#include "llvm/ADT/StringRef.h"
|
||||||
#include "llvm/ADT/iterator_range.h"
|
#include "llvm/ADT/iterator_range.h"
|
||||||
#include "llvm/Object/Binary.h"
|
#include "llvm/Object/Binary.h"
|
||||||
|
#include "llvm/Support/Chrono.h"
|
||||||
#include "llvm/Support/Error.h"
|
#include "llvm/Support/Error.h"
|
||||||
#include "llvm/Support/ErrorHandling.h"
|
#include "llvm/Support/ErrorHandling.h"
|
||||||
#include "llvm/Support/FileSystem.h"
|
#include "llvm/Support/FileSystem.h"
|
||||||
#include "llvm/Support/MemoryBuffer.h"
|
#include "llvm/Support/MemoryBuffer.h"
|
||||||
#include "llvm/Support/TimeValue.h"
|
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
namespace object {
|
namespace object {
|
||||||
@@ -46,7 +46,7 @@ public:
|
|||||||
Expected<uint32_t> getSize() const;
|
Expected<uint32_t> getSize() const;
|
||||||
|
|
||||||
Expected<sys::fs::perms> getAccessMode() const;
|
Expected<sys::fs::perms> getAccessMode() const;
|
||||||
Expected<sys::TimeValue> getLastModified() const;
|
Expected<sys::TimePoint<std::chrono::seconds>> getLastModified() const;
|
||||||
llvm::StringRef getRawLastModified() const {
|
llvm::StringRef getRawLastModified() const {
|
||||||
return StringRef(ArMemHdr->LastModified,
|
return StringRef(ArMemHdr->LastModified,
|
||||||
sizeof(ArMemHdr->LastModified)).rtrim(' ');
|
sizeof(ArMemHdr->LastModified)).rtrim(' ');
|
||||||
@@ -103,7 +103,7 @@ public:
|
|||||||
Expected<StringRef> getName() const;
|
Expected<StringRef> getName() const;
|
||||||
Expected<std::string> getFullName() const;
|
Expected<std::string> getFullName() const;
|
||||||
Expected<StringRef> getRawName() const { return Header.getRawName(); }
|
Expected<StringRef> getRawName() const { return Header.getRawName(); }
|
||||||
Expected<sys::TimeValue> getLastModified() const {
|
Expected<sys::TimePoint<std::chrono::seconds>> getLastModified() const {
|
||||||
return Header.getLastModified();
|
return Header.getLastModified();
|
||||||
}
|
}
|
||||||
StringRef getRawLastModified() const {
|
StringRef getRawLastModified() const {
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ namespace llvm {
|
|||||||
|
|
||||||
struct NewArchiveMember {
|
struct NewArchiveMember {
|
||||||
std::unique_ptr<MemoryBuffer> Buf;
|
std::unique_ptr<MemoryBuffer> Buf;
|
||||||
sys::TimeValue ModTime = sys::TimeValue::PosixZeroTime();
|
sys::TimePoint<std::chrono::seconds> ModTime;
|
||||||
unsigned UID = 0, GID = 0, Perms = 0644;
|
unsigned UID = 0, GID = 0, Perms = 0644;
|
||||||
|
|
||||||
NewArchiveMember() = default;
|
NewArchiveMember() = default;
|
||||||
|
|||||||
@@ -239,7 +239,8 @@ Expected<sys::fs::perms> ArchiveMemberHeader::getAccessMode() const {
|
|||||||
return static_cast<sys::fs::perms>(Ret);
|
return static_cast<sys::fs::perms>(Ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
Expected<sys::TimeValue> ArchiveMemberHeader::getLastModified() const {
|
Expected<sys::TimePoint<std::chrono::seconds>>
|
||||||
|
ArchiveMemberHeader::getLastModified() const {
|
||||||
unsigned Seconds;
|
unsigned Seconds;
|
||||||
if (StringRef(ArMemHdr->LastModified,
|
if (StringRef(ArMemHdr->LastModified,
|
||||||
sizeof(ArMemHdr->LastModified)).rtrim(' ')
|
sizeof(ArMemHdr->LastModified)).rtrim(' ')
|
||||||
@@ -256,9 +257,7 @@ Expected<sys::TimeValue> ArchiveMemberHeader::getLastModified() const {
|
|||||||
"archive member header at offset " + Twine(Offset));
|
"archive member header at offset " + Twine(Offset));
|
||||||
}
|
}
|
||||||
|
|
||||||
sys::TimeValue Ret;
|
return sys::toTimePoint(Seconds);
|
||||||
Ret.fromEpochTime(Seconds);
|
|
||||||
return Ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Expected<unsigned> ArchiveMemberHeader::getUID() const {
|
Expected<unsigned> ArchiveMemberHeader::getUID() const {
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ NewArchiveMember::getOldMember(const object::Archive::Child &OldMember,
|
|||||||
NewArchiveMember M;
|
NewArchiveMember M;
|
||||||
M.Buf = MemoryBuffer::getMemBuffer(*BufOrErr, false);
|
M.Buf = MemoryBuffer::getMemBuffer(*BufOrErr, false);
|
||||||
if (!Deterministic) {
|
if (!Deterministic) {
|
||||||
Expected<sys::TimeValue> ModTimeOrErr = OldMember.getLastModified();
|
auto ModTimeOrErr = OldMember.getLastModified();
|
||||||
if (!ModTimeOrErr)
|
if (!ModTimeOrErr)
|
||||||
return ModTimeOrErr.takeError();
|
return ModTimeOrErr.takeError();
|
||||||
M.ModTime = ModTimeOrErr.get();
|
M.ModTime = ModTimeOrErr.get();
|
||||||
@@ -95,7 +95,8 @@ Expected<NewArchiveMember> NewArchiveMember::getFile(StringRef FileName,
|
|||||||
NewArchiveMember M;
|
NewArchiveMember M;
|
||||||
M.Buf = std::move(*MemberBufferOrErr);
|
M.Buf = std::move(*MemberBufferOrErr);
|
||||||
if (!Deterministic) {
|
if (!Deterministic) {
|
||||||
M.ModTime = Status.getLastModificationTime();
|
M.ModTime = std::chrono::time_point_cast<std::chrono::seconds>(
|
||||||
|
Status.getLastModificationTime());
|
||||||
M.UID = Status.getUser();
|
M.UID = Status.getUser();
|
||||||
M.GID = Status.getGroup();
|
M.GID = Status.getGroup();
|
||||||
M.Perms = Status.permissions();
|
M.Perms = Status.permissions();
|
||||||
@@ -127,11 +128,10 @@ static void print32(raw_ostream &Out, object::Archive::Kind Kind,
|
|||||||
support::endian::Writer<support::little>(Out).write(Val);
|
support::endian::Writer<support::little>(Out).write(Val);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void printRestOfMemberHeader(raw_fd_ostream &Out,
|
static void printRestOfMemberHeader(
|
||||||
const sys::TimeValue &ModTime, unsigned UID,
|
raw_fd_ostream &Out, const sys::TimePoint<std::chrono::seconds> &ModTime,
|
||||||
unsigned GID, unsigned Perms,
|
unsigned UID, unsigned GID, unsigned Perms, unsigned Size) {
|
||||||
unsigned Size) {
|
printWithSpacePadding(Out, sys::toTimeT(ModTime), 12);
|
||||||
printWithSpacePadding(Out, ModTime.toEpochTime(), 12);
|
|
||||||
printWithSpacePadding(Out, UID, 6, true);
|
printWithSpacePadding(Out, UID, 6, true);
|
||||||
printWithSpacePadding(Out, GID, 6, true);
|
printWithSpacePadding(Out, GID, 6, true);
|
||||||
printWithSpacePadding(Out, format("%o", Perms), 8);
|
printWithSpacePadding(Out, format("%o", Perms), 8);
|
||||||
@@ -139,17 +139,20 @@ static void printRestOfMemberHeader(raw_fd_ostream &Out,
|
|||||||
Out << "`\n";
|
Out << "`\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
static void printGNUSmallMemberHeader(raw_fd_ostream &Out, StringRef Name,
|
static void
|
||||||
const sys::TimeValue &ModTime,
|
printGNUSmallMemberHeader(raw_fd_ostream &Out, StringRef Name,
|
||||||
unsigned UID, unsigned GID,
|
const sys::TimePoint<std::chrono::seconds> &ModTime,
|
||||||
unsigned Perms, unsigned Size) {
|
unsigned UID, unsigned GID, unsigned Perms,
|
||||||
|
unsigned Size) {
|
||||||
printWithSpacePadding(Out, Twine(Name) + "/", 16);
|
printWithSpacePadding(Out, Twine(Name) + "/", 16);
|
||||||
printRestOfMemberHeader(Out, ModTime, UID, GID, Perms, Size);
|
printRestOfMemberHeader(Out, ModTime, UID, GID, Perms, Size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void printBSDMemberHeader(raw_fd_ostream &Out, StringRef Name,
|
static void
|
||||||
const sys::TimeValue &ModTime, unsigned UID,
|
printBSDMemberHeader(raw_fd_ostream &Out, StringRef Name,
|
||||||
unsigned GID, unsigned Perms, unsigned Size) {
|
const sys::TimePoint<std::chrono::seconds> &ModTime,
|
||||||
|
unsigned UID, unsigned GID, unsigned Perms,
|
||||||
|
unsigned Size) {
|
||||||
uint64_t PosAfterHeader = Out.tell() + 60 + Name.size();
|
uint64_t PosAfterHeader = Out.tell() + 60 + Name.size();
|
||||||
// Pad so that even 64 bit object files are aligned.
|
// Pad so that even 64 bit object files are aligned.
|
||||||
unsigned Pad = OffsetToAlignment(PosAfterHeader, 8);
|
unsigned Pad = OffsetToAlignment(PosAfterHeader, 8);
|
||||||
@@ -171,8 +174,8 @@ static void
|
|||||||
printMemberHeader(raw_fd_ostream &Out, object::Archive::Kind Kind, bool Thin,
|
printMemberHeader(raw_fd_ostream &Out, object::Archive::Kind Kind, bool Thin,
|
||||||
StringRef Name,
|
StringRef Name,
|
||||||
std::vector<unsigned>::iterator &StringMapIndexIter,
|
std::vector<unsigned>::iterator &StringMapIndexIter,
|
||||||
const sys::TimeValue &ModTime, unsigned UID, unsigned GID,
|
const sys::TimePoint<std::chrono::seconds> &ModTime,
|
||||||
unsigned Perms, unsigned Size) {
|
unsigned UID, unsigned GID, unsigned Perms, unsigned Size) {
|
||||||
if (Kind == object::Archive::K_BSD)
|
if (Kind == object::Archive::K_BSD)
|
||||||
return printBSDMemberHeader(Out, Name, ModTime, UID, GID, Perms, Size);
|
return printBSDMemberHeader(Out, Name, ModTime, UID, GID, Perms, Size);
|
||||||
if (!useStringTable(Thin, Name))
|
if (!useStringTable(Thin, Name))
|
||||||
@@ -239,12 +242,12 @@ static void writeStringTable(raw_fd_ostream &Out, StringRef ArcName,
|
|||||||
Out.seek(Pos);
|
Out.seek(Pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
static sys::TimeValue now(bool Deterministic) {
|
static sys::TimePoint<std::chrono::seconds> now(bool Deterministic) {
|
||||||
|
using namespace std::chrono;
|
||||||
|
|
||||||
if (!Deterministic)
|
if (!Deterministic)
|
||||||
return sys::TimeValue::now();
|
return time_point_cast<seconds>(system_clock::now());
|
||||||
sys::TimeValue TV;
|
return sys::TimePoint<seconds>();
|
||||||
TV.fromEpochTime(0);
|
|
||||||
return TV;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the offset of the first reference to a member offset.
|
// Returns the offset of the first reference to a member offset.
|
||||||
|
|||||||
@@ -528,7 +528,7 @@ static InsertAction computeInsertAction(ArchiveOperation Operation,
|
|||||||
failIfError(sys::fs::status(*MI, Status), *MI);
|
failIfError(sys::fs::status(*MI, Status), *MI);
|
||||||
auto ModTimeOrErr = Member.getLastModified();
|
auto ModTimeOrErr = Member.getLastModified();
|
||||||
failIfError(ModTimeOrErr.takeError());
|
failIfError(ModTimeOrErr.takeError());
|
||||||
if (sys::TimeValue(Status.getLastModificationTime()) < ModTimeOrErr.get()) {
|
if (Status.getLastModificationTime() < ModTimeOrErr.get()) {
|
||||||
if (PosName.empty())
|
if (PosName.empty())
|
||||||
return IA_AddOldMember;
|
return IA_AddOldMember;
|
||||||
return IA_MoveOldMember;
|
return IA_MoveOldMember;
|
||||||
|
|||||||
Reference in New Issue
Block a user