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) {
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;
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;
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/
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 `