diff options
author | Kevin Enderby <enderby@apple.com> | 2016-08-02 22:58:55 +0000 |
---|---|---|
committer | Kevin Enderby <enderby@apple.com> | 2016-08-02 22:58:55 +0000 |
commit | 395cc09444b114bfb0f860bcd5c3d0365e7ca18c (patch) | |
tree | 4226a5b54049be8f2c34517cc70b6c84bb52535c /llvm/tools/llvm-ar/llvm-ar.cpp | |
parent | ee0627fd1b9f89d6320b186f038bf14fbf6e8468 (diff) | |
download | bcm5719-llvm-395cc09444b114bfb0f860bcd5c3d0365e7ca18c.tar.gz bcm5719-llvm-395cc09444b114bfb0f860bcd5c3d0365e7ca18c.zip |
More fixes to get good error messages for bad archives.
Fixed the last incorrect uses of llvm_unreachable() in the code
which were actually just cases of errors in the input Archives.
llvm-svn: 277540
Diffstat (limited to 'llvm/tools/llvm-ar/llvm-ar.cpp')
-rw-r--r-- | llvm/tools/llvm-ar/llvm-ar.cpp | 31 |
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; |