diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-07-16 00:14:49 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-07-16 00:14:49 +0000 |
| commit | 06d6d1905e9c7eafc2cf3500047afa5d82a29eb7 (patch) | |
| tree | 3db0499f31d11f634875212220ffc69fc8df70de | |
| parent | e3c816173635a3604870b25dd80a0451db93799b (diff) | |
| download | bcm5719-llvm-06d6d1905e9c7eafc2cf3500047afa5d82a29eb7.tar.gz bcm5719-llvm-06d6d1905e9c7eafc2cf3500047afa5d82a29eb7.zip | |
Fix handling of relative paths in thin archives.
The member has to end up with a path relative to the archive.
llvm-svn: 242362
| -rw-r--r-- | llvm/lib/Object/ArchiveWriter.cpp | 35 | ||||
| -rw-r--r-- | llvm/test/Object/archive-format.test | 21 |
2 files changed, 50 insertions, 6 deletions
diff --git a/llvm/lib/Object/ArchiveWriter.cpp b/llvm/lib/Object/ArchiveWriter.cpp index fd06c6e8687..274ff2ddc56 100644 --- a/llvm/lib/Object/ArchiveWriter.cpp +++ b/llvm/lib/Object/ArchiveWriter.cpp @@ -154,7 +154,30 @@ printMemberHeader(raw_fd_ostream &Out, object::Archive::Kind Kind, bool Thin, printRestOfMemberHeader(Out, ModTime, UID, GID, Perms, Size); } -static void writeStringTable(raw_fd_ostream &Out, +// Compute the relative path from From to To. +static std::string computeRelativePath(StringRef From, StringRef To) { + if (sys::path::is_absolute(From) || sys::path::is_absolute(To)) + return To; + + StringRef DirFrom = sys::path::parent_path(From); + auto FromI = sys::path::begin(DirFrom); + auto ToI = sys::path::begin(To); + while (*FromI == *ToI) { + ++FromI; + ++ToI; + } + + SmallString<128> Relative; + for (auto FromE = sys::path::end(DirFrom); FromI != FromE; ++FromI) + sys::path::append(Relative, ".."); + + for (auto ToE = sys::path::end(To); ToI != ToE; ++ToI) + sys::path::append(Relative, *ToI); + + return Relative.str(); +} + +static void writeStringTable(raw_fd_ostream &Out, StringRef ArcName, ArrayRef<NewArchiveIterator> Members, std::vector<unsigned> &StringMapIndexes, bool Thin) { @@ -169,7 +192,13 @@ static void writeStringTable(raw_fd_ostream &Out, StartOffset = Out.tell(); } StringMapIndexes.push_back(Out.tell() - StartOffset); - Out << Name << "/\n"; + + if (Thin) + Out << computeRelativePath(ArcName, I.getName()); + else + Out << Name; + + Out << "/\n"; } if (StartOffset == 0) return; @@ -340,7 +369,7 @@ llvm::writeArchive(StringRef ArcName, std::vector<unsigned> StringMapIndexes; if (Kind != object::Archive::K_BSD) - writeStringTable(Out, NewMembers, StringMapIndexes, Thin); + writeStringTable(Out, ArcName, NewMembers, StringMapIndexes, Thin); unsigned MemberNum = 0; unsigned NewMemberNum = 0; diff --git a/llvm/test/Object/archive-format.test b/llvm/test/Object/archive-format.test index e40ec332734..cb58bd528b7 100644 --- a/llvm/test/Object/archive-format.test +++ b/llvm/test/Object/archive-format.test @@ -37,9 +37,9 @@ BSD-NEXT: 0123456789abcde{{.....}}bar. BSD-SAME: #1/16 0 0 0 644 20 ` BSD-NEXT: 0123456789abcdefzed. -RUN: rm -f %t.a -RUN: llvm-ar --format=gnu rcT %t.a 0123456789abcde 0123456789abcdef -RUN: cat %t.a | FileCheck -strict-whitespace --check-prefix=THIN %s +RUN: rm -f test.a +RUN: llvm-ar --format=gnu rcT test.a 0123456789abcde 0123456789abcdef +RUN: cat test.a | FileCheck -strict-whitespace --check-prefix=THIN %s THIN: !<thin> THIN-NEXT: // 36 ` THIN-NEXT: 0123456789abcde/ @@ -47,3 +47,18 @@ THIN-NEXT: 0123456789abcdef/{{$}} THIN: {{^$}} THIN: /0 0 0 0 644 4 ` THIN-NEXT: /17 0 0 0 644 4 ` + +RUN: mkdir -p bar +RUN: rm -f bar/test.a +RUN: llvm-ar --format=gnu rcT bar/test.a 0123456789abcde 0123456789abcdef foo/0123456789abcde foo/0123456789abcdef +RUN: cat bar/test.a | FileCheck -strict-whitespace --check-prefix=THIN-PATH %s +THIN-PATH: !<thin> +THIN-PATH-NEXT: // 90 ` +THIN-PATH-NEXT: ../0123456789abcde/ +THIN-PATH-NEXT: ../0123456789abcdef/ +THIN-PATH-NEXT: ../foo/0123456789abcde/ +THIN-PATH-NEXT: ../foo/0123456789abcdef/ +THIN-PATH-NEXT: /0 0 0 0 644 4 ` +THIN-PATH-NEXT: /20 0 0 0 644 4 ` +THIN-PATH-NEXT: /41 0 0 0 644 4 ` +THIN-PATH-NEXT: /65 0 0 0 644 4 ` |

