summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2016-03-31 22:08:31 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2016-03-31 22:08:31 +0000
commitf84646cd9585c6aa87edf3069bc54721cdee7f6a (patch)
tree184ece5ce1831a78088756ce1372f519eb34d12d
parent800ed436e543997e061348ec5b700a45b3b3d675 (diff)
downloadbcm5719-llvm-f84646cd9585c6aa87edf3069bc54721cdee7f6a.tar.gz
bcm5719-llvm-f84646cd9585c6aa87edf3069bc54721cdee7f6a.zip
Object: Correctly read thin archives containing absolute paths.
Differential Revision: http://reviews.llvm.org/D18666 llvm-svn: 265065
-rw-r--r--llvm/lib/Object/Archive.cpp11
-rw-r--r--llvm/test/Object/archive-thin-read.test5
2 files changed, 13 insertions, 3 deletions
diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp
index 28fd27cdb9b..9c8e3dbe2bd 100644
--- a/llvm/lib/Object/Archive.cpp
+++ b/llvm/lib/Object/Archive.cpp
@@ -146,9 +146,14 @@ ErrorOr<StringRef> Archive::Child::getBuffer() const {
ErrorOr<StringRef> Name = getName();
if (std::error_code EC = Name.getError())
return EC;
- SmallString<128> FullName = sys::path::parent_path(
- Parent->getMemoryBufferRef().getBufferIdentifier());
- sys::path::append(FullName, *Name);
+ SmallString<128> FullName;
+ if (sys::path::is_absolute(*Name))
+ FullName = *Name;
+ else {
+ FullName = sys::path::parent_path(
+ Parent->getMemoryBufferRef().getBufferIdentifier());
+ sys::path::append(FullName, *Name);
+ }
ErrorOr<std::unique_ptr<MemoryBuffer>> Buf = MemoryBuffer::getFile(FullName);
if (std::error_code EC = Buf.getError())
return EC;
diff --git a/llvm/test/Object/archive-thin-read.test b/llvm/test/Object/archive-thin-read.test
new file mode 100644
index 00000000000..a61f6c569d2
--- /dev/null
+++ b/llvm/test/Object/archive-thin-read.test
@@ -0,0 +1,5 @@
+RUN: echo hello > %t.file
+RUN: llvm-ar rcsT %t.a %t.file
+RUN: llvm-ar p %t.a | FileCheck %s
+
+CHECK: hello
OpenPOWER on IntegriCloud