summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Rupprecht <rupprecht@google.com>2019-01-15 21:52:31 +0000
committerJordan Rupprecht <rupprecht@google.com>2019-01-15 21:52:31 +0000
commit0312aa990f8df2a902280e4c70cb1d381453460c (patch)
tree4f33ac793f2b8539077a93db807f7a4607838a2e
parent25d4a0d08dc5d7045d657e04e70f05669c68c782 (diff)
[llvm-ar] Resubmit recursive thin archive test with fix for full path names and better error messages
-rw-r--r--llvm/test/tools/llvm-ar/flatten-thin-archive-recursive.test13
-rw-r--r--llvm/tools/llvm-ar/llvm-ar.cpp12
2 files changed, 20 insertions, 5 deletions
diff --git a/llvm/test/tools/llvm-ar/flatten-thin-archive-recursive.test b/llvm/test/tools/llvm-ar/flatten-thin-archive-recursive.test
new file mode 100644
index 00000000000..fdd752d48b2
--- /dev/null
+++ b/llvm/test/tools/llvm-ar/flatten-thin-archive-recursive.test
@@ -0,0 +1,13 @@
+# Since llvm-ar cannot create thin archives that contain any thin archives,
+# nested-thin-archive.a is a manually constructed thin archive that contains
+# another (unflattened) thin archive.
+# This test ensures that flat archives are recursively flattened.
+
+RUN: rm -f %t.a
+RUN: llvm-ar rcsT %t.a %S/Inputs/nested-thin-archive.a %S/Inputs/d.txt
+RUN: llvm-ar t %t.a | FileCheck %s
+
+CHECK: a.txt
+CHECK-NEXT: b.txt
+CHECK-NEXT: c.txt
+CHECK-NEXT: d.txt
diff --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp
index 15a1edebb13..1c453ee0b56 100644
--- a/llvm/tools/llvm-ar/llvm-ar.cpp
+++ b/llvm/tools/llvm-ar/llvm-ar.cpp
@@ -33,6 +33,7 @@
#include "llvm/Support/StringSaver.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Support/ToolOutputFile.h"
+#include "llvm/Support/WithColor.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/ToolDrivers/llvm-dlltool/DlltoolDriver.h"
#include "llvm/ToolDrivers/llvm-lib/LibDriver.h"
@@ -115,7 +116,7 @@ void printHelpMessage() {
// Show the error message and exit.
LLVM_ATTRIBUTE_NORETURN static void fail(Twine Error) {
- errs() << ToolName << ": " << Error << ".\n";
+ WithColor::error(errs(), ToolName) << Error << ".\n";
printHelpMessage();
exit(1);
}
@@ -221,7 +222,7 @@ std::vector<std::unique_ptr<object::Archive>> Archives;
static object::Archive &readLibrary(const Twine &Library) {
auto BufOrErr = MemoryBuffer::getFile(Library, -1, false);
- failIfError(BufOrErr.getError(), "Could not open library");
+ failIfError(BufOrErr.getError(), "Could not open library " + Library);
ArchiveBuffers.push_back(std::move(*BufOrErr));
auto LibOrErr =
object::Archive::create(ArchiveBuffers.back()->getMemBufferRef());
@@ -532,7 +533,7 @@ static void performReadOperation(ArchiveOperation Operation,
if (Members.empty())
return;
for (StringRef Name : Members)
- errs() << Name << " was not found\n";
+ WithColor::error(errs(), ToolName) << "'" << Name << "' was not found\n";
exit(1);
}
@@ -546,7 +547,7 @@ static void addChildMember(std::vector<NewArchiveMember> &Members,
failIfError(NMOrErr.takeError());
if (FlattenArchive &&
identify_magic(NMOrErr->Buf->getBuffer()) == file_magic::archive) {
- Expected<StringRef> FileNameOrErr = M.getName();
+ Expected<std::string> FileNameOrErr = M.getFullName();
failIfError(FileNameOrErr.takeError());
object::Archive &Lib = readLibrary(*FileNameOrErr);
// When creating thin archives, only flatten if the member is also thin.
@@ -853,7 +854,8 @@ static int performOperation(ArchiveOperation Operation,
} else {
if (!Create) {
// Produce a warning if we should and we're creating the archive
- errs() << ToolName << ": creating " << ArchiveName << "\n";
+ WithColor::warning(errs(), ToolName)
+ << "creating " << ArchiveName << "\n";
}
}