summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/tools/llvm-ar/llvm-ar.cpp
diff options
context:
space:
mode:
authorpatrick <patrick@openbsd.org>2017-01-24 08:32:59 +0000
committerpatrick <patrick@openbsd.org>2017-01-24 08:32:59 +0000
commit53d771aafdbe5b919f264f53cba3788e2c4cffd2 (patch)
tree7eca39498be0ff1e3a6daf583cd9ca5886bb2636 /gnu/llvm/tools/llvm-ar/llvm-ar.cpp
parentIn preparation of compiling our kernels with -ffreestanding, explicitly map (diff)
downloadwireguard-openbsd-53d771aafdbe5b919f264f53cba3788e2c4cffd2.tar.xz
wireguard-openbsd-53d771aafdbe5b919f264f53cba3788e2c4cffd2.zip
Import LLVM 4.0.0 rc1 including clang and lld to help the current
development effort on OpenBSD/arm64.
Diffstat (limited to 'gnu/llvm/tools/llvm-ar/llvm-ar.cpp')
-rw-r--r--gnu/llvm/tools/llvm-ar/llvm-ar.cpp77
1 files changed, 50 insertions, 27 deletions
diff --git a/gnu/llvm/tools/llvm-ar/llvm-ar.cpp b/gnu/llvm/tools/llvm-ar/llvm-ar.cpp
index 865152b6af8..b99a396da62 100644
--- a/gnu/llvm/tools/llvm-ar/llvm-ar.cpp
+++ b/gnu/llvm/tools/llvm-ar/llvm-ar.cpp
@@ -21,6 +21,7 @@
#include "llvm/Object/ArchiveWriter.h"
#include "llvm/Object/MachO.h"
#include "llvm/Object/ObjectFile.h"
+#include "llvm/Support/Chrono.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Errc.h"
#include "llvm/Support/FileSystem.h"
@@ -93,7 +94,7 @@ static cl::opt<Format>
FormatOpt("format", cl::desc("Archive format to create"),
cl::values(clEnumValN(Default, "default", "default"),
clEnumValN(GNU, "gnu", "gnu"),
- clEnumValN(BSD, "bsd", "bsd"), clEnumValEnd));
+ clEnumValN(BSD, "bsd", "bsd")));
static std::string Options;
@@ -116,6 +117,7 @@ static cl::extrahelp MoreHelp(
" [o] - preserve original dates\n"
" [s] - create an archive index (cf. ranlib)\n"
" [S] - do not build a symbol table\n"
+ " [T] - create a thin archive\n"
" [u] - update only files newer than archive contents\n"
"\nMODIFIERS (generic):\n"
" [c] - do not warn if the library had to be created\n"
@@ -317,8 +319,8 @@ static void doPrint(StringRef Name, const object::Archive::Child &C) {
if (Verbose)
outs() << "Printing " << Name << "\n";
- ErrorOr<StringRef> DataOrErr = C.getBuffer();
- failIfError(DataOrErr.getError());
+ Expected<StringRef> DataOrErr = C.getBuffer();
+ failIfError(DataOrErr.takeError());
StringRef Data = *DataOrErr;
outs().write(Data.data(), Data.size());
}
@@ -337,18 +339,31 @@ 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();
- ErrorOr<uint64_t> Size = C.getSize();
- failIfError(Size.getError());
+ 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();
+ auto ModTimeOrErr = C.getLastModified();
+ failIfError(ModTimeOrErr.takeError());
+ outs() << ' ' << ModTimeOrErr.get();
outs() << ' ';
}
+
+ if (C.getParent()->isThin()) {
+ outs() << sys::path::parent_path(ArchiveName);
+ outs() << '/';
+ }
outs() << Name << "\n";
}
@@ -356,7 +371,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);
@@ -365,7 +382,9 @@ static void doExtract(StringRef Name, const object::Archive::Child &C) {
raw_fd_ostream file(FD, false);
// Get the data and its length
- StringRef Data = *C.getBuffer();
+ Expected<StringRef> BufOrErr = C.getBuffer();
+ failIfError(BufOrErr.takeError());
+ StringRef Data = BufOrErr.get();
// Write the data.
file.write(Data.data(), Data.size());
@@ -373,9 +392,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) {
+ auto 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");
@@ -406,14 +428,14 @@ static void performReadOperation(ArchiveOperation Operation,
bool Filter = !Members.empty();
{
- Error Err;
+ Error Err = Error::success();
for (auto &C : OldArchive->children(Err)) {
- ErrorOr<StringRef> NameOrErr = C.getName();
- failIfError(NameOrErr.getError());
+ Expected<StringRef> NameOrErr = C.getName();
+ failIfError(NameOrErr.takeError());
StringRef Name = NameOrErr.get();
if (Filter) {
- auto I = std::find(Members.begin(), Members.end(), Name);
+ auto I = find(Members, Name);
if (I == Members.end())
continue;
Members.erase(I);
@@ -482,10 +504,9 @@ static InsertAction computeInsertAction(ArchiveOperation Operation,
if (Operation == QuickAppend || Members.empty())
return IA_AddOldMember;
- auto MI =
- std::find_if(Members.begin(), Members.end(), [Name](StringRef Path) {
- return Name == sys::path::filename(Path);
- });
+ auto MI = find_if(Members, [Name](StringRef Path) {
+ return Name == sys::path::filename(Path);
+ });
if (MI == Members.end())
return IA_AddOldMember;
@@ -510,7 +531,9 @@ static InsertAction computeInsertAction(ArchiveOperation Operation,
// operation.
sys::fs::file_status Status;
failIfError(sys::fs::status(*MI, Status), *MI);
- if (Status.getLastModificationTime() < Member.getLastModified()) {
+ auto ModTimeOrErr = Member.getLastModified();
+ failIfError(ModTimeOrErr.takeError());
+ if (Status.getLastModificationTime() < ModTimeOrErr.get()) {
if (PosName.empty())
return IA_AddOldMember;
return IA_MoveOldMember;
@@ -533,11 +556,11 @@ computeNewArchiveMembers(ArchiveOperation Operation,
int InsertPos = -1;
StringRef PosName = sys::path::filename(RelPos);
if (OldArchive) {
- Error Err;
+ Error Err = Error::success();
for (auto &Child : OldArchive->children(Err)) {
int Pos = Ret.size();
- ErrorOr<StringRef> NameOrErr = Child.getName();
- failIfError(NameOrErr.getError());
+ Expected<StringRef> NameOrErr = Child.getName();
+ failIfError(NameOrErr.takeError());
StringRef Name = NameOrErr.get();
if (Name == PosName) {
assert(AddAfter || AddBefore);
@@ -705,7 +728,7 @@ static int performOperation(ArchiveOperation Operation,
fail("error opening '" + ArchiveName + "': " + EC.message() + "!");
if (!EC) {
- Error Err;
+ Error Err = Error::success();
object::Archive Archive(Buf.get()->getMemBufferRef(), Err);
EC = errorToErrorCode(std::move(Err));
failIfError(EC,
@@ -767,7 +790,7 @@ static void runMRIScript() {
Archives.push_back(std::move(*LibOrErr));
object::Archive &Lib = *Archives.back();
{
- Error Err;
+ Error Err = Error::success();
for (auto &Member : Lib.children(Err))
addMember(NewMembers, Member);
failIfError(std::move(Err));