summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-ar/llvm-ar.cpp
diff options
context:
space:
mode:
authorVedant Kumar <vsk@apple.com>2016-08-03 19:02:50 +0000
committerVedant Kumar <vsk@apple.com>2016-08-03 19:02:50 +0000
commit4031d9f80e67c4e36c233e1c390dabed994e9316 (patch)
treee5242d81491fb0453dfb82b7a611a176368ae75a /llvm/tools/llvm-ar/llvm-ar.cpp
parent43aeb001c959098167dec6272160ee73d187067c (diff)
downloadbcm5719-llvm-4031d9f80e67c4e36c233e1c390dabed994e9316.tar.gz
bcm5719-llvm-4031d9f80e67c4e36c233e1c390dabed994e9316.zip
Reapply "More fixes to get good error messages for bad archives."
This reverts commit the revert commit r277627. The build errors mentioned in r277627 were likely caused by an unclean build directory. Sorry for the noise. llvm-svn: 277630
Diffstat (limited to 'llvm/tools/llvm-ar/llvm-ar.cpp')
-rw-r--r--llvm/tools/llvm-ar/llvm-ar.cpp31
1 files changed, 23 insertions, 8 deletions
diff --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp
index f52f9c376c1..cf2f98f83e1 100644
--- a/llvm/tools/llvm-ar/llvm-ar.cpp
+++ b/llvm/tools/llvm-ar/llvm-ar.cpp
@@ -338,16 +338,24 @@ static void printMode(unsigned mode) {
// modification time are also printed.
static void doDisplayTable(StringRef Name, const object::Archive::Child &C) {
if (Verbose) {
- sys::fs::perms Mode = C.getAccessMode();
+ Expected<sys::fs::perms> ModeOrErr = C.getAccessMode();
+ failIfError(ModeOrErr.takeError());
+ sys::fs::perms Mode = ModeOrErr.get();
printMode((Mode >> 6) & 007);
printMode((Mode >> 3) & 007);
printMode(Mode & 007);
- outs() << ' ' << C.getUID();
- outs() << '/' << C.getGID();
+ Expected<unsigned> UIDOrErr = C.getUID();
+ failIfError(UIDOrErr.takeError());
+ outs() << ' ' << UIDOrErr.get();
+ Expected<unsigned> GIDOrErr = C.getGID();
+ failIfError(GIDOrErr.takeError());
+ outs() << '/' << GIDOrErr.get();
Expected<uint64_t> Size = C.getSize();
failIfError(Size.takeError());
outs() << ' ' << format("%6llu", Size.get());
- outs() << ' ' << C.getLastModified().str();
+ Expected<sys::TimeValue> ModTimeOrErr = C.getLastModified();
+ failIfError(ModTimeOrErr.takeError());
+ outs() << ' ' << ModTimeOrErr.get().str();
outs() << ' ';
}
outs() << Name << "\n";
@@ -357,7 +365,9 @@ static void doDisplayTable(StringRef Name, const object::Archive::Child &C) {
// system.
static void doExtract(StringRef Name, const object::Archive::Child &C) {
// Retain the original mode.
- sys::fs::perms Mode = C.getAccessMode();
+ Expected<sys::fs::perms> ModeOrErr = C.getAccessMode();
+ failIfError(ModeOrErr.takeError());
+ sys::fs::perms Mode = ModeOrErr.get();
int FD;
failIfError(sys::fs::openFileForWrite(Name, FD, sys::fs::F_None, Mode), Name);
@@ -374,9 +384,12 @@ static void doExtract(StringRef Name, const object::Archive::Child &C) {
// If we're supposed to retain the original modification times, etc. do so
// now.
- if (OriginalDates)
+ if (OriginalDates) {
+ Expected<sys::TimeValue> ModTimeOrErr = C.getLastModified();
+ failIfError(ModTimeOrErr.takeError());
failIfError(
- sys::fs::setLastModificationAndAccessTime(FD, C.getLastModified()));
+ sys::fs::setLastModificationAndAccessTime(FD, ModTimeOrErr.get()));
+ }
if (close(FD))
fail("Could not close the file");
@@ -511,7 +524,9 @@ static InsertAction computeInsertAction(ArchiveOperation Operation,
// operation.
sys::fs::file_status Status;
failIfError(sys::fs::status(*MI, Status), *MI);
- if (Status.getLastModificationTime() < Member.getLastModified()) {
+ Expected<sys::TimeValue> ModTimeOrErr = Member.getLastModified();
+ failIfError(ModTimeOrErr.takeError());
+ if (Status.getLastModificationTime() < ModTimeOrErr.get()) {
if (PosName.empty())
return IA_AddOldMember;
return IA_MoveOldMember;
OpenPOWER on IntegriCloud