mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-27 13:40:30 +00:00
Fix handling of relative paths in thin archives.
The member has to end up with a path relative to the archive. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242362 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
076d176640
commit
6a37b479b3
@ -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;
|
||||
|
@ -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 `
|
||||
|
Loading…
Reference in New Issue
Block a user