diff options
| author | Peter Collingbourne <peter@pcc.me.uk> | 2016-03-31 22:08:31 +0000 |
|---|---|---|
| committer | Peter Collingbourne <peter@pcc.me.uk> | 2016-03-31 22:08:31 +0000 |
| commit | f84646cd9585c6aa87edf3069bc54721cdee7f6a (patch) | |
| tree | 184ece5ce1831a78088756ce1372f519eb34d12d /llvm | |
| parent | 800ed436e543997e061348ec5b700a45b3b3d675 (diff) | |
| download | bcm5719-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
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Object/Archive.cpp | 11 | ||||
| -rw-r--r-- | llvm/test/Object/archive-thin-read.test | 5 |
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 |

