From: Rafael Espindola Date: Mon, 2 May 2016 13:45:06 +0000 (+0000) Subject: Expose a getFullName for thin archive members. X-Git-Tag: llvmorg-3.9.0-rc1~7288 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=694210cddc71784aed884989cb8804a9b0d1946e;p=platform%2Fupstream%2Fllvm.git Expose a getFullName for thin archive members. It will be used in lld. llvm-svn: 268226 --- diff --git a/llvm/include/llvm/Object/Archive.h b/llvm/include/llvm/Object/Archive.h index 6dd8c51..dc2066d 100644 --- a/llvm/include/llvm/Object/Archive.h +++ b/llvm/include/llvm/Object/Archive.h @@ -78,6 +78,7 @@ public: ErrorOr getNext() const; ErrorOr getName() const; + ErrorOr getFullName() const; StringRef getRawName() const { return getHeader()->getName(); } sys::TimeValue getLastModified() const { return getHeader()->getLastModified(); diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp index 47e497a..4ea1057 100644 --- a/llvm/lib/Object/Archive.cpp +++ b/llvm/lib/Object/Archive.cpp @@ -135,6 +135,21 @@ bool Archive::Child::isThinMember() const { return Parent->IsThin && Name != "/" && Name != "//"; } +ErrorOr Archive::Child::getFullName() const { + assert(isThinMember()); + ErrorOr 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 Archive::Child::getBuffer() const { if (!isThinMember()) { ErrorOr Size = getSize(); @@ -142,17 +157,10 @@ ErrorOr Archive::Child::getBuffer() const { return EC; return StringRef(Data.data() + StartOfFile, Size.get()); } - ErrorOr Name = getName(); - if (std::error_code EC = Name.getError()) + ErrorOr 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> Buf = MemoryBuffer::getFile(FullName); if (std::error_code EC = Buf.getError()) return EC;