summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2015-10-05 13:02:43 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2015-10-05 13:02:43 +0000
commitae1d59967dc2c8bc09b3b60afc13754b45ec0ede (patch)
tree8014b4226f2bacabcb5b988ab2f2006951a73b64
parenteda554a9b426f456366b41d53e1d85d879da1026 (diff)
downloadbcm5719-llvm-ae1d59967dc2c8bc09b3b60afc13754b45ec0ede.tar.gz
bcm5719-llvm-ae1d59967dc2c8bc09b3b60afc13754b45ec0ede.zip
[Support] Add a version of fs::make_absolute with a custom CWD.
This will be used soon from clang. llvm-svn: 249309
-rw-r--r--llvm/include/llvm/Support/FileSystem.h14
-rw-r--r--llvm/lib/Support/Path.cpp17
-rw-r--r--llvm/unittests/Support/Path.cpp4
3 files changed, 33 insertions, 2 deletions
diff --git a/llvm/include/llvm/Support/FileSystem.h b/llvm/include/llvm/Support/FileSystem.h
index 48a2f0a748b..84d7e85b381 100644
--- a/llvm/include/llvm/Support/FileSystem.h
+++ b/llvm/include/llvm/Support/FileSystem.h
@@ -268,6 +268,20 @@ private:
/// @brief Make \a path an absolute path.
///
+/// Makes \a path absolute using the \a current_directory if it is not already.
+/// An empty \a path will result in the \a current_directory.
+///
+/// /absolute/path => /absolute/path
+/// relative/../path => <current-directory>/relative/../path
+///
+/// @param path A path that is modified to be an absolute path.
+/// @returns errc::success if \a path has been made absolute, otherwise a
+/// platform-specific error_code.
+std::error_code make_absolute(const Twine &current_directory,
+ SmallVectorImpl<char> &path);
+
+/// @brief Make \a path an absolute path.
+///
/// Makes \a path absolute using the current directory if it is not already. An
/// empty \a path will result in the current directory.
///
diff --git a/llvm/lib/Support/Path.cpp b/llvm/lib/Support/Path.cpp
index aa96074554e..653a984194a 100644
--- a/llvm/lib/Support/Path.cpp
+++ b/llvm/lib/Support/Path.cpp
@@ -740,7 +740,9 @@ std::error_code createUniqueDirectory(const Twine &Prefix,
true, 0, FS_Dir);
}
-std::error_code make_absolute(SmallVectorImpl<char> &path) {
+static std::error_code make_absolute(const Twine &current_directory,
+ SmallVectorImpl<char> &path,
+ bool use_current_directory) {
StringRef p(path.data(), path.size());
bool rootDirectory = path::has_root_directory(p),
@@ -756,7 +758,9 @@ std::error_code make_absolute(SmallVectorImpl<char> &path) {
// All of the following conditions will need the current directory.
SmallString<128> current_dir;
- if (std::error_code ec = current_path(current_dir))
+ if (use_current_directory)
+ current_directory.toVector(current_dir);
+ else if (std::error_code ec = current_path(current_dir))
return ec;
// Relative path. Prepend the current directory.
@@ -793,6 +797,15 @@ std::error_code make_absolute(SmallVectorImpl<char> &path) {
"occurred above!");
}
+std::error_code make_absolute(const Twine &current_directory,
+ SmallVectorImpl<char> &path) {
+ return make_absolute(current_directory, path, true);
+}
+
+std::error_code make_absolute(SmallVectorImpl<char> &path) {
+ return make_absolute(Twine(), path, false);
+}
+
std::error_code create_directories(const Twine &Path, bool IgnoreExisting,
perms Perms) {
SmallString<128> PathStorage;
diff --git a/llvm/unittests/Support/Path.cpp b/llvm/unittests/Support/Path.cpp
index a4d2ab1bfc8..f35682e19b7 100644
--- a/llvm/unittests/Support/Path.cpp
+++ b/llvm/unittests/Support/Path.cpp
@@ -150,6 +150,10 @@ TEST(Support, Path) {
path::native(*i, temp_store);
}
+
+ SmallString<32> Relative("foo.cpp");
+ ASSERT_NO_ERROR(sys::fs::make_absolute("/root", Relative));
+ ASSERT_EQ("/root/foo.cpp", Relative);
}
TEST(Support, RelativePathIterator) {
OpenPOWER on IntegriCloud