OSDN Git Service

Object: Correctly read thin archives containing absolute paths.
authorPeter Collingbourne <peter@pcc.me.uk>
Thu, 31 Mar 2016 22:08:31 +0000 (22:08 +0000)
committerPeter Collingbourne <peter@pcc.me.uk>
Thu, 31 Mar 2016 22:08:31 +0000 (22:08 +0000)
Differential Revision: http://reviews.llvm.org/D18666

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@265065 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Object/Archive.cpp
test/Object/archive-thin-read.test [new file with mode: 0644]

index 28fd27c..9c8e3db 100644 (file)
@@ -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/test/Object/archive-thin-read.test b/test/Object/archive-thin-read.test
new file mode 100644 (file)
index 0000000..a61f6c5
--- /dev/null
@@ -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