summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2013-09-11 10:45:21 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2013-09-11 10:45:21 +0000
commitf37a324baa7f3893111827f03959fc036da1ed23 (patch)
treec5bb21098432c9f2475dcab1abb76dc3d721f481
parentece929d6234b73ea248b7a5e89f915613ad748ea (diff)
downloadllvm-f37a324baa7f3893111827f03959fc036da1ed23.tar.gz
llvm-f37a324baa7f3893111827f03959fc036da1ed23.tar.bz2
llvm-f37a324baa7f3893111827f03959fc036da1ed23.tar.xz
Path: Add an in-place version of path::native.
This reflects the common use case of nativizing a prepared path. The existing version invokes undefined behavior if input = output, add an assert to catch that case. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190510 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/Support/Path.h7
-rw-r--r--lib/Support/Path.cpp23
2 files changed, 16 insertions, 14 deletions
diff --git a/include/llvm/Support/Path.h b/include/llvm/Support/Path.h
index f9a65e533a..b2afe1b8e8 100644
--- a/include/llvm/Support/Path.h
+++ b/include/llvm/Support/Path.h
@@ -173,6 +173,13 @@ void append(SmallVectorImpl<char> &path,
/// @param result Holds the result of the transformation.
void native(const Twine &path, SmallVectorImpl<char> &result);
+/// Convert path to the native form in place. This is used to give paths to
+/// users and operating system calls in the platform's normal way. For example,
+/// on Windows all '/' are converted to '\'.
+///
+/// @param path A path that is transformed to native format.
+void native(SmallVectorImpl<char> &path);
+
/// @}
/// @name Lexical Observers
/// @{
diff --git a/lib/Support/Path.cpp b/lib/Support/Path.cpp
index 366fb84933..8d707aedde 100644
--- a/lib/Support/Path.cpp
+++ b/lib/Support/Path.cpp
@@ -449,23 +449,18 @@ void replace_extension(SmallVectorImpl<char> &path, const Twine &extension) {
}
void native(const Twine &path, SmallVectorImpl<char> &result) {
+ assert((!path.isSingleStringRef() ||
+ path.getSingleStringRef().data() != result.data()) &&
+ "path and result are not allowed to overlap!");
// Clear result.
result.clear();
-#ifdef LLVM_ON_WIN32
- SmallString<128> path_storage;
- StringRef p = path.toStringRef(path_storage);
- result.reserve(p.size());
- for (StringRef::const_iterator i = p.begin(),
- e = p.end();
- i != e;
- ++i) {
- if (*i == '/')
- result.push_back('\\');
- else
- result.push_back(*i);
- }
-#else
path.toVector(result);
+ native(result);
+}
+
+void native(SmallVectorImpl<char> &path) {
+#ifdef LLVM_ON_WIN32
+ std::replace(path.begin(), path.end(), '/', '\\');
#endif
}