diff options
| author | Owen Reynolds <gbreynoo@gmail.com> | 2019-06-04 10:13:03 +0000 |
|---|---|---|
| committer | Owen Reynolds <gbreynoo@gmail.com> | 2019-06-04 10:13:03 +0000 |
| commit | 5d5078e341f593944d9badd53e374e6b319282da (patch) | |
| tree | fb8ff535fd53402c5d82253f8c11143aed9ca321 /llvm/tools/llvm-ar/llvm-ar.cpp | |
| parent | 3018d505a3643f1b191da1e2cc99493708ede186 (diff) | |
| download | bcm5719-llvm-5d5078e341f593944d9badd53e374e6b319282da.tar.gz bcm5719-llvm-5d5078e341f593944d9badd53e374e6b319282da.zip | |
[llvm-ar] Reapply Fix relative thin archive path handling
Includes a fix for an introduced build failure due to a post c++11 use of std::mismatch.
This fixes some thin archive relative path issues, paths are shortened where possible and paths are output correctly when using the display table command.
Differential Revision: https://reviews.llvm.org/D59491
llvm-svn: 362484
Diffstat (limited to 'llvm/tools/llvm-ar/llvm-ar.cpp')
| -rw-r--r-- | llvm/tools/llvm-ar/llvm-ar.cpp | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp index 04c2396a4fa..0731f35ac45 100644 --- a/llvm/tools/llvm-ar/llvm-ar.cpp +++ b/llvm/tools/llvm-ar/llvm-ar.cpp @@ -464,9 +464,11 @@ static void doDisplayTable(StringRef Name, const object::Archive::Child &C) { } if (C.getParent()->isThin()) { - StringRef ParentDir = sys::path::parent_path(ArchiveName); - if (!ParentDir.empty()) - outs() << ParentDir << '/'; + if (!sys::path::is_absolute(Name)) { + StringRef ParentDir = sys::path::parent_path(ArchiveName); + if (!ParentDir.empty()) + outs() << sys::path::convert_to_slash(ParentDir) << '/'; + } } outs() << Name << "\n"; } @@ -593,10 +595,18 @@ static void addChildMember(std::vector<NewArchiveMember> &Members, // the archive it's in, so the file resolves correctly. if (Thin && FlattenArchive) { StringSaver Saver(Alloc); - Expected<std::string> FileNameOrErr = M.getFullName(); + Expected<std::string> FileNameOrErr = M.getName(); failIfError(FileNameOrErr.takeError()); - NMOrErr->MemberName = - Saver.save(computeArchiveRelativePath(ArchiveName, *FileNameOrErr)); + if (sys::path::is_absolute(*FileNameOrErr)) { + NMOrErr->MemberName = Saver.save(sys::path::convert_to_slash(*FileNameOrErr)); + } else { + FileNameOrErr = M.getFullName(); + failIfError(FileNameOrErr.takeError()); + Expected<std::string> PathOrErr = + computeArchiveRelativePath(ArchiveName, *FileNameOrErr); + NMOrErr->MemberName = Saver.save( + PathOrErr ? *PathOrErr : sys::path::convert_to_slash(*FileNameOrErr)); + } } if (FlattenArchive && identify_magic(NMOrErr->Buf->getBuffer()) == file_magic::archive) { @@ -625,9 +635,19 @@ static void addMember(std::vector<NewArchiveMember> &Members, // For regular archives, use the basename of the object path for the member // name. For thin archives, use the full relative paths so the file resolves // correctly. - NMOrErr->MemberName = - Thin ? Saver.save(computeArchiveRelativePath(ArchiveName, FileName)) - : sys::path::filename(NMOrErr->MemberName); + if (!Thin) { + NMOrErr->MemberName = sys::path::filename(NMOrErr->MemberName); + } else { + if (sys::path::is_absolute(FileName)) + NMOrErr->MemberName = Saver.save(sys::path::convert_to_slash(FileName)); + else { + Expected<std::string> PathOrErr = + computeArchiveRelativePath(ArchiveName, FileName); + NMOrErr->MemberName = Saver.save( + PathOrErr ? *PathOrErr : sys::path::convert_to_slash(FileName)); + } + } + if (FlattenArchive && identify_magic(NMOrErr->Buf->getBuffer()) == file_magic::archive) { object::Archive &Lib = readLibrary(FileName); |

