summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Object/ArchiveWriter.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-07-16 00:14:49 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-07-16 00:14:49 +0000
commit06d6d1905e9c7eafc2cf3500047afa5d82a29eb7 (patch)
tree3db0499f31d11f634875212220ffc69fc8df70de /llvm/lib/Object/ArchiveWriter.cpp
parente3c816173635a3604870b25dd80a0451db93799b (diff)
downloadbcm5719-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
Diffstat (limited to 'llvm/lib/Object/ArchiveWriter.cpp')
-rw-r--r--llvm/lib/Object/ArchiveWriter.cpp35
1 files changed, 32 insertions, 3 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;
OpenPOWER on IntegriCloud