Expose a getFullName for thin archive members.
authorRafael Espindola <rafael.espindola@gmail.com>
Mon, 2 May 2016 13:45:06 +0000 (13:45 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Mon, 2 May 2016 13:45:06 +0000 (13:45 +0000)
It will be used in lld.

llvm-svn: 268226

llvm/include/llvm/Object/Archive.h
llvm/lib/Object/Archive.cpp

index 6dd8c51..dc2066d 100644 (file)
@@ -78,6 +78,7 @@ public:
     ErrorOr<Child> getNext() const;
 
     ErrorOr<StringRef> getName() const;
+    ErrorOr<std::string> getFullName() const;
     StringRef getRawName() const { return getHeader()->getName(); }
     sys::TimeValue getLastModified() const {
       return getHeader()->getLastModified();
index 47e497a..4ea1057 100644 (file)
@@ -135,6 +135,21 @@ bool Archive::Child::isThinMember() const {
   return Parent->IsThin && Name != "/" && Name != "//";
 }
 
+ErrorOr<std::string> Archive::Child::getFullName() const {
+  assert(isThinMember());
+  ErrorOr<StringRef> NameOrErr = getName();
+  if (std::error_code EC = NameOrErr.getError())
+    return EC;
+  StringRef Name = *NameOrErr;
+  if (sys::path::is_absolute(Name))
+    return Name;
+
+  SmallString<128> FullName = sys::path::parent_path(
+      Parent->getMemoryBufferRef().getBufferIdentifier());
+  sys::path::append(FullName, Name);
+  return StringRef(FullName);
+}
+
 ErrorOr<StringRef> Archive::Child::getBuffer() const {
   if (!isThinMember()) {
     ErrorOr<uint32_t> Size = getSize();
@@ -142,17 +157,10 @@ ErrorOr<StringRef> Archive::Child::getBuffer() const {
       return EC;
     return StringRef(Data.data() + StartOfFile, Size.get());
   }
-  ErrorOr<StringRef> Name = getName();
-  if (std::error_code EC = Name.getError())
+  ErrorOr<std::string> FullNameOrEr = getFullName();
+  if (std::error_code EC = FullNameOrEr.getError())
     return EC;
-  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);
-  }
+  const std::string &FullName = *FullNameOrEr;
   ErrorOr<std::unique_ptr<MemoryBuffer>> Buf = MemoryBuffer::getFile(FullName);
   if (std::error_code EC = Buf.getError())
     return EC;