diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2015-10-05 13:02:43 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2015-10-05 13:02:43 +0000 |
commit | ae1d59967dc2c8bc09b3b60afc13754b45ec0ede (patch) | |
tree | 8014b4226f2bacabcb5b988ab2f2006951a73b64 | |
parent | eda554a9b426f456366b41d53e1d85d879da1026 (diff) | |
download | bcm5719-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.h | 14 | ||||
-rw-r--r-- | llvm/lib/Support/Path.cpp | 17 | ||||
-rw-r--r-- | llvm/unittests/Support/Path.cpp | 4 |
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 ¤t_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 ¤t_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 ¤t_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) { |