[llvm] 4d44394 - Support: Avoid SmallVector::set_size() in Windows code
Duncan P. N. Exon Smith via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 11 17:56:40 PST 2022
Author: Duncan P. N. Exon Smith
Date: 2022-01-11T17:52:41-08:00
New Revision: 4d4439470eaf015784b76fc84cd5373456ce3d5c
URL: https://github.com/llvm/llvm-project/commit/4d4439470eaf015784b76fc84cd5373456ce3d5c
DIFF: https://github.com/llvm/llvm-project/commit/4d4439470eaf015784b76fc84cd5373456ce3d5c.diff
LOG: Support: Avoid SmallVector::set_size() in Windows code
Replace a few `reserve()` / `set_size()` pairs with
`resize_for_overwrite()` / `truncate()` in the platform-specific
code for Windows.
Differential Revision: https://reviews.llvm.org/D115390
Added:
Modified:
llvm/lib/Support/Windows/Path.inc
llvm/lib/Support/Windows/Process.inc
llvm/lib/Support/Windows/Program.inc
Removed:
################################################################################
diff --git a/llvm/lib/Support/Windows/Path.inc b/llvm/lib/Support/Windows/Path.inc
index 175a96a8ba6c9..5f1a364ea1a8e 100644
--- a/llvm/lib/Support/Windows/Path.inc
+++ b/llvm/lib/Support/Windows/Path.inc
@@ -132,7 +132,8 @@ const file_t kInvalidFile = INVALID_HANDLE_VALUE;
std::string getMainExecutable(const char *argv0, void *MainExecAddr) {
SmallVector<wchar_t, MAX_PATH> PathName;
- DWORD Size = ::GetModuleFileNameW(NULL, PathName.data(), PathName.capacity());
+ PathName.resize_for_overwrite(PathName.capacity());
+ DWORD Size = ::GetModuleFileNameW(NULL, PathName.data(), PathName.size());
// A zero return value indicates a failure other than insufficient space.
if (Size == 0)
@@ -145,7 +146,7 @@ std::string getMainExecutable(const char *argv0, void *MainExecAddr) {
// On success, GetModuleFileNameW returns the number of characters written to
// the buffer not including the NULL terminator.
- PathName.set_size(Size);
+ PathName.truncate(Size);
// Convert the result from UTF-16 to UTF-8.
SmallVector<char, MAX_PATH> PathNameUTF8;
@@ -201,8 +202,8 @@ std::error_code current_path(SmallVectorImpl<char> &result) {
DWORD len = MAX_PATH;
do {
- cur_path.reserve(len);
- len = ::GetCurrentDirectoryW(cur_path.capacity(), cur_path.data());
+ cur_path.resize_for_overwrite(len);
+ len = ::GetCurrentDirectoryW(cur_path.size(), cur_path.data());
// A zero return value indicates a failure other than insufficient space.
if (len == 0)
@@ -210,11 +211,11 @@ std::error_code current_path(SmallVectorImpl<char> &result) {
// If there's insufficient space, the len returned is larger than the len
// given.
- } while (len > cur_path.capacity());
+ } while (len > cur_path.size());
// On success, GetCurrentDirectoryW returns the number of characters not
// including the null-terminator.
- cur_path.set_size(len);
+ cur_path.truncate(len);
if (std::error_code EC =
UTF16ToUTF8(cur_path.begin(), cur_path.size(), result))
@@ -328,7 +329,7 @@ static std::error_code is_local_internal(SmallVectorImpl<wchar_t> &Path,
// the null terminator, it will leave the output unterminated. Push a null
// terminator onto the end to ensure that this never happens.
VolumePath.push_back(L'\0');
- VolumePath.set_size(wcslen(VolumePath.data()));
+ VolumePath.truncate(wcslen(VolumePath.data()));
const wchar_t *P = VolumePath.data();
UINT Type = ::GetDriveTypeW(P);
@@ -364,18 +365,19 @@ std::error_code is_local(const Twine &path, bool &result) {
static std::error_code realPathFromHandle(HANDLE H,
SmallVectorImpl<wchar_t> &Buffer) {
+ Buffer.resize_for_overwrite(Buffer.capacity());
DWORD CountChars = ::GetFinalPathNameByHandleW(
H, Buffer.begin(), Buffer.capacity(), FILE_NAME_NORMALIZED);
if (CountChars && CountChars >= Buffer.capacity()) {
// The buffer wasn't big enough, try again. In this case the return value
// *does* indicate the size of the null terminator.
- Buffer.reserve(CountChars);
+ Buffer.resize_for_overwrite(CountChars);
CountChars = ::GetFinalPathNameByHandleW(
- H, Buffer.begin(), Buffer.capacity(), FILE_NAME_NORMALIZED);
+ H, Buffer.begin(), Buffer.size(), FILE_NAME_NORMALIZED);
}
+ Buffer.truncate(CountChars);
if (CountChars == 0)
return mapWindowsError(GetLastError());
- Buffer.set_size(CountChars);
return std::error_code();
}
@@ -1450,14 +1452,14 @@ static bool getTempDirEnvVar(const wchar_t *Var, SmallVectorImpl<char> &Res) {
SmallVector<wchar_t, 1024> Buf;
size_t Size = 1024;
do {
- Buf.reserve(Size);
- Size = GetEnvironmentVariableW(Var, Buf.data(), Buf.capacity());
+ Buf.resize_for_overwrite(Size);
+ Size = GetEnvironmentVariableW(Var, Buf.data(), Buf.size());
if (Size == 0)
return false;
// Try again with larger buffer.
- } while (Size > Buf.capacity());
- Buf.set_size(Size);
+ } while (Size > Buf.size());
+ Buf.truncate(Size);
return !windows::UTF16ToUTF8(Buf.data(), Size, Res);
}
@@ -1506,7 +1508,7 @@ std::error_code CodePageToUTF16(unsigned codepage,
}
utf16.reserve(len + 1);
- utf16.set_size(len);
+ utf16.resize_for_overwrite(len);
len = ::MultiByteToWideChar(codepage, MB_ERR_INVALID_CHARS, original.begin(),
original.size(), utf16.begin(), utf16.size());
@@ -1546,8 +1548,8 @@ std::error_code UTF16ToCodePage(unsigned codepage, const wchar_t *utf16,
return mapWindowsError(::GetLastError());
}
- converted.reserve(len);
- converted.set_size(len);
+ converted.reserve(len + 1);
+ converted.resize_for_overwrite(len);
// Now do the actual conversion.
len = ::WideCharToMultiByte(codepage, 0, utf16, utf16_len, converted.data(),
diff --git a/llvm/lib/Support/Windows/Process.inc b/llvm/lib/Support/Windows/Process.inc
index 6732063b562e6..dfaab1613de18 100644
--- a/llvm/lib/Support/Windows/Process.inc
+++ b/llvm/lib/Support/Windows/Process.inc
@@ -129,16 +129,16 @@ Optional<std::string> Process::GetEnv(StringRef Name) {
SmallVector<wchar_t, MAX_PATH> Buf;
size_t Size = MAX_PATH;
do {
- Buf.reserve(Size);
+ Buf.resize_for_overwrite(Size);
SetLastError(NO_ERROR);
Size =
- GetEnvironmentVariableW(NameUTF16.data(), Buf.data(), Buf.capacity());
+ GetEnvironmentVariableW(NameUTF16.data(), Buf.data(), Buf.size());
if (Size == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND)
return None;
// Try again with larger buffer.
- } while (Size > Buf.capacity());
- Buf.set_size(Size);
+ } while (Size > Buf.size());
+ Buf.truncate(Size);
// Convert the result from UTF-16 to UTF-8.
SmallVector<char, MAX_PATH> Res;
diff --git a/llvm/lib/Support/Windows/Program.inc b/llvm/lib/Support/Windows/Program.inc
index a9cf2db7ec72d..ee633411584f5 100644
--- a/llvm/lib/Support/Windows/Program.inc
+++ b/llvm/lib/Support/Windows/Program.inc
@@ -72,7 +72,7 @@ ErrorOr<std::string> sys::findProgramByName(StringRef Name,
SmallVector<wchar_t, MAX_PATH> U16Result;
DWORD Len = MAX_PATH;
do {
- U16Result.reserve(Len);
+ U16Result.resize_for_overwrite(Len);
// Lets attach the extension manually. That is needed for files
// with a point in name like aaa.bbb. SearchPathW will not add extension
// from its argument to such files because it thinks they already had one.
@@ -82,13 +82,13 @@ ErrorOr<std::string> sys::findProgramByName(StringRef Name,
return EC;
Len = ::SearchPathW(Path, c_str(U16NameExt), nullptr,
- U16Result.capacity(), U16Result.data(), nullptr);
- } while (Len > U16Result.capacity());
+ U16Result.size(), U16Result.data(), nullptr);
+ } while (Len > U16Result.size());
if (Len == 0)
continue;
- U16Result.set_size(Len);
+ U16Result.truncate(Len);
if (std::error_code EC =
windows::UTF16ToUTF8(U16Result.data(), U16Result.size(), U8Result))
More information about the llvm-commits
mailing list