From: David Majnemer Date: Sun, 6 Oct 2013 20:44:34 +0000 (+0000) Subject: Revert "Windows: Add support for unicode command lines" X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=b262556c45bb7b3add826bc3f050c99db6990c37;p=oota-llvm.git Revert "Windows: Add support for unicode command lines" This is causing MinGW bots to fail. This reverts commit r192069. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@192070 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/autoconf/configure.ac b/autoconf/configure.ac index 85eee54bf39..45f2fe485ec 100644 --- a/autoconf/configure.ac +++ b/autoconf/configure.ac @@ -1399,7 +1399,6 @@ AC_CHECK_LIB(m,sin) if test "$llvm_cv_os_type" = "MingW" ; then AC_CHECK_LIB(imagehlp, main) AC_CHECK_LIB(psapi, main) - AC_CHECK_LIB(shell32, main) fi dnl dlopen() is required for plugin support. diff --git a/cmake/config-ix.cmake b/cmake/config-ix.cmake index dc991a23be0..57725f83af9 100755 --- a/cmake/config-ix.cmake +++ b/cmake/config-ix.cmake @@ -415,7 +415,6 @@ endif () if( MINGW ) set(HAVE_LIBIMAGEHLP 1) set(HAVE_LIBPSAPI 1) - set(HAVE_LIBSHELL32 1) # TODO: Check existence of libraries. # include(CheckLibraryExists) # CHECK_LIBRARY_EXISTS(imagehlp ??? . HAVE_LIBIMAGEHLP) diff --git a/cmake/modules/LLVM-Config.cmake b/cmake/modules/LLVM-Config.cmake index e26fabd1c6f..9fa45ce966a 100644 --- a/cmake/modules/LLVM-Config.cmake +++ b/cmake/modules/LLVM-Config.cmake @@ -2,7 +2,7 @@ function(get_system_libs return_var) # Returns in `return_var' a list of system libraries used by LLVM. if( NOT MSVC ) if( MINGW ) - set(system_libs ${system_libs} imagehlp psapi shell32) + set(system_libs ${system_libs} imagehlp psapi) elseif( CMAKE_HOST_UNIX ) if( HAVE_LIBRT ) set(system_libs ${system_libs} rt) diff --git a/cmake/modules/TableGen.cmake b/cmake/modules/TableGen.cmake index c17e67e478e..bbd6339ac8c 100644 --- a/cmake/modules/TableGen.cmake +++ b/cmake/modules/TableGen.cmake @@ -128,7 +128,7 @@ macro(add_tablegen target project) endif() if( MINGW ) - target_link_libraries(${target} imagehlp psapi shell32) + target_link_libraries(${target} imagehlp psapi) if(CMAKE_SIZEOF_VOID_P MATCHES "8") set_target_properties(${target} PROPERTIES LINK_FLAGS -Wl,--stack,16777216) endif(CMAKE_SIZEOF_VOID_P MATCHES "8") diff --git a/include/llvm/Config/config.h.cmake b/include/llvm/Config/config.h.cmake index 4c49cbb8c37..77de967f905 100644 --- a/include/llvm/Config/config.h.cmake +++ b/include/llvm/Config/config.h.cmake @@ -203,9 +203,6 @@ /* Define to 1 if you have the `pthread' library (-lpthread). */ #cmakedefine HAVE_LIBPTHREAD ${HAVE_LIBPTHREAD} -/* Define to 1 if you have the `shell32' library (-lshell32). */ -#cmakedefine HAVE_LIBSHELL32 ${HAVE_LIBSHELL32} - /* Define to 1 if you have the `udis86' library (-ludis86). */ #undef HAVE_LIBUDIS86 diff --git a/include/llvm/Config/config.h.in b/include/llvm/Config/config.h.in index 0d43ae50a14..860bccb8331 100644 --- a/include/llvm/Config/config.h.in +++ b/include/llvm/Config/config.h.in @@ -217,9 +217,6 @@ /* Define to 1 if you have the `pthread' library (-lpthread). */ #undef HAVE_LIBPTHREAD -/* Define to 1 if you have the `shell32' library (-lshell32). */ -#undef HAVE_LIBSHELL32 - /* Define to 1 if you have the `udis86' library (-ludis86). */ #undef HAVE_LIBUDIS86 diff --git a/include/llvm/Support/Process.h b/include/llvm/Support/Process.h index 21720367199..ce39d048bb9 100644 --- a/include/llvm/Support/Process.h +++ b/include/llvm/Support/Process.h @@ -25,11 +25,8 @@ #ifndef LLVM_SUPPORT_PROCESS_H #define LLVM_SUPPORT_PROCESS_H -#include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/Optional.h" #include "llvm/Config/llvm-config.h" -#include "llvm/Support/Allocator.h" -#include "llvm/Support/system_error.h" #include "llvm/Support/DataTypes.h" #include "llvm/Support/TimeValue.h" @@ -171,14 +168,6 @@ public: // string. \arg Name is assumed to be in UTF-8 encoding too. static Optional GetEnv(StringRef name); - /// This function returns a SmallVector containing the arguments passed from - /// the operating system to the program. This function expects to be handed - /// the vector passed in from main. - static error_code - GetArgumentVector(SmallVectorImpl &Args, - ArrayRef ArgsFromMain, - SpecificBumpPtrAllocator &ArgAllocator); - /// This function determines if the standard input is connected directly /// to a user's input (keyboard probably), rather than coming from a file /// or pipe. diff --git a/lib/Support/Unix/Process.inc b/lib/Support/Unix/Process.inc index c5778e746b7..f18fa221036 100644 --- a/lib/Support/Unix/Process.inc +++ b/lib/Support/Unix/Process.inc @@ -190,14 +190,6 @@ Optional Process::GetEnv(StringRef Name) { return std::string(Val); } -error_code Process::GetArgumentVector(SmallVectorImpl &ArgsOut, - ArrayRef ArgsIn, - SpecificBumpPtrAllocator &) { - ArgsOut.append(ArgsIn.begin(), ArgsIn.end()); - - return error_code::success(); -} - bool Process::StandardInIsUserInput() { return FileDescriptorIsDisplayed(STDIN_FILENO); } diff --git a/lib/Support/Windows/DynamicLibrary.inc b/lib/Support/Windows/DynamicLibrary.inc index 5a7b21920a9..2edaf74fa56 100644 --- a/lib/Support/Windows/DynamicLibrary.inc +++ b/lib/Support/Windows/DynamicLibrary.inc @@ -83,15 +83,8 @@ DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *filename, // This is mostly to ensure that the return value still shows up as "valid". return DynamicLibrary(&OpenedHandles); } - - SmallVector filenameUnicode; - if (error_code ec = windows::UTF8ToUTF16(filename, filenameUnicode)) { - SetLastError(ec.value()); - MakeErrMsg(errMsg, std::string(filename) + ": Can't convert to UTF-16: "); - return DynamicLibrary(); - } - HMODULE a_handle = LoadLibraryW(filenameUnicode.data()); + HMODULE a_handle = LoadLibrary(filename); if (a_handle == 0) { MakeErrMsg(errMsg, std::string(filename) + ": Can't open : "); diff --git a/lib/Support/Windows/Path.inc b/lib/Support/Windows/Path.inc index 998ec422ec6..94a501b39ac 100644 --- a/lib/Support/Windows/Path.inc +++ b/lib/Support/Windows/Path.inc @@ -128,7 +128,7 @@ retry_random_path: BYTE val = 0; if (!::CryptGenRandom(CryptoProvider, 1, &val)) return windows_error(::GetLastError()); - random_path_utf16.push_back(L"0123456789abcdef"[val & 15]); + random_path_utf16.push_back("0123456789abcdef"[val & 15]); } else random_path_utf16.push_back(*i); @@ -241,23 +241,22 @@ TimeValue file_status::getLastModificationTime() const { } error_code current_path(SmallVectorImpl &result) { - SmallVector cur_path; - DWORD len = MAX_PATH; + SmallVector cur_path; + cur_path.reserve(128); +retry_cur_dir: + DWORD len = ::GetCurrentDirectoryW(cur_path.capacity(), cur_path.data()); - do { - cur_path.reserve(len); - len = ::GetCurrentDirectoryW(cur_path.capacity(), cur_path.data()); - - // A zero return value indicates a failure other than insufficient space. - if (len == 0) - return windows_error(::GetLastError()); + // A zero return value indicates a failure other than insufficient space. + if (len == 0) + return windows_error(::GetLastError()); - // If there's insufficient space, the len returned is larger than the len - // given. - } while (len > cur_path.capacity()); + // If there's insufficient space, the len returned is larger than the len + // given. + if (len > cur_path.capacity()) { + cur_path.reserve(len); + goto retry_cur_dir; + } - // On success, GetCurrentDirectoryW returns the number of characters not - // including the null-terminator. cur_path.set_size(len); return UTF16ToUTF8(cur_path.begin(), cur_path.size(), result); } diff --git a/lib/Support/Windows/Process.inc b/lib/Support/Windows/Process.inc index 7f7e06c8550..5d776504fbb 100644 --- a/lib/Support/Windows/Process.inc +++ b/lib/Support/Windows/Process.inc @@ -11,25 +11,18 @@ // //===----------------------------------------------------------------------===// -#include "llvm/Support/Allocator.h" - #include "Windows.h" #include #include #include #include -#include #ifdef __MINGW32__ #if (HAVE_LIBPSAPI != 1) #error "libpsapi.a should be present" #endif - #if (HAVE_LIBSHELL32 != 1) - #error "libshell32.a should be present" - #endif #else -#pragma comment(lib, "psapi.lib") -#pragma comment(lib, "Shell32.lib") + #pragma comment(lib, "psapi.lib") #endif //===----------------------------------------------------------------------===// @@ -158,58 +151,25 @@ Optional Process::GetEnv(StringRef Name) { // Environment variable can be encoded in non-UTF8 encoding, and there's no // way to know what the encoding is. The only reliable way to look up // multibyte environment variable is to use GetEnvironmentVariableW(). - SmallVector Buf; - size_t Size = MAX_PATH; - do { - Buf.reserve(Size); - Size = GetEnvironmentVariableW(&NameUTF16[0], &Buf[0], Buf.capacity()); - if (Size == 0) - return None; - + std::vector Buf(16); + size_t Size = 0; + for (;;) { + Size = GetEnvironmentVariableW(&NameUTF16[0], &Buf[0], Buf.size()); + if (Size < Buf.size()) + break; // Try again with larger buffer. - } while (Size > Buf.capacity()); - Buf.set_size(Size); + Buf.resize(Size + 1); + } + if (Size == 0) + return None; // Convert the result from UTF-16 to UTF-8. - SmallVector Res; + SmallVector Res; if (error_code ec = windows::UTF16ToUTF8(&Buf[0], Size, Res)) return None; return std::string(&Res[0]); } -error_code -Process::GetArgumentVector(SmallVectorImpl &Args, - ArrayRef, - SpecificBumpPtrAllocator &ArgAllocator) { - int NewArgCount; - error_code ec; - - wchar_t **UnicodeCommandLine = CommandLineToArgvW(GetCommandLineW(), - &NewArgCount); - if (!UnicodeCommandLine) - return windows_error(::GetLastError()); - - Args.reserve(NewArgCount); - - for (int i = 0; i < NewArgCount; ++i) { - SmallVector NewArgString; - ec = windows::UTF16ToUTF8(UnicodeCommandLine[i], - wcslen(UnicodeCommandLine[i]), - NewArgString); - if (ec) - break; - - char *Buffer = ArgAllocator.Allocate(NewArgString.size() + 1); - ::memcpy(Buffer, NewArgString.data(), NewArgString.size() + 1); - Args.push_back(Buffer); - } - LocalFree(UnicodeCommandLine); - if (ec) - return ec; - - return error_code::success(); -} - bool Process::StandardInIsUserInput() { return FileDescriptorIsDisplayed(0); } diff --git a/lib/Support/Windows/Program.inc b/lib/Support/Windows/Program.inc index e464e2f6874..28690852b0d 100644 --- a/lib/Support/Windows/Program.inc +++ b/lib/Support/Windows/Program.inc @@ -42,39 +42,42 @@ std::string sys::FindProgramByName(const std::string &progName) { // At this point, the file name is valid and does not contain slashes. // Let Windows search for it. - SmallVector progNameUnicode; - if (windows::UTF8ToUTF16(progName, progNameUnicode)) + std::string buffer; + buffer.resize(MAX_PATH); + char *dummy = NULL; + DWORD len = SearchPath(NULL, progName.c_str(), ".exe", MAX_PATH, + &buffer[0], &dummy); + + // See if it wasn't found. + if (len == 0) return ""; - SmallVector buffer; - DWORD len = MAX_PATH; - do { - buffer.reserve(len); - len = ::SearchPathW(NULL, progNameUnicode.data(), L".exe", - buffer.capacity(), buffer.data(), NULL); + // See if we got the entire path. + if (len < MAX_PATH) + return buffer; - // See if it wasn't found. - if (len == 0) - return ""; - - // Buffer was too small; grow and retry. - } while (len > buffer.capacity()); + // Buffer was too small; grow and retry. + while (true) { + buffer.resize(len+1); + DWORD len2 = SearchPath(NULL, progName.c_str(), ".exe", len+1, &buffer[0], &dummy); - buffer.set_size(len); - SmallVector result; - if (windows::UTF16ToUTF8(buffer.begin(), buffer.size(), result)) - return ""; + // It is unlikely the search failed, but it's always possible some file + // was added or removed since the last search, so be paranoid... + if (len2 == 0) + return ""; + else if (len2 <= len) + return buffer; - return std::string(result.data(), result.size()); + len = len2; + } } static HANDLE RedirectIO(const StringRef *path, int fd, std::string* ErrMsg) { HANDLE h; if (path == 0) { - if (!DuplicateHandle(GetCurrentProcess(), (HANDLE)_get_osfhandle(fd), - GetCurrentProcess(), &h, - 0, TRUE, DUPLICATE_SAME_ACCESS)) - return INVALID_HANDLE_VALUE; + DuplicateHandle(GetCurrentProcess(), (HANDLE)_get_osfhandle(fd), + GetCurrentProcess(), &h, + 0, TRUE, DUPLICATE_SAME_ACCESS); return h; } @@ -89,13 +92,9 @@ static HANDLE RedirectIO(const StringRef *path, int fd, std::string* ErrMsg) { sa.lpSecurityDescriptor = 0; sa.bInheritHandle = TRUE; - SmallVector fnameUnicode; - if (windows::UTF8ToUTF16(fname, fnameUnicode)) - return INVALID_HANDLE_VALUE; - - h = CreateFileW(fnameUnicode.data(), fd ? GENERIC_WRITE : GENERIC_READ, - FILE_SHARE_READ, &sa, fd == 0 ? OPEN_EXISTING : CREATE_ALWAYS, - FILE_ATTRIBUTE_NORMAL, NULL); + h = CreateFile(fname.c_str(), fd ? GENERIC_WRITE : GENERIC_READ, + FILE_SHARE_READ, &sa, fd == 0 ? OPEN_EXISTING : CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, NULL); if (h == INVALID_HANDLE_VALUE) { MakeErrMsg(ErrMsg, std::string(fname) + ": Can't open file for " + (fd ? "input: " : "output: ")); @@ -219,28 +218,34 @@ static bool Execute(ProcessInfo &PI, StringRef Program, const char **args, *p = 0; // The pointer to the environment block for the new process. - std::vector EnvBlock; + OwningArrayPtr envblock; if (envp) { // An environment block consists of a null-terminated block of // null-terminated strings. Convert the array of environment variables to // an environment block by concatenating them. - for (unsigned i = 0; envp[i]; ++i) { - SmallVector EnvString; - if (error_code ec = windows::UTF8ToUTF16(envp[i], EnvString)) { - SetLastError(ec.value()); - MakeErrMsg(ErrMsg, "Unable to convert environment variable to UTF-16"); - return false; - } - EnvBlock.insert(EnvBlock.end(), EnvString.begin(), EnvString.end()); - EnvBlock.push_back(0); + // First, determine the length of the environment block. + len = 0; + for (unsigned i = 0; envp[i]; i++) + len += strlen(envp[i]) + 1; + + // Now build the environment block. + envblock.reset(new char[len+1]); + p = envblock.get(); + + for (unsigned i = 0; envp[i]; i++) { + const char *ev = envp[i]; + size_t len = strlen(ev) + 1; + memcpy(p, ev, len); + p += len; } - EnvBlock.push_back(0); + + *p = 0; } // Create a child process. - STARTUPINFOW si; + STARTUPINFO si; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); si.hStdInput = INVALID_HANDLE_VALUE; @@ -264,14 +269,9 @@ static bool Execute(ProcessInfo &PI, StringRef Program, const char **args, if (redirects[1] && redirects[2] && *(redirects[1]) == *(redirects[2])) { // If stdout and stderr should go to the same place, redirect stderr // to the handle already open for stdout. - if (!DuplicateHandle(GetCurrentProcess(), si.hStdOutput, - GetCurrentProcess(), &si.hStdError, - 0, TRUE, DUPLICATE_SAME_ACCESS)) { - CloseHandle(si.hStdInput); - CloseHandle(si.hStdOutput); - MakeErrMsg(ErrMsg, "can't dup stderr to stdout"); - return false; - } + DuplicateHandle(GetCurrentProcess(), si.hStdOutput, + GetCurrentProcess(), &si.hStdError, + 0, TRUE, DUPLICATE_SAME_ACCESS); } else { // Just redirect stderr si.hStdError = RedirectIO(redirects[2], 2, ErrMsg); @@ -289,27 +289,9 @@ static bool Execute(ProcessInfo &PI, StringRef Program, const char **args, fflush(stdout); fflush(stderr); - - SmallVector ProgramUtf16; - if (error_code ec = windows::UTF8ToUTF16(Program, ProgramUtf16)) { - SetLastError(ec.value()); - MakeErrMsg(ErrMsg, - std::string("Unable to convert application name to UTF-16")); - return false; - } - - SmallVector CommandUtf16; - if (error_code ec = windows::UTF8ToUTF16(command.get(), CommandUtf16)) { - SetLastError(ec.value()); - MakeErrMsg(ErrMsg, - std::string("Unable to convert command-line to UTF-16")); - return false; - } - - BOOL rc = CreateProcessW(ProgramUtf16.data(), CommandUtf16.data(), 0, 0, - TRUE, CREATE_UNICODE_ENVIRONMENT, - EnvBlock.empty() ? 0 : EnvBlock.data(), 0, &si, - &pi); + std::string ProgramStr = Program; + BOOL rc = CreateProcess(ProgramStr.c_str(), command.get(), NULL, NULL, TRUE, + 0, envblock.get(), NULL, &si, &pi); DWORD err = GetLastError(); // Regardless of whether the process got created or not, we are done with @@ -322,7 +304,7 @@ static bool Execute(ProcessInfo &PI, StringRef Program, const char **args, if (!rc) { SetLastError(err); MakeErrMsg(ErrMsg, std::string("Couldn't execute program '") + - Program.str() + "'"); + ProgramStr + "'"); return false; } diff --git a/lib/Support/Windows/Signals.inc b/lib/Support/Windows/Signals.inc index 2b4a66d0089..bce83b96868 100644 --- a/lib/Support/Windows/Signals.inc +++ b/lib/Support/Windows/Signals.inc @@ -135,7 +135,7 @@ typedef PVOID (WINAPI *fpSymFunctionTableAccess64)(HANDLE, DWORD64); static fpSymFunctionTableAccess64 SymFunctionTableAccess64; static bool load64BitDebugHelp(void) { - HMODULE hLib = ::LoadLibrary(TEXT("Dbghelp.dll")); + HMODULE hLib = ::LoadLibrary("Dbghelp.dll"); if (hLib) { StackWalk64 = (fpStackWalk64) ::GetProcAddress(hLib, "StackWalk64"); diff --git a/lib/Support/Windows/Windows.h b/lib/Support/Windows/Windows.h index 657ae4fc838..1236fe56521 100644 --- a/lib/Support/Windows/Windows.h +++ b/lib/Support/Windows/Windows.h @@ -31,6 +31,7 @@ #include "llvm/Support/system_error.h" #include #include +#include #include #include #include diff --git a/projects/sample/autoconf/configure.ac b/projects/sample/autoconf/configure.ac index 03cd214f666..46fd5490904 100644 --- a/projects/sample/autoconf/configure.ac +++ b/projects/sample/autoconf/configure.ac @@ -1087,7 +1087,6 @@ AC_CHECK_LIB(m,sin) if test "$llvm_cv_os_type" = "MingW" ; then AC_CHECK_LIB(imagehlp, main) AC_CHECK_LIB(psapi, main) - AC_CHECK_LIB(shell32, main) fi dnl dlopen() is required for plugin support. diff --git a/utils/FileCheck/CMakeLists.txt b/utils/FileCheck/CMakeLists.txt index d691ceb429c..fa56f92a8f2 100644 --- a/utils/FileCheck/CMakeLists.txt +++ b/utils/FileCheck/CMakeLists.txt @@ -4,7 +4,7 @@ add_llvm_utility(FileCheck target_link_libraries(FileCheck LLVMSupport) if( MINGW ) - target_link_libraries(FileCheck imagehlp psapi shell32) + target_link_libraries(FileCheck imagehlp psapi) endif( MINGW ) if( LLVM_ENABLE_THREADS AND HAVE_LIBPTHREAD ) target_link_libraries(FileCheck pthread) diff --git a/utils/FileUpdate/CMakeLists.txt b/utils/FileUpdate/CMakeLists.txt index 0114e50c627..655aaec3bc2 100644 --- a/utils/FileUpdate/CMakeLists.txt +++ b/utils/FileUpdate/CMakeLists.txt @@ -4,7 +4,7 @@ add_llvm_utility(FileUpdate target_link_libraries(FileUpdate LLVMSupport) if( MINGW ) - target_link_libraries(FileUpdate imagehlp psapi shell32) + target_link_libraries(FileUpdate imagehlp psapi) endif( MINGW ) if( LLVM_ENABLE_THREADS AND HAVE_LIBPTHREAD ) target_link_libraries(FileUpdate pthread) diff --git a/utils/not/CMakeLists.txt b/utils/not/CMakeLists.txt index 5ff14d6692d..f4c02290d7d 100644 --- a/utils/not/CMakeLists.txt +++ b/utils/not/CMakeLists.txt @@ -4,7 +4,7 @@ add_llvm_utility(not target_link_libraries(not LLVMSupport) if( MINGW ) - target_link_libraries(not imagehlp psapi shell32) + target_link_libraries(not imagehlp psapi) endif( MINGW ) if( LLVM_ENABLE_THREADS AND HAVE_LIBPTHREAD ) target_link_libraries(not pthread)