Index: lld/trunk/include/lld/Core/Reproduce.h =================================================================== --- lld/trunk/include/lld/Core/Reproduce.h +++ lld/trunk/include/lld/Core/Reproduce.h @@ -34,9 +34,6 @@ // Returns the string form of the given argument. std::string toString(llvm::opt::Arg *Arg); - -// Replaces backslashes with slashes if Windows. -std::string convertToUnixPathSeparator(StringRef S); } #endif Index: lld/trunk/lib/Core/Reproduce.cpp =================================================================== --- lld/trunk/lib/Core/Reproduce.cpp +++ lld/trunk/lib/Core/Reproduce.cpp @@ -39,7 +39,7 @@ Res = Root.substr(2); path::append(Res, path::relative_path(Abs)); - return convertToUnixPathSeparator(Res); + return path::convert_to_slash(Res); } // Quote a given string if it contains a space character. @@ -64,13 +64,3 @@ return K + V; return K + " " + V; } - -std::string lld::convertToUnixPathSeparator(StringRef S) { -#ifdef LLVM_ON_WIN32 - std::string Ret = S.str(); - std::replace(Ret.begin(), Ret.end(), '\\', '/'); - return Ret; -#else - return S; -#endif -} Index: llvm/trunk/include/llvm/Support/Path.h =================================================================== --- llvm/trunk/include/llvm/Support/Path.h +++ llvm/trunk/include/llvm/Support/Path.h @@ -207,6 +207,14 @@ /// @param path A path that is transformed to native format. void native(SmallVectorImpl &path); +/// @brief Replaces backslashes with slashes if Windows. +/// +/// @param path processed path +/// @result The result of replacing backslashes with forward slashes if Windows. +/// On Unix, this function is a no-op because backslashes are valid path +/// chracters. +std::string convert_to_slash(StringRef path); + /// @} /// @name Lexical Observers /// @{ Index: llvm/trunk/lib/Support/Path.cpp =================================================================== --- llvm/trunk/lib/Support/Path.cpp +++ llvm/trunk/lib/Support/Path.cpp @@ -571,6 +571,16 @@ #endif } +std::string convert_to_slash(StringRef path) { +#ifdef LLVM_ON_WIN32 + std::string s = path.str(); + std::replace(s.begin(), s.end(), '\\', '/'); + return s; +#else + return path; +#endif +} + StringRef filename(StringRef path) { return *rbegin(path); } Index: llvm/trunk/lib/Support/TarWriter.cpp =================================================================== --- llvm/trunk/lib/Support/TarWriter.cpp +++ llvm/trunk/lib/Support/TarWriter.cpp @@ -26,6 +26,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/MathExtras.h" +#include "llvm/Support/Path.h" using namespace llvm; @@ -147,15 +148,6 @@ OS << StringRef(reinterpret_cast(&Hdr), sizeof(Hdr)); } -// We want to use '/' as a path separator even on Windows. -// This function canonicalizes a given path. -static std::string canonicalize(std::string S) { -#ifdef LLVM_ON_WIN32 - std::replace(S.begin(), S.end(), '\\', '/'); -#endif - return S; -} - // Creates a TarWriter instance and returns it. Expected> TarWriter::create(StringRef OutputPath, StringRef BaseDir) { @@ -171,7 +163,7 @@ // Append a given file to an archive. void TarWriter::append(StringRef Path, StringRef Data) { // Write Path and Data. - std::string S = BaseDir + "/" + canonicalize(Path) + "\0"; + std::string S = BaseDir + "/" + sys::path::convert_to_slash(Path) + "\0"; if (fitsInUstar(S)) { writeUstarHeader(OS, S, Data.size()); } else {