summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Object/ArchiveWriter.cpp
diff options
context:
space:
mode:
authorDmitri Gribenko <gribozavr@gmail.com>2019-06-03 16:21:37 +0000
committerDmitri Gribenko <gribozavr@gmail.com>2019-06-03 16:21:37 +0000
commit857de979a7e43f26973351931b93a3879a09ec5a (patch)
tree86b92cc246e83d6b219952bd74d98c4ef79155d7 /llvm/lib/Object/ArchiveWriter.cpp
parent009d08f313c46915930ca617946033a487933b73 (diff)
downloadbcm5719-llvm-857de979a7e43f26973351931b93a3879a09ec5a.tar.gz
bcm5719-llvm-857de979a7e43f26973351931b93a3879a09ec5a.zip
Revert "[llvm-ar] Fix relative thin archive path handling"
This reverts commit r362407. It broke compilation of llvm/lib/Object/ArchiveWriter.cpp: error: type 'llvm::sys::path::const_iterator' does not provide a call operator llvm-svn: 362413
Diffstat (limited to 'llvm/lib/Object/ArchiveWriter.cpp')
-rw-r--r--llvm/lib/Object/ArchiveWriter.cpp51
1 files changed, 17 insertions, 34 deletions
diff --git a/llvm/lib/Object/ArchiveWriter.cpp b/llvm/lib/Object/ArchiveWriter.cpp
index 68c40054bb9..849d2835772 100644
--- a/llvm/lib/Object/ArchiveWriter.cpp
+++ b/llvm/lib/Object/ArchiveWriter.cpp
@@ -494,46 +494,29 @@ computeMemberData(raw_ostream &StringTable, raw_ostream &SymNames,
}
namespace llvm {
-
-static ErrorOr<SmallString<128>> canonicalizePath(StringRef P) {
- SmallString<128> Ret = P;
- std::error_code Err = sys::fs::make_absolute(Ret);
- if (Err)
- return Err;
- sys::path::remove_dots(Ret, /*removedotdot*/ true);
- return Ret;
-}
-
// Compute the relative path from From to To.
-Expected<std::string> computeArchiveRelativePath(StringRef From, StringRef To) {
- ErrorOr<SmallString<128>> PathToOrErr = canonicalizePath(To);
- ErrorOr<SmallString<128>> DirFromOrErr = canonicalizePath(From);
- if (!PathToOrErr || !DirFromOrErr)
- return errorCodeToError(std::error_code(errno, std::generic_category()));
-
- const SmallString<128> &PathTo = *PathToOrErr;
- const SmallString<128> &DirFrom = sys::path::parent_path(*DirFromOrErr);
-
- // Can't construct a relative path between different roots
- if (sys::path::root_name(PathTo) != sys::path::root_name(DirFrom))
- return sys::path::convert_to_slash(PathTo);
-
- // Skip common prefixes
- auto FromTo =
- std::mismatch(sys::path::begin(DirFrom), sys::path::end(DirFrom),
- sys::path::begin(PathTo), sys::path::end(PathTo));
- auto FromI = FromTo.first;
- auto ToI = FromTo.second;
+std::string computeArchiveRelativePath(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;
+ }
- // Construct relative path
SmallString<128> Relative;
for (auto FromE = sys::path::end(DirFrom); FromI != FromE; ++FromI)
- sys::path::append(Relative, sys::path::Style::posix, "..");
+ sys::path::append(Relative, "..");
- for (auto ToE = sys::path::end(PathTo); ToI != ToE; ++ToI)
- sys::path::append(Relative, sys::path::Style::posix, *ToI);
+ for (auto ToE = sys::path::end(To); ToI != ToE; ++ToI)
+ sys::path::append(Relative, *ToI);
- return Relative.str();
+ // Replace backslashes with slashes so that the path is portable between *nix
+ // and Windows.
+ return sys::path::convert_to_slash(Relative);
}
Error writeArchive(StringRef ArcName, ArrayRef<NewArchiveMember> NewMembers,
OpenPOWER on IntegriCloud