summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2017-11-21 01:52:44 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2017-11-21 01:52:44 +0000
commit5908affee9a96df72480d7cb963d6412a91556a2 (patch)
treea83bd27f708cc7a9357702657873fc5d493c6e5c /llvm/lib
parent9596bdb88c8460652b58d5448f039d381825af23 (diff)
downloadbcm5719-llvm-5908affee9a96df72480d7cb963d6412a91556a2.tar.gz
bcm5719-llvm-5908affee9a96df72480d7cb963d6412a91556a2.zip
Split a rename_handle out of rename on windows.
llvm-svn: 318725
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Support/Windows/Path.inc16
1 files changed, 13 insertions, 3 deletions
diff --git a/llvm/lib/Support/Windows/Path.inc b/llvm/lib/Support/Windows/Path.inc
index df39ac7e757..18306251fdc 100644
--- a/llvm/lib/Support/Windows/Path.inc
+++ b/llvm/lib/Support/Windows/Path.inc
@@ -418,14 +418,13 @@ static std::error_code rename_internal(HANDLE FromHandle, const Twine &To,
return std::error_code();
}
+static std::error_code rename_handle(HANDLE Handle, const Twine &To);
+
std::error_code rename(const Twine &From, const Twine &To) {
// Convert to utf-16.
SmallVector<wchar_t, 128> WideFrom;
- SmallVector<wchar_t, 128> WideTo;
if (std::error_code EC = widenPath(From, WideFrom))
return EC;
- if (std::error_code EC = widenPath(To, WideTo))
- return EC;
ScopedFileHandle FromHandle;
// Retry this a few times to defeat badly behaved file system scanners.
@@ -442,6 +441,14 @@ std::error_code rename(const Twine &From, const Twine &To) {
if (!FromHandle)
return mapWindowsError(GetLastError());
+ return rename_handle(FromHandle, To);
+}
+
+static std::error_code rename_handle(HANDLE FromHandle, const Twine &To) {
+ SmallVector<wchar_t, 128> WideTo;
+ if (std::error_code EC = widenPath(To, WideTo))
+ return EC;
+
// We normally expect this loop to succeed after a few iterations. If it
// requires more than 200 tries, it's more likely that the failures are due to
// a true error, so stop trying.
@@ -452,6 +459,9 @@ std::error_code rename(const Twine &From, const Twine &To) {
std::error_code(ERROR_CALL_NOT_IMPLEMENTED, std::system_category())) {
// Wine doesn't support SetFileInformationByHandle in rename_internal.
// Fall back to MoveFileEx.
+ SmallVector<wchar_t, MAX_PATH> WideFrom;
+ if (std::error_code EC2 = realPathFromHandle(FromHandle, WideFrom))
+ return EC2;
if (::MoveFileExW(WideFrom.begin(), WideTo.begin(),
MOVEFILE_REPLACE_EXISTING))
return std::error_code();
OpenPOWER on IntegriCloud