[Lldb-commits] [lldb] r264074 - Unicode support on Win32.

Sean Callanan via lldb-commits lldb-commits at lists.llvm.org
Tue Mar 22 15:38:25 PDT 2016


This change breaks the OS X build by adding a direct dependency between lldb-mi and the static lldb-core library.  The code in question is

bool
CMIUtilFileStd::IsFileExist(const CMIUtilString &vFileNamePath) const
{
    if (vFileNamePath.empty())
        return false;

    FILE *pTmp = lldb_private::FileSystem::Fopen(vFileNamePath.c_str(), "wb");
    if (pTmp != nullptr)
    {
        ::fclose(pTmp);
        return true;
    }

    return false;
}

This is the only lldb_private reference in the mi code, which is supposed to use the public API exclusively.  I am going to revert this change only.

Sean

> On Mar 22, 2016, at 10:58 AM, Zachary Turner via lldb-commits <lldb-commits at lists.llvm.org> wrote:
> 
> Author: zturner
> Date: Tue Mar 22 12:58:09 2016
> New Revision: 264074
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=264074&view=rev
> Log:
> Unicode support on Win32.
> 
> Win32 API calls that are Unicode aware require wide character
> strings, but LLDB uses UTF8 everywhere.  This patch does conversions
> wherever necessary when passing strings into and out of Win32 API
> calls.
> 
> Patch by Cameron
> Differential Revision: http://reviews.llvm.org/D17107
> Reviewed By: zturner, amccarth
> 
> Modified:
>    lldb/trunk/cmake/modules/LLDBConfig.cmake
>    lldb/trunk/include/lldb/Host/FileSystem.h
>    lldb/trunk/include/lldb/Host/posix/HostInfoPosix.h
>    lldb/trunk/include/lldb/Host/windows/HostInfoWindows.h
>    lldb/trunk/packages/Python/lldbsuite/test/dotest.py
>    lldb/trunk/source/Commands/CommandCompletions.cpp
>    lldb/trunk/source/Core/ConnectionSharedMemory.cpp
>    lldb/trunk/source/Core/Disassembler.cpp
>    lldb/trunk/source/Host/common/File.cpp
>    lldb/trunk/source/Host/common/FileSpec.cpp
>    lldb/trunk/source/Host/posix/FileSystem.cpp
>    lldb/trunk/source/Host/posix/HostInfoPosix.cpp
>    lldb/trunk/source/Host/windows/ConnectionGenericFileWindows.cpp
>    lldb/trunk/source/Host/windows/FileSystem.cpp
>    lldb/trunk/source/Host/windows/Host.cpp
>    lldb/trunk/source/Host/windows/HostInfoWindows.cpp
>    lldb/trunk/source/Host/windows/HostProcessWindows.cpp
>    lldb/trunk/source/Host/windows/PipeWindows.cpp
>    lldb/trunk/source/Host/windows/ProcessLauncherWindows.cpp
>    lldb/trunk/source/Host/windows/Windows.cpp
>    lldb/trunk/source/Plugins/Process/Windows/Live/DebuggerThread.cpp
>    lldb/trunk/source/Plugins/Process/Windows/Live/ProcessWindowsLive.cpp
>    lldb/trunk/source/Plugins/Process/Windows/MiniDump/ProcessWinMiniDump.cpp
>    lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp
>    lldb/trunk/source/Target/ProcessLaunchInfo.cpp
>    lldb/trunk/tools/driver/Driver.cpp
>    lldb/trunk/tools/lldb-mi/MICmnLLDBDebugSessionInfo.cpp
>    lldb/trunk/tools/lldb-mi/MIUtilFileStd.cpp
>    lldb/trunk/tools/lldb-mi/Platform.h
> 
> Modified: lldb/trunk/cmake/modules/LLDBConfig.cmake
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/cmake/modules/LLDBConfig.cmake?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/cmake/modules/LLDBConfig.cmake (original)
> +++ lldb/trunk/cmake/modules/LLDBConfig.cmake Tue Mar 22 12:58:09 2016
> @@ -245,6 +245,11 @@ if( MSVC )
>   )
> endif()
> 
> +# Use the Unicode (UTF-16) APIs by default on Win32
> +if (CMAKE_SYSTEM_NAME MATCHES "Windows")
> +	add_definitions( /D _UNICODE /D UNICODE )
> +endif()
> +
> set(LLDB_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
> set(LLDB_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
> 
> 
> Modified: lldb/trunk/include/lldb/Host/FileSystem.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/FileSystem.h?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/Host/FileSystem.h (original)
> +++ lldb/trunk/include/lldb/Host/FileSystem.h Tue Mar 22 12:58:09 2016
> @@ -11,6 +11,8 @@
> #define liblldb_Host_FileSystem_h
> 
> #include <stdint.h>
> +#include <stdio.h>
> +#include <sys/stat.h>
> 
> #include "lldb/lldb-types.h"
> 
> @@ -23,6 +25,7 @@ class FileSystem
> {
>   public:
>     static const char *DEV_NULL;
> +    static const char *PATH_CONVERSION_ERROR;
> 
>     static FileSpec::PathSyntax GetNativePathSyntax();
> 
> @@ -59,6 +62,15 @@ class FileSystem
> 
>     /// Return \b true if \a spec is on a locally mounted file system, \b false otherwise.
>     static bool IsLocal(const FileSpec &spec);
> +
> +    /// Wraps ::fopen in a platform-independent way. Once opened, FILEs can be
> +    /// manipulated and closed with the normal ::fread, ::fclose, etc. functions.
> +    static FILE *
> +    Fopen(const char *path, const char *mode);
> +
> +    /// Wraps ::stat in a platform-independent way.
> +    static int
> +    Stat(const char *path, struct stat *stats);
> };
> }
> 
> 
> Modified: lldb/trunk/include/lldb/Host/posix/HostInfoPosix.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/posix/HostInfoPosix.h?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/Host/posix/HostInfoPosix.h (original)
> +++ lldb/trunk/include/lldb/Host/posix/HostInfoPosix.h Tue Mar 22 12:58:09 2016
> @@ -33,7 +33,10 @@ class HostInfoPosix : public HostInfoBas
> 
>     static FileSpec GetDefaultShell();
> 
> -  protected:
> +    static bool
> +    GetEnvironmentVar(const std::string &var_name, std::string &var);
> +
> +protected:
>     static bool ComputeSupportExeDirectory(FileSpec &file_spec);
>     static bool ComputeHeaderDirectory(FileSpec &file_spec);
>     static bool ComputePythonDirectory(FileSpec &file_spec);
> 
> Modified: lldb/trunk/include/lldb/Host/windows/HostInfoWindows.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/windows/HostInfoWindows.h?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/Host/windows/HostInfoWindows.h (original)
> +++ lldb/trunk/include/lldb/Host/windows/HostInfoWindows.h Tue Mar 22 12:58:09 2016
> @@ -47,6 +47,9 @@ class HostInfoWindows : public HostInfoB
>       static FileSpec
>       GetDefaultShell();
> 
> +      static bool
> +      GetEnvironmentVar(const std::string &var_name, std::string &var);
> +
>   protected:
>     static bool ComputePythonDirectory(FileSpec &file_spec);
> 
> 
> Modified: lldb/trunk/packages/Python/lldbsuite/test/dotest.py
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/dotest.py?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/dotest.py (original)
> +++ lldb/trunk/packages/Python/lldbsuite/test/dotest.py Tue Mar 22 12:58:09 2016
> @@ -659,7 +659,7 @@ def setupSysPath():
>                 print("     location of LLDB\'s site-packages folder.")
>                 print("  3) A different version of Python than that which was built against is exported in")
>                 print("     the system\'s PATH environment variable, causing conflicts.")
> -                print("  4) The executable '%s' could not be found.  Please check " % lldbExecutable)
> +                print("  4) The executable '%s' could not be found.  Please check " % lldbtest_config.lldbExec)
>                 print("     that it exists and is executable.")
> 
>     if lldbPythonDir:
> 
> Modified: lldb/trunk/source/Commands/CommandCompletions.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandCompletions.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/source/Commands/CommandCompletions.cpp (original)
> +++ lldb/trunk/source/Commands/CommandCompletions.cpp Tue Mar 22 12:58:09 2016
> @@ -18,10 +18,11 @@
> #include "llvm/ADT/SmallString.h"
> 
> // Project includes
> -#include "lldb/Host/FileSpec.h"
> #include "lldb/Core/FileSpecList.h"
> -#include "lldb/Core/PluginManager.h"
> #include "lldb/Core/Module.h"
> +#include "lldb/Core/PluginManager.h"
> +#include "lldb/Host/FileSpec.h"
> +#include "lldb/Host/FileSystem.h"
> #include "lldb/Interpreter/Args.h"
> #include "lldb/Interpreter/CommandCompletions.h"
> #include "lldb/Interpreter/CommandInterpreter.h"
> @@ -31,6 +32,8 @@
> #include "lldb/Target/Target.h"
> #include "lldb/Utility/CleanUp.h"
> 
> +#include "llvm/ADT/SmallString.h"
> +
> using namespace lldb_private;
> 
> CommandCompletions::CommonCompletionElement
> @@ -160,8 +163,7 @@ FileSpec::EnumerateDirectoryResult DiskF
>             isa_directory = true;
>         else if (file_type == FileSpec::eFileTypeSymbolicLink)
>         {
> -            struct stat stat_buf;
> -            if ((stat(partial_name_copy, &stat_buf) == 0) && S_ISDIR(stat_buf.st_mode))
> +            if (FileSpec(partial_name_copy, false).IsDirectory())
>                 isa_directory = true;
>         }
> 
> 
> Modified: lldb/trunk/source/Core/ConnectionSharedMemory.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ConnectionSharedMemory.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/source/Core/ConnectionSharedMemory.cpp (original)
> +++ lldb/trunk/source/Core/ConnectionSharedMemory.cpp Tue Mar 22 12:58:09 2016
> @@ -32,6 +32,8 @@
> #include "lldb/Core/Communication.h"
> #include "lldb/Core/Log.h"
> 
> +#include "llvm/Support/ConvertUTF.h"
> +
> using namespace lldb;
> using namespace lldb_private;
> 
> @@ -135,18 +137,18 @@ ConnectionSharedMemory::Open (bool creat
>     m_name.assign (name);
> 
> #ifdef _WIN32
> -    HANDLE handle;
> -    if (create) {
> -        handle = CreateFileMapping(
> -            INVALID_HANDLE_VALUE,
> -            nullptr,
> -            PAGE_READWRITE,
> -            llvm::Hi_32(size),
> -            llvm::Lo_32(size),
> -            name);
> +    HANDLE handle = INVALID_HANDLE_VALUE;
> +    std::wstring wname;
> +    if (llvm::ConvertUTF8toWide(name, wname))
> +    {
> +        if (create)
> +        {
> +            handle = CreateFileMappingW(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, llvm::Hi_32(size),
> +                                        llvm::Lo_32(size), wname.c_str());
> +        }
> +        else
> +            handle = OpenFileMappingW(FILE_MAP_ALL_ACCESS, FALSE, wname.c_str());
>     }
> -    else
> -        handle = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, name);
> 
>     m_fd = _open_osfhandle((intptr_t)handle, 0);
> #else
> 
> Modified: lldb/trunk/source/Core/Disassembler.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Disassembler.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/source/Core/Disassembler.cpp (original)
> +++ lldb/trunk/source/Core/Disassembler.cpp Tue Mar 22 12:58:09 2016
> @@ -16,16 +16,16 @@
> 
> // Other libraries and framework includes
> // Project includes
> -#include "lldb/lldb-private.h"
> -#include "lldb/Core/Error.h"
> #include "lldb/Core/DataBufferHeap.h"
> #include "lldb/Core/DataExtractor.h"
> #include "lldb/Core/Debugger.h"
> #include "lldb/Core/EmulateInstruction.h"
> +#include "lldb/Core/Error.h"
> #include "lldb/Core/Module.h"
> #include "lldb/Core/PluginManager.h"
> #include "lldb/Core/RegularExpression.h"
> #include "lldb/Core/Timer.h"
> +#include "lldb/Host/FileSystem.h"
> #include "lldb/Interpreter/OptionValue.h"
> #include "lldb/Interpreter/OptionValueArray.h"
> #include "lldb/Interpreter/OptionValueDictionary.h"
> @@ -38,6 +38,7 @@
> #include "lldb/Target/SectionLoadList.h"
> #include "lldb/Target/StackFrame.h"
> #include "lldb/Target/Target.h"
> +#include "lldb/lldb-private.h"
> 
> #define DEFAULT_DISASM_BYTE_SIZE 32
> 
> @@ -849,8 +850,7 @@ Instruction::TestEmulation (Stream *out_
>         out_stream->Printf ("Instruction::TestEmulation:  Missing file_name.");
>         return false;
>     }
> -        
> -    FILE *test_file = fopen (file_name, "r");
> +    FILE *test_file = FileSystem::Fopen(file_name, "r");
>     if (!test_file)
>     {
>         out_stream->Printf ("Instruction::TestEmulation: Attempt to open test file failed.");
> 
> Modified: lldb/trunk/source/Host/common/File.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/File.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/source/Host/common/File.cpp (original)
> +++ lldb/trunk/source/Host/common/File.cpp Tue Mar 22 12:58:09 2016
> @@ -14,7 +14,6 @@
> #include <limits.h>
> #include <stdarg.h>
> #include <stdio.h>
> -#include <sys/stat.h>
> 
> #ifdef _WIN32
> #include "lldb/Host/windows/windows.h"
> @@ -22,6 +21,7 @@
> #include <sys/ioctl.h>
> #endif
> 
> +#include "llvm/Support/ConvertUTF.h"
> #include "llvm/Support/Process.h" // for llvm::sys::Process::FileDescriptorHasColors()
> 
> #include "lldb/Core/DataBufferHeap.h"
> @@ -29,6 +29,7 @@
> #include "lldb/Core/Log.h"
> #include "lldb/Host/Config.h"
> #include "lldb/Host/FileSpec.h"
> +#include "lldb/Host/FileSystem.h"
> 
> using namespace lldb;
> using namespace lldb_private;
> @@ -267,7 +268,18 @@ File::Open (const char *path, uint32_t o
> 
>     do
>     {
> +#ifdef _WIN32
> +        std::wstring wpath;
> +        if (!llvm::ConvertUTF8toWide(path, wpath))
> +        {
> +            m_descriptor = -1;
> +            error.SetErrorString("Error converting path to UTF-16");
> +            return error;
> +        }
> +        ::_wsopen_s(&m_descriptor, wpath.c_str(), oflag, _SH_DENYNO, mode);
> +#else
>         m_descriptor = ::open(path, oflag, mode);
> +#endif
>     } while (m_descriptor < 0 && errno == EINTR);
> 
>     if (!DescriptorIsValid())
> @@ -287,7 +299,8 @@ File::GetPermissions(const FileSpec &fil
>     if (file_spec)
>     {
>         struct stat file_stats;
> -        if (::stat(file_spec.GetCString(), &file_stats) == -1)
> +        int stat_result = FileSystem::Stat(file_spec.GetCString(), &file_stats);
> +        if (stat_result == -1)
>             error.SetErrorToErrno();
>         else
>         {
> 
> Modified: lldb/trunk/source/Host/common/FileSpec.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/FileSpec.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/source/Host/common/FileSpec.cpp (original)
> +++ lldb/trunk/source/Host/common/FileSpec.cpp Tue Mar 22 12:58:09 2016
> @@ -17,7 +17,6 @@
> #ifndef _MSC_VER
> #include <libgen.h>
> #endif
> -#include <sys/stat.h>
> #include <set>
> #include <string.h>
> #include <fstream>
> @@ -40,6 +39,7 @@
> #include "lldb/Utility/CleanUp.h"
> 
> #include "llvm/ADT/StringRef.h"
> +#include "llvm/Support/ConvertUTF.h"
> #include "llvm/Support/FileSystem.h"
> #include "llvm/Support/Path.h"
> #include "llvm/Support/Program.h"
> @@ -90,7 +90,7 @@ GetFileStats (const FileSpec *file_spec,
> {
>     char resolved_path[PATH_MAX];
>     if (file_spec->GetPath (resolved_path, sizeof(resolved_path)))
> -        return ::stat (resolved_path, stats_ptr) == 0;
> +        return FileSystem::Stat(resolved_path, stats_ptr) == 0;
>     return false;
> }
> 
> @@ -206,15 +206,10 @@ FileSpec::Resolve (llvm::SmallVectorImpl
> #endif // #ifdef LLDB_CONFIG_TILDE_RESOLVES_TO_USER
> 
>     // Save a copy of the original path that's passed in
> -    llvm::SmallString<PATH_MAX> original_path(path.begin(), path.end());
> +    llvm::SmallString<128> original_path(path.begin(), path.end());
> 
>     llvm::sys::fs::make_absolute(path);
> -
> -    
> -    path.push_back(0);  // Be sure we have a nul terminated string
> -    path.pop_back();
> -    struct stat file_stats;
> -    if (::stat (path.data(), &file_stats) != 0)
> +    if (!llvm::sys::fs::exists(path))
>     {
>         path.clear();
>         path.append(original_path.begin(), original_path.end());
> @@ -815,7 +810,10 @@ FileSpec::IsSymbolicLink () const
>         return false;
> 
> #ifdef _WIN32
> -    auto attrs = ::GetFileAttributes (resolved_path);
> +    std::wstring wpath;
> +    if (!llvm::ConvertUTF8toWide(resolved_path, wpath))
> +        return false;
> +    auto attrs = ::GetFileAttributesW(wpath.c_str());
>     if (attrs == INVALID_FILE_ATTRIBUTES)
>         return false;
> 
> @@ -1114,12 +1112,18 @@ FileSpec::ForEachItemInDirectory (const
> {
>     if (dir_path && dir_path[0])
>     {
> -#if _WIN32
> +#ifdef _WIN32
>         std::string szDir(dir_path);
>         szDir += "\\*";
> 
> -        WIN32_FIND_DATA ffd;
> -        HANDLE hFind = FindFirstFile(szDir.c_str(), &ffd);
> +        std::wstring wszDir;
> +        if (!llvm::ConvertUTF8toWide(szDir, wszDir))
> +        {
> +            return eEnumerateDirectoryResultNext;
> +        }
> +
> +        WIN32_FIND_DATAW ffd;
> +        HANDLE hFind = FindFirstFileW(wszDir.c_str(), &ffd);
> 
>         if (hFind == INVALID_HANDLE_VALUE)
>         {
> @@ -1131,12 +1135,12 @@ FileSpec::ForEachItemInDirectory (const
>             FileSpec::FileType file_type = eFileTypeUnknown;
>             if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
>             {
> -                size_t len = strlen(ffd.cFileName);
> +                size_t len = wcslen(ffd.cFileName);
> 
> -                if (len == 1 && ffd.cFileName[0] == '.')
> +                if (len == 1 && ffd.cFileName[0] == L'.')
>                     continue;
> 
> -                if (len == 2 && ffd.cFileName[0] == '.' && ffd.cFileName[1] == '.')
> +                if (len == 2 && ffd.cFileName[0] == L'.' && ffd.cFileName[1] == L'.')
>                     continue;
> 
>                 file_type = eFileTypeDirectory;
> @@ -1150,12 +1154,19 @@ FileSpec::ForEachItemInDirectory (const
>                 file_type = eFileTypeRegular;
>             }
> 
> -            char child_path[MAX_PATH];
> -            const int child_path_len = ::snprintf (child_path, sizeof(child_path), "%s\\%s", dir_path, ffd.cFileName);
> -            if (child_path_len < (int)(sizeof(child_path) - 1))
> +            std::string fileName;
> +            if (!llvm::convertWideToUTF8(ffd.cFileName, fileName))
> +            {
> +                continue;
> +            }
> +
> +            std::vector<char> child_path(PATH_MAX);
> +            const int child_path_len =
> +                ::snprintf(child_path.data(), child_path.size(), "%s\\%s", dir_path, fileName.c_str());
> +            if (child_path_len < (int)(child_path.size() - 1))
>             {
>                 // Don't resolve the file type or path
> -                FileSpec child_path_spec (child_path, false);
> +                FileSpec child_path_spec(child_path.data(), false);
> 
>                 EnumerateDirectoryResult result = callback (file_type, child_path_spec);
> 
> @@ -1168,7 +1179,8 @@ FileSpec::ForEachItemInDirectory (const
>                         break;
> 
>                     case eEnumerateDirectoryResultEnter: // Recurse into the current entry if it is a directory or symlink, or next if not
> -                        if (FileSpec::ForEachItemInDirectory(child_path, callback) == eEnumerateDirectoryResultQuit)
> +                        if (FileSpec::ForEachItemInDirectory(child_path.data(), callback) ==
> +                            eEnumerateDirectoryResultQuit)
>                         {
>                             // The subdirectory returned Quit, which means to
>                             // stop all directory enumerations at all levels.
> @@ -1185,7 +1197,7 @@ FileSpec::ForEachItemInDirectory (const
>                         return eEnumerateDirectoryResultQuit;
>                 }
>             }
> -        } while (FindNextFile(hFind, &ffd) != 0);
> +        } while (FindNextFileW(hFind, &ffd) != 0);
> 
>         FindClose(hFind);
> #else
> 
> Modified: lldb/trunk/source/Host/posix/FileSystem.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/posix/FileSystem.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/source/Host/posix/FileSystem.cpp (original)
> +++ lldb/trunk/source/Host/posix/FileSystem.cpp Tue Mar 22 12:58:09 2016
> @@ -299,3 +299,15 @@ FileSystem::IsLocal(const FileSpec &spec
>     return false;
> }
> #endif
> +
> +FILE *
> +FileSystem::Fopen(const char *path, const char *mode)
> +{
> +    return ::fopen(path, mode);
> +}
> +
> +int
> +FileSystem::Stat(const char *path, struct stat *stats)
> +{
> +    return ::stat(path, stats);
> +}
> 
> Modified: lldb/trunk/source/Host/posix/HostInfoPosix.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/posix/HostInfoPosix.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/source/Host/posix/HostInfoPosix.cpp (original)
> +++ lldb/trunk/source/Host/posix/HostInfoPosix.cpp Tue Mar 22 12:58:09 2016
> @@ -242,3 +242,14 @@ HostInfoPosix::ComputePythonDirectory(Fi
>     return false;
> #endif
> }
> +
> +bool
> +HostInfoPosix::GetEnvironmentVar(const std::string &var_name, std::string &var)
> +{
> +    if (const char *pvar = ::getenv(var_name.c_str()))
> +    {
> +        var = std::string(pvar);
> +        return true;
> +    }
> +    return false;
> +}
> 
> Modified: lldb/trunk/source/Host/windows/ConnectionGenericFileWindows.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/windows/ConnectionGenericFileWindows.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/source/Host/windows/ConnectionGenericFileWindows.cpp (original)
> +++ lldb/trunk/source/Host/windows/ConnectionGenericFileWindows.cpp Tue Mar 22 12:58:09 2016
> @@ -14,6 +14,7 @@
> 
> #include "llvm/ADT/STLExtras.h"
> #include "llvm/ADT/StringRef.h"
> +#include "llvm/Support/ConvertUTF.h"
> 
> using namespace lldb;
> using namespace lldb_private;
> @@ -138,7 +139,15 @@ ConnectionGenericFile::Connect(const cha
>     // Open the file for overlapped access.  If it does not exist, create it.  We open it overlapped
>     // so that we can issue asynchronous reads and then use WaitForMultipleObjects to allow the read
>     // to be interrupted by an event object.
> -    m_file = ::CreateFile(path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_FLAG_OVERLAPPED, NULL);
> +    std::wstring wpath;
> +    if (!llvm::ConvertUTF8toWide(path, wpath))
> +    {
> +        if (error_ptr)
> +            error_ptr->SetError(1, eErrorTypeGeneric);
> +        return eConnectionStatusError;
> +    }
> +    m_file = ::CreateFileW(wpath.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS,
> +                           FILE_FLAG_OVERLAPPED, NULL);
>     if (m_file == INVALID_HANDLE_VALUE)
>     {
>         if (error_ptr)
> 
> Modified: lldb/trunk/source/Host/windows/FileSystem.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/windows/FileSystem.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/source/Host/windows/FileSystem.cpp (original)
> +++ lldb/trunk/source/Host/windows/FileSystem.cpp Tue Mar 22 12:58:09 2016
> @@ -15,6 +15,8 @@
> 
> #include "lldb/Host/FileSystem.h"
> #include "lldb/Host/windows/AutoHandle.h"
> +
> +#include "llvm/Support/ConvertUTF.h"
> #include "llvm/Support/FileSystem.h"
> 
> using namespace lldb_private;
> @@ -22,6 +24,8 @@ using namespace lldb_private;
> const char *
> FileSystem::DEV_NULL = "nul";
> 
> +const char *FileSystem::PATH_CONVERSION_ERROR = "Error converting path between UTF-8 and native encoding";
> +
> FileSpec::PathSyntax
> FileSystem::GetNativePathSyntax()
> {
> @@ -47,25 +51,32 @@ Error
> FileSystem::DeleteDirectory(const FileSpec &file_spec, bool recurse)
> {
>     Error error;
> +    std::wstring path_buffer;
> +    if (!llvm::ConvertUTF8toWide(file_spec.GetPath(), path_buffer))
> +    {
> +        error.SetErrorString(PATH_CONVERSION_ERROR);
> +        return error;
> +    }
>     if (!recurse)
>     {
> -        BOOL result = ::RemoveDirectory(file_spec.GetCString());
> +        BOOL result = ::RemoveDirectoryW(path_buffer.c_str());
>         if (!result)
>             error.SetError(::GetLastError(), lldb::eErrorTypeWin32);
>     }
>     else
>     {
>         // SHFileOperation() accepts a list of paths, and so must be double-null-terminated to
> -        // indicate the end of the list.
> -        std::string path_buffer{file_spec.GetPath()};
> +        // indicate the end of the list. The first null terminator is there only in the backing
> +        // store but not the actual vector contents, and so we need to push twice.
> +        path_buffer.push_back(0);
>         path_buffer.push_back(0);
> 
> -        SHFILEOPSTRUCT shfos = {0};
> +        SHFILEOPSTRUCTW shfos = {0};
>         shfos.wFunc = FO_DELETE;
> -        shfos.pFrom = path_buffer.c_str();
> +        shfos.pFrom = (LPCWSTR)path_buffer.data();
>         shfos.fFlags = FOF_NO_UI;
> 
> -        int result = ::SHFileOperation(&shfos);
> +        int result = ::SHFileOperationW(&shfos);
>         // TODO(zturner): Correctly handle the intricacies of SHFileOperation return values.
>         if (result != 0)
>             error.SetErrorStringWithFormat("SHFileOperation failed");
> @@ -121,7 +132,10 @@ Error
> FileSystem::Hardlink(const FileSpec &src, const FileSpec &dst)
> {
>     Error error;
> -    if (!::CreateHardLink(src.GetCString(), dst.GetCString(), nullptr))
> +    std::wstring wsrc, wdst;
> +    if (!llvm::ConvertUTF8toWide(src.GetCString(), wsrc) || !llvm::ConvertUTF8toWide(dst.GetCString(), wdst))
> +        error.SetErrorString(PATH_CONVERSION_ERROR);
> +    else if (!::CreateHardLinkW(wsrc.c_str(), wdst.c_str(), nullptr))
>         error.SetError(::GetLastError(), lldb::eErrorTypeWin32);
>     return error;
> }
> @@ -129,13 +143,12 @@ FileSystem::Hardlink(const FileSpec &src
> int
> FileSystem::GetHardlinkCount(const FileSpec &file_spec)
> {
> -    HANDLE file_handle = ::CreateFile(file_spec.GetCString(),
> -                                      FILE_READ_ATTRIBUTES,
> -                                      FILE_SHARE_READ,
> -                                      nullptr,
> -                                      OPEN_EXISTING,
> -                                      FILE_ATTRIBUTE_NORMAL,
> -                                      nullptr);
> +    std::wstring path;
> +    if (!llvm::ConvertUTF8toWide(file_spec.GetCString(), path))
> +        return -1;
> +
> +    HANDLE file_handle = ::CreateFileW(path.c_str(), FILE_READ_ATTRIBUTES, FILE_SHARE_READ, nullptr, OPEN_EXISTING,
> +                                       FILE_ATTRIBUTE_NORMAL, nullptr);
> 
>     if (file_handle == INVALID_HANDLE_VALUE)
>       return -1;
> @@ -152,7 +165,12 @@ Error
> FileSystem::Symlink(const FileSpec &src, const FileSpec &dst)
> {
>     Error error;
> -    DWORD attrib = ::GetFileAttributes(dst.GetCString());
> +    std::wstring wsrc, wdst;
> +    if (!llvm::ConvertUTF8toWide(src.GetCString(), wsrc) || !llvm::ConvertUTF8toWide(dst.GetCString(), wdst))
> +        error.SetErrorString(PATH_CONVERSION_ERROR);
> +    if (error.Fail())
> +        return error;
> +    DWORD attrib = ::GetFileAttributesW(wdst.c_str());
>     if (attrib == INVALID_FILE_ATTRIBUTES)
>     {
>         error.SetError(::GetLastError(), lldb::eErrorTypeWin32);
> @@ -160,7 +178,7 @@ FileSystem::Symlink(const FileSpec &src,
>     }
>     bool is_directory = !!(attrib & FILE_ATTRIBUTE_DIRECTORY);
>     DWORD flag = is_directory ? SYMBOLIC_LINK_FLAG_DIRECTORY : 0;
> -    BOOL result = ::CreateSymbolicLink(src.GetCString(), dst.GetCString(), flag);
> +    BOOL result = ::CreateSymbolicLinkW(wsrc.c_str(), wdst.c_str(), flag);
>     if (!result)
>         error.SetError(::GetLastError(), lldb::eErrorTypeWin32);
>     return error;
> @@ -170,7 +188,13 @@ Error
> FileSystem::Unlink(const FileSpec &file_spec)
> {
>     Error error;
> -    BOOL result = ::DeleteFile(file_spec.GetCString());
> +    std::wstring path;
> +    if (!llvm::ConvertUTF8toWide(file_spec.GetCString(), path))
> +    {
> +        error.SetErrorString(PATH_CONVERSION_ERROR);
> +        return error;
> +    }
> +    BOOL result = ::DeleteFileW(path.c_str());
>     if (!result)
>         error.SetError(::GetLastError(), lldb::eErrorTypeWin32);
>     return error;
> @@ -180,23 +204,31 @@ Error
> FileSystem::Readlink(const FileSpec &src, FileSpec &dst)
> {
>     Error error;
> -    HANDLE h = ::CreateFile(src.GetCString(), GENERIC_READ,
> -            FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
> -            FILE_FLAG_OPEN_REPARSE_POINT, NULL);
> +    std::wstring wsrc;
> +    if (!llvm::ConvertUTF8toWide(src.GetCString(), wsrc))
> +    {
> +        error.SetErrorString(PATH_CONVERSION_ERROR);
> +        return error;
> +    }
> +
> +    HANDLE h = ::CreateFileW(wsrc.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
> +                             FILE_FLAG_OPEN_REPARSE_POINT, NULL);
>     if (h == INVALID_HANDLE_VALUE)
>     {
>         error.SetError(::GetLastError(), lldb::eErrorTypeWin32);
>         return error;
>     }
> 
> -    char buf[PATH_MAX];
> +    std::vector<wchar_t> buf(PATH_MAX + 1);
>     // Subtract 1 from the path length since this function does not add a null terminator.
> -    DWORD result = ::GetFinalPathNameByHandle(h, buf, sizeof(buf) - 1,
> -            FILE_NAME_NORMALIZED | VOLUME_NAME_DOS);
> +    DWORD result = ::GetFinalPathNameByHandleW(h, buf.data(), buf.size() - 1, FILE_NAME_NORMALIZED | VOLUME_NAME_DOS);
> +    std::string path;
>     if (result == 0)
>         error.SetError(::GetLastError(), lldb::eErrorTypeWin32);
> +    else if (!llvm::convertWideToUTF8(buf.data(), path))
> +        error.SetErrorString(PATH_CONVERSION_ERROR);
>     else
> -        dst.SetFile(buf, false);
> +        dst.SetFile(path, false);
> 
>     ::CloseHandle(h);
>     return error;
> @@ -219,3 +251,43 @@ FileSystem::IsLocal(const FileSpec &spec
> 
>     return false;
> }
> +
> +FILE *
> +FileSystem::Fopen(const char *path, const char *mode)
> +{
> +    std::wstring wpath, wmode;
> +    if (!llvm::ConvertUTF8toWide(path, wpath))
> +        return nullptr;
> +    if (!llvm::ConvertUTF8toWide(mode, wmode))
> +        return nullptr;
> +    FILE *file;
> +    if (_wfopen_s(&file, wpath.c_str(), wmode.c_str()) != 0)
> +        return nullptr;
> +    return file;
> +}
> +
> +int
> +FileSystem::Stat(const char *path, struct stat *stats)
> +{
> +    std::wstring wpath;
> +    if (!llvm::ConvertUTF8toWide(path, wpath))
> +    {
> +        errno = EINVAL;
> +        return -EINVAL;
> +    }
> +    int stat_result;
> +#ifdef _USE_32BIT_TIME_T
> +    struct _stat32 file_stats;
> +    stat_result = ::_wstat32(wpath.c_str(), &file_stats);
> +#else
> +    struct _stat64i32 file_stats;
> +    stat_result = ::_wstat64i32(wpath.c_str(), &file_stats);
> +#endif
> +    if (stat_result == 0)
> +    {
> +        static_assert(sizeof(struct stat) == sizeof(file_stats),
> +                      "stat and _stat32/_stat64i32 must have the same layout");
> +        *stats = *reinterpret_cast<struct stat *>(&file_stats);
> +    }
> +    return stat_result;
> +}
> 
> Modified: lldb/trunk/source/Host/windows/Host.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/windows/Host.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/source/Host/windows/Host.cpp (original)
> +++ lldb/trunk/source/Host/windows/Host.cpp Tue Mar 22 12:58:09 2016
> @@ -26,6 +26,8 @@
> #include "lldb/Core/StreamFile.h"
> #include "lldb/Core/StructuredData.h"
> 
> +#include "llvm/Support/ConvertUTF.h"
> +
> // Windows includes
> #include <TlHelp32.h>
> 
> @@ -68,12 +70,11 @@ namespace
>     bool GetExecutableForProcess(const AutoHandle &handle, std::string &path)
>     {
>         // Get the process image path.  MAX_PATH isn't long enough, paths can actually be up to 32KB.
> -        std::vector<char> buffer(32768);
> +        std::vector<wchar_t> buffer(PATH_MAX);
>         DWORD dwSize = buffer.size();
> -        if (!::QueryFullProcessImageNameA(handle.get(), 0, &buffer[0], &dwSize))
> +        if (!::QueryFullProcessImageNameW(handle.get(), 0, &buffer[0], &dwSize))
>             return false;
> -        path.assign(&buffer[0]);
> -        return true;
> +        return llvm::convertWideToUTF8(buffer.data(), path);
>     }
> 
>     void GetProcessExecutableAndTriple(const AutoHandle &handle, ProcessInstanceInfo &process)
> @@ -156,15 +157,17 @@ Host::GetModuleFileSpecForHostAddress (c
>     if (!::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)host_addr, &hmodule))
>         return module_filespec;
> 
> -    std::vector<char> buffer(MAX_PATH);
> +    std::vector<wchar_t> buffer(PATH_MAX);
>     DWORD chars_copied = 0;
>     do {
> -        chars_copied = ::GetModuleFileName(hmodule, &buffer[0], buffer.size());
> +        chars_copied = ::GetModuleFileNameW(hmodule, &buffer[0], buffer.size());
>         if (chars_copied == buffer.size() && ::GetLastError() == ERROR_INSUFFICIENT_BUFFER)
>             buffer.resize(buffer.size() * 2);
>     } while (chars_copied >= buffer.size());
> -
> -    module_filespec.SetFile(&buffer[0], false);
> +    std::string path;
> +    if (!llvm::convertWideToUTF8(buffer.data(), path))
> +        return module_filespec;
> +    module_filespec.SetFile(path, false);
>     return module_filespec;
> }
> 
> @@ -177,23 +180,25 @@ Host::FindProcesses (const ProcessInstan
>     if (!snapshot.IsValid())
>         return 0;
> 
> -    PROCESSENTRY32 pe = {0};
> -    pe.dwSize = sizeof(PROCESSENTRY32);
> -    if (Process32First(snapshot.get(), &pe))
> +    PROCESSENTRY32W pe = {0};
> +    pe.dwSize = sizeof(PROCESSENTRY32W);
> +    if (Process32FirstW(snapshot.get(), &pe))
>     {
>         do
>         {
>             AutoHandle handle(::OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pe.th32ProcessID), nullptr);
> 
>             ProcessInstanceInfo process;
> -            process.SetExecutableFile(FileSpec(pe.szExeFile, false), true);
> +            std::string exeFile;
> +            llvm::convertWideToUTF8(pe.szExeFile, exeFile);
> +            process.SetExecutableFile(FileSpec(exeFile, false), true);
>             process.SetProcessID(pe.th32ProcessID);
>             process.SetParentProcessID(pe.th32ParentProcessID);
>             GetProcessExecutableAndTriple(handle, process);
> 
>             if (match_info.MatchAllProcesses() || match_info.Matches(process))
>                 process_infos.Append(process);
> -        } while (Process32Next(snapshot.get(), &pe));
> +        } while (Process32NextW(snapshot.get(), &pe));
>     }
>     return process_infos.GetSize();
> }
> @@ -312,15 +317,21 @@ Host::GetEnvironment(StringList &env)
> {
>     // The environment block on Windows is a contiguous buffer of NULL terminated strings,
>     // where the end of the environment block is indicated by two consecutive NULLs.
> -    LPCH environment_block = ::GetEnvironmentStrings();
> +    LPWCH environment_block = ::GetEnvironmentStringsW();
>     env.Clear();
> -    while (*environment_block != '\0')
> +    while (*environment_block != L'\0')
>     {
> -        llvm::StringRef current_var(environment_block);
> +        std::string current_var;
> +        auto current_var_size = wcslen(environment_block) + 1;
> +        if (!llvm::convertWideToUTF8(environment_block, current_var))
> +        {
> +            environment_block += current_var_size;
> +            continue;
> +        }
>         if (current_var[0] != '=')
>             env.AppendString(current_var);
> 
> -        environment_block += current_var.size()+1;
> +        environment_block += current_var_size;
>     }
>     return env.GetSize();
> }
> 
> Modified: lldb/trunk/source/Host/windows/HostInfoWindows.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/windows/HostInfoWindows.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/source/Host/windows/HostInfoWindows.cpp (original)
> +++ lldb/trunk/source/Host/windows/HostInfoWindows.cpp Tue Mar 22 12:58:09 2016
> @@ -15,9 +15,10 @@
> 
> #include "lldb/Host/windows/HostInfoWindows.h"
> #include "llvm/ADT/SmallString.h"
> +#include "llvm/Support/ConvertUTF.h"
> #include "llvm/Support/FileSystem.h"
> -#include "llvm/Support/raw_ostream.h"
> #include "llvm/Support/Path.h"
> +#include "llvm/Support/raw_ostream.h"
> 
> using namespace lldb_private;
> 
> @@ -92,23 +93,24 @@ HostInfoWindows::GetOSKernelDescription(
> bool
> HostInfoWindows::GetHostname(std::string &s)
> {
> -    char buffer[MAX_COMPUTERNAME_LENGTH + 1];
> +    wchar_t buffer[MAX_COMPUTERNAME_LENGTH + 1];
>     DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1;
> -    if (!::GetComputerName(buffer, &dwSize))
> +    if (!::GetComputerNameW(buffer, &dwSize))
>         return false;
> 
> -    s.assign(buffer, buffer + dwSize);
> -    return true;
> +    return llvm::convertWideToUTF8(buffer, s);
> }
> 
> FileSpec
> HostInfoWindows::GetProgramFileSpec()
> {
>     static std::once_flag g_once_flag;
> -    std::call_once(g_once_flag,  []() {
> -        char buffer[PATH_MAX];
> -        ::GetModuleFileName(NULL, buffer, sizeof(buffer));
> -        m_program_filespec.SetFile(buffer, false);
> +    std::call_once(g_once_flag, []() {
> +        std::vector<wchar_t> buffer(PATH_MAX);
> +        ::GetModuleFileNameW(NULL, buffer.data(), buffer.size());
> +        std::string path;
> +        llvm::convertWideToUTF8(buffer.data(), path);
> +        m_program_filespec.SetFile(path, false);
>     });
>     return m_program_filespec;
> }
> @@ -116,7 +118,9 @@ HostInfoWindows::GetProgramFileSpec()
> FileSpec
> HostInfoWindows::GetDefaultShell()
> {
> -    return FileSpec(::getenv("ComSpec"), false);
> +    std::string shell;
> +    GetEnvironmentVar("ComSpec", shell);
> +    return FileSpec(shell, false);
> }
> 
> bool
> @@ -132,3 +136,15 @@ HostInfoWindows::ComputePythonDirectory(
>     file_spec.GetDirectory().SetString(path.c_str());
>     return true;
> }
> +
> +bool
> +HostInfoWindows::GetEnvironmentVar(const std::string &var_name, std::string &var)
> +{
> +    std::wstring wvar_name;
> +    if (!llvm::ConvertUTF8toWide(var_name, wvar_name))
> +        return false;
> +
> +    if (const wchar_t *wvar = _wgetenv(wvar_name.c_str()))
> +        return llvm::convertWideToUTF8(wvar, var);
> +    return false;
> +}
> 
> Modified: lldb/trunk/source/Host/windows/HostProcessWindows.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/windows/HostProcessWindows.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/source/Host/windows/HostProcessWindows.cpp (original)
> +++ lldb/trunk/source/Host/windows/HostProcessWindows.cpp Tue Mar 22 12:58:09 2016
> @@ -14,6 +14,7 @@
> #include "lldb/Host/windows/HostProcessWindows.h"
> 
> #include "llvm/ADT/STLExtras.h"
> +#include "llvm/Support/ConvertUTF.h"
> 
> #include <Psapi.h>
> 
> @@ -70,9 +71,15 @@ Error HostProcessWindows::GetMainModule(
>     if (m_process == nullptr)
>         error.SetError(ERROR_INVALID_HANDLE, lldb::eErrorTypeWin32);
> 
> -    char path[MAX_PATH] = { 0 };
> -    if (::GetProcessImageFileName(m_process, path, llvm::array_lengthof(path)))
> -        file_spec.SetFile(path, false);
> +    std::vector<wchar_t> wpath(PATH_MAX);
> +    if (::GetProcessImageFileNameW(m_process, wpath.data(), wpath.size()))
> +    {
> +        std::string path;
> +        if (llvm::convertWideToUTF8(wpath.data(), path))
> +            file_spec.SetFile(path, false);
> +        else
> +            error.SetErrorString("Error converting path to UTF-8");
> +    }
>     else
>         error.SetError(::GetLastError(), lldb::eErrorTypeWin32);
> 
> 
> Modified: lldb/trunk/source/Host/windows/PipeWindows.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/windows/PipeWindows.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/source/Host/windows/PipeWindows.cpp (original)
> +++ lldb/trunk/source/Host/windows/PipeWindows.cpp Tue Mar 22 12:58:09 2016
> @@ -73,8 +73,8 @@ PipeWindows::CreateNew(llvm::StringRef n
> 
>     // Always open for overlapped i/o.  We implement blocking manually in Read and Write.
>     DWORD read_mode = FILE_FLAG_OVERLAPPED;
> -    m_read =
> -        ::CreateNamedPipe(pipe_path.c_str(), PIPE_ACCESS_INBOUND | read_mode, PIPE_TYPE_BYTE | PIPE_WAIT, 1, 1024, 1024, 120 * 1000, NULL);
> +    m_read = ::CreateNamedPipeA(pipe_path.c_str(), PIPE_ACCESS_INBOUND | read_mode, PIPE_TYPE_BYTE | PIPE_WAIT, 1, 1024,
> +                                1024, 120 * 1000, NULL);
>     if (INVALID_HANDLE_VALUE == m_read)
>         return Error(::GetLastError(), eErrorTypeWin32);
>     m_read_fd = _open_osfhandle((intptr_t)m_read, _O_RDONLY);
> @@ -153,7 +153,8 @@ PipeWindows::OpenNamedPipe(llvm::StringR
> 
>     if (is_read)
>     {
> -        m_read = ::CreateFile(pipe_path.c_str(), GENERIC_READ, 0, &attributes, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
> +        m_read =
> +            ::CreateFileA(pipe_path.c_str(), GENERIC_READ, 0, &attributes, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
>         if (INVALID_HANDLE_VALUE == m_read)
>             return Error(::GetLastError(), eErrorTypeWin32);
> 
> @@ -164,7 +165,8 @@ PipeWindows::OpenNamedPipe(llvm::StringR
>     }
>     else
>     {
> -        m_write = ::CreateFile(pipe_path.c_str(), GENERIC_WRITE, 0, &attributes, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
> +        m_write =
> +            ::CreateFileA(pipe_path.c_str(), GENERIC_WRITE, 0, &attributes, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
>         if (INVALID_HANDLE_VALUE == m_write)
>             return Error(::GetLastError(), eErrorTypeWin32);
> 
> 
> Modified: lldb/trunk/source/Host/windows/ProcessLauncherWindows.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/windows/ProcessLauncherWindows.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/source/Host/windows/ProcessLauncherWindows.cpp (original)
> +++ lldb/trunk/source/Host/windows/ProcessLauncherWindows.cpp Tue Mar 22 12:58:09 2016
> @@ -11,6 +11,9 @@
> #include "lldb/Host/windows/ProcessLauncherWindows.h"
> #include "lldb/Target/ProcessLaunchInfo.h"
> 
> +#include "llvm/ADT/SmallVector.h"
> +#include "llvm/Support/ConvertUTF.h"
> +
> #include <string>
> #include <vector>
> 
> @@ -25,20 +28,18 @@ CreateEnvironmentBuffer(const Args &env,
>     if (env.GetArgumentCount() == 0)
>         return;
> 
> -    int bytes = 0;
> -    for (int i = 0; i < env.GetArgumentCount(); ++i)
> -        bytes += strlen(env.GetArgumentAtIndex(i)) + sizeof(char);
> -    bytes += sizeof(char);
> -    buffer.resize(bytes);
> -    char *cur_entry = &buffer[0];
> +    // Environment buffer is a null terminated list of null terminated strings
>     for (int i = 0; i < env.GetArgumentCount(); ++i)
>     {
> -        ::strcpy(cur_entry, env.GetArgumentAtIndex(i));
> -        cur_entry += strlen(cur_entry) + sizeof(char);
> +        std::wstring warg;
> +        if (llvm::ConvertUTF8toWide(env.GetArgumentAtIndex(i), warg))
> +        {
> +            buffer.insert(buffer.end(), (char *)warg.c_str(), (char *)(warg.c_str() + warg.size() + 1));
> +        }
>     }
> -    // Environment buffer is a null terminated list of null terminated
> -    // strings, so it is terminated by two null bytes.
> -    buffer.back() = 0;
> +    // One null wchar_t (to end the block) is two null bytes
> +    buffer.push_back(0);
> +    buffer.push_back(0);
> }
> }
> 
> @@ -70,7 +71,7 @@ ProcessLauncherWindows::LaunchProcess(co
>         startupinfo.wShowWindow = SW_HIDE;
>     }
> 
> -    DWORD flags = CREATE_NEW_CONSOLE;
> +    DWORD flags = CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT;
>     if (launch_info.GetFlags().Test(eLaunchFlagDebug))
>         flags |= DEBUG_ONLY_THIS_PROCESS;
> 
> @@ -82,8 +83,15 @@ ProcessLauncherWindows::LaunchProcess(co
> 
>     executable = launch_info.GetExecutableFile().GetPath();
>     launch_info.GetArguments().GetQuotedCommandString(commandLine);
> -    BOOL result = ::CreateProcessA(executable.c_str(), const_cast<char *>(commandLine.c_str()), NULL, NULL, TRUE, flags,
> -                                   env_block, launch_info.GetWorkingDirectory().GetCString(), &startupinfo, &pi);
> +
> +    std::wstring wexecutable, wcommandLine, wworkingDirectory;
> +    llvm::ConvertUTF8toWide(executable, wexecutable);
> +    llvm::ConvertUTF8toWide(commandLine, wcommandLine);
> +    llvm::ConvertUTF8toWide(launch_info.GetWorkingDirectory().GetCString(), wworkingDirectory);
> +
> +    wcommandLine.resize(PATH_MAX); // Needs to be over-allocated because CreateProcessW can modify it
> +    BOOL result = ::CreateProcessW(wexecutable.c_str(), &wcommandLine[0], NULL, NULL, TRUE, flags, env_block,
> +                                   wworkingDirectory.size() == 0 ? NULL : wworkingDirectory.c_str(), &startupinfo, &pi);
>     if (result)
>     {
>         // Do not call CloseHandle on pi.hProcess, since we want to pass that back through the HostProcess.
> @@ -131,6 +139,8 @@ ProcessLauncherWindows::GetStdioHandle(c
>             flags = FILE_FLAG_WRITE_THROUGH;
>     }
> 
> -    HANDLE result = ::CreateFile(path, access, share, &secattr, create, flags, NULL);
> +    std::wstring wpath;
> +    llvm::ConvertUTF8toWide(path, wpath);
> +    HANDLE result = ::CreateFileW(wpath.c_str(), access, share, &secattr, create, flags, NULL);
>     return (result == INVALID_HANDLE_VALUE) ? NULL : result;
> }
> 
> Modified: lldb/trunk/source/Host/windows/Windows.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/windows/Windows.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/source/Host/windows/Windows.cpp (original)
> +++ lldb/trunk/source/Host/windows/Windows.cpp Tue Mar 22 12:58:09 2016
> @@ -12,6 +12,8 @@
> #include "lldb/Host/windows/windows.h"
> #include "lldb/Host/windows/win32.h"
> 
> +#include "llvm/Support/ConvertUTF.h"
> +
> #include <stdio.h>
> #include <stdarg.h>
> #include <string.h>
> @@ -27,6 +29,29 @@ extern "C"
>     int _chdir(const char *path);
> }
> 
> +namespace
> +{
> +bool
> +utf8ToWide(const char *utf8, wchar_t *buf, size_t bufSize)
> +{
> +    const UTF8 *sourceStart = reinterpret_cast<const UTF8 *>(utf8);
> +    size_t sourceLen = strlen(utf8) + 1 /* convert null too */;
> +    UTF16 *target = reinterpret_cast<UTF16 *>(buf);
> +    ConversionFlags flags = strictConversion;
> +    return ConvertUTF8toUTF16(&sourceStart, sourceStart + sourceLen, &target, target + bufSize, flags) == conversionOK;
> +}
> +
> +bool
> +wideToUtf8(const wchar_t *wide, char *buf, size_t bufSize)
> +{
> +    const UTF16 *sourceStart = reinterpret_cast<const UTF16 *>(wide);
> +    size_t sourceLen = wcslen(wide) + 1 /* convert null too */;
> +    UTF8 *target = reinterpret_cast<UTF8 *>(buf);
> +    ConversionFlags flags = strictConversion;
> +    return ConvertUTF16toUTF8(&sourceStart, sourceStart + sourceLen, &target, target + bufSize, flags) == conversionOK;
> +}
> +}
> +
> int vasprintf(char **ret, const char *fmt, va_list ap)
> {
>     char *buf;
> @@ -75,81 +100,90 @@ char* strcasestr(const char *s, const ch
> 
> char* realpath(const char * name, char * resolved)
> {
> -    char *retname = NULL;  /* we will return this, if we fail */
> +    char *retname = NULL;
> 
>     /* SUSv3 says we must set `errno = EINVAL', and return NULL,
>     * if `name' is passed as a NULL pointer.
>     */
> -
>     if (name == NULL)
> +    {
>         errno = EINVAL;
> +        return NULL;
> +    }
> 
>     /* Otherwise, `name' must refer to a readable filesystem object,
>     * if we are going to resolve its absolute path name.
>     */
> -
> -    else if (access(name, 4) == 0)
> +    wchar_t wideNameBuffer[PATH_MAX];
> +    wchar_t *wideName = wideNameBuffer;
> +    if (!utf8ToWide(name, wideName, PATH_MAX))
>     {
> -        /* If `name' didn't point to an existing entity,
> -        * then we don't get to here; we simply fall past this block,
> -        * returning NULL, with `errno' appropriately set by `access'.
> -        *
> -        * When we _do_ get to here, then we can use `_fullpath' to
> -        * resolve the full path for `name' into `resolved', but first,
> -        * check that we have a suitable buffer, in which to return it.
> -        */
> +        errno = EINVAL;
> +        return NULL;
> +    }
> 
> -        if ((retname = resolved) == NULL)
> -        {
> -            /* Caller didn't give us a buffer, so we'll exercise the
> -            * option granted by SUSv3, and allocate one.
> -            *
> -            * `_fullpath' would do this for us, but it uses `malloc', and
> -            * Microsoft's implementation doesn't set `errno' on failure.
> -            * If we don't do this explicitly ourselves, then we will not
> -            * know if `_fullpath' fails on `malloc' failure, or for some
> -            * other reason, and we want to set `errno = ENOMEM' for the
> -            * `malloc' failure case.
> -            */
> +    if (_waccess(wideName, 4) != 0)
> +        return NULL;
> 
> -            retname = (char*) malloc(_MAX_PATH);
> -        }
> +    /* If `name' didn't point to an existing entity,
> +    * then we don't get to here; we simply fall past this block,
> +    * returning NULL, with `errno' appropriately set by `access'.
> +    *
> +    * When we _do_ get to here, then we can use `_fullpath' to
> +    * resolve the full path for `name' into `resolved', but first,
> +    * check that we have a suitable buffer, in which to return it.
> +    */
> 
> -        /* By now, we should have a valid buffer.
> -        * If we don't, then we know that `malloc' failed,
> -        * so we can set `errno = ENOMEM' appropriately.
> +    if ((retname = resolved) == NULL)
> +    {
> +        /* Caller didn't give us a buffer, so we'll exercise the
> +        * option granted by SUSv3, and allocate one.
> +        *
> +        * `_fullpath' would do this for us, but it uses `malloc', and
> +        * Microsoft's implementation doesn't set `errno' on failure.
> +        * If we don't do this explicitly ourselves, then we will not
> +        * know if `_fullpath' fails on `malloc' failure, or for some
> +        * other reason, and we want to set `errno = ENOMEM' for the
> +        * `malloc' failure case.
>         */
> 
> +        retname = (char *)malloc(PATH_MAX);
>         if (retname == NULL)
> +        {
>             errno = ENOMEM;
> +            return NULL;
> +        }
> +    }
> 
> -        /* Otherwise, when we do have a valid buffer,
> -        * `_fullpath' should only fail if the path name is too long.
> -        */
> +    /* Otherwise, when we do have a valid buffer,
> +    * `_fullpath' should only fail if the path name is too long.
> +    */
> 
> -        else if ((retname = _fullpath(retname, name, _MAX_PATH)) == NULL)
> -            errno = ENAMETOOLONG;
> +    wchar_t wideFullPathBuffer[PATH_MAX];
> +    wchar_t *wideFullPath;
> +    if ((wideFullPath = _wfullpath(wideFullPathBuffer, wideName, PATH_MAX)) == NULL)
> +    {
> +        errno = ENAMETOOLONG;
> +        return NULL;
>     }
> 
> -    /* By the time we get to here,
> -    * `retname' either points to the required resolved path name,
> -    * or it is NULL, with `errno' set appropriately, either of which
> -    * is our required return condition.
> -    */
> +    // Do a LongPath<->ShortPath roundtrip so that case is resolved by OS
> +    // FIXME: Check for failure
> +    size_t initialLength = wcslen(wideFullPath);
> +    GetShortPathNameW(wideFullPath, wideNameBuffer, PATH_MAX);
> +    GetLongPathNameW(wideNameBuffer, wideFullPathBuffer, initialLength + 1);
> 
> -    if (retname != NULL)
> +    // Convert back to UTF-8
> +    if (!wideToUtf8(wideFullPathBuffer, retname, PATH_MAX))
>     {
> -        // Do a LongPath<->ShortPath roundtrip so that case is resolved by OS
> -        int initialLength = strlen(retname);
> -        TCHAR buffer[MAX_PATH];
> -        GetShortPathName(retname, buffer, MAX_PATH);
> -        GetLongPathName(buffer, retname, initialLength + 1);
> -
> -        // Force drive to be upper case
> -        if (retname[1] == ':')
> -            retname[0] = toupper(retname[0]);
> +        errno = EINVAL;
> +        return NULL;
>     }
> 
> +    // Force drive to be upper case
> +    if (retname[1] == ':')
> +        retname[0] = toupper(retname[0]);
> +
>     return retname;
> }
> 
> @@ -167,7 +201,27 @@ char* basename(char *path)
> // use _getcwd() instead of GetCurrentDirectory() because it updates errno
> char* getcwd(char* path, int max)
> {
> -    return _getcwd(path, max);
> +    assert(path == NULL || max <= PATH_MAX);
> +    wchar_t wpath[PATH_MAX];
> +    if (wchar_t *wresult = _wgetcwd(wpath, PATH_MAX))
> +    {
> +        // Caller is allowed to pass in NULL for `path`.
> +        // In that case, we're supposed to allocate a
> +        // buffer on the caller's behalf.
> +        if (path == NULL)
> +        {
> +            max = UNI_MAX_UTF8_BYTES_PER_CODE_POINT * wcslen(wresult) + 1;
> +            path = (char *)malloc(max);
> +            if (path == NULL)
> +            {
> +                errno = ENOMEM;
> +                return NULL;
> +            }
> +        }
> +        if (wideToUtf8(wresult, path, max))
> +            return path;
> +    }
> +    return NULL;
> }
> 
> // use _chdir() instead of SetCurrentDirectory() because it updates errno
> 
> Modified: lldb/trunk/source/Plugins/Process/Windows/Live/DebuggerThread.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Windows/Live/DebuggerThread.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/source/Plugins/Process/Windows/Live/DebuggerThread.cpp (original)
> +++ lldb/trunk/source/Plugins/Process/Windows/Live/DebuggerThread.cpp Tue Mar 22 12:58:09 2016
> @@ -27,6 +27,7 @@
> #include "Plugins/Process/Windows/Common/ProcessWindowsLog.h"
> 
> #include "llvm/ADT/STLExtras.h"
> +#include "llvm/Support/ConvertUTF.h"
> #include "llvm/Support/raw_ostream.h"
> 
> using namespace lldb;
> @@ -484,13 +485,15 @@ DebuggerThread::HandleLoadDllEvent(const
>         return DBG_CONTINUE;
>     }
> 
> -    std::vector<char> buffer(1);
> -    DWORD required_size = GetFinalPathNameByHandle(info.hFile, &buffer[0], 0, VOLUME_NAME_DOS);
> +    std::vector<wchar_t> buffer(1);
> +    DWORD required_size = GetFinalPathNameByHandleW(info.hFile, &buffer[0], 0, VOLUME_NAME_DOS);
>     if (required_size > 0)
>     {
>         buffer.resize(required_size + 1);
> -        required_size = GetFinalPathNameByHandle(info.hFile, &buffer[0], required_size + 1, VOLUME_NAME_DOS);
> -        llvm::StringRef path_str(&buffer[0]);
> +        required_size = GetFinalPathNameByHandleW(info.hFile, &buffer[0], required_size, VOLUME_NAME_DOS);
> +        std::string path_str_utf8;
> +        llvm::convertWideToUTF8(buffer.data(), path_str_utf8);
> +        llvm::StringRef path_str = path_str_utf8;
>         const char *path = path_str.data();
>         if (path_str.startswith("\\\\?\\"))
>             path += 4;
> 
> Modified: lldb/trunk/source/Plugins/Process/Windows/Live/ProcessWindowsLive.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Windows/Live/ProcessWindowsLive.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/source/Plugins/Process/Windows/Live/ProcessWindowsLive.cpp (original)
> +++ lldb/trunk/source/Plugins/Process/Windows/Live/ProcessWindowsLive.cpp Tue Mar 22 12:58:09 2016
> @@ -47,6 +47,7 @@
> #include "ProcessWindowsLive.h"
> #include "TargetThreadWindowsLive.h"
> 
> +#include "llvm/Support/ConvertUTF.h"
> #include "llvm/Support/Format.h"
> #include "llvm/Support/raw_ostream.h"
> 
> @@ -61,17 +62,19 @@ namespace
> std::string
> GetProcessExecutableName(HANDLE process_handle)
> {
> -    std::vector<char> file_name;
> +    std::vector<wchar_t> file_name;
>     DWORD file_name_size = MAX_PATH;  // first guess, not an absolute limit
>     DWORD copied = 0;
>     do
>     {
>         file_name_size *= 2;
>         file_name.resize(file_name_size);
> -        copied = ::GetModuleFileNameEx(process_handle, NULL, file_name.data(), file_name_size);
> +        copied = ::GetModuleFileNameExW(process_handle, NULL, file_name.data(), file_name_size);
>     } while (copied >= file_name_size);
>     file_name.resize(copied);
> -    return std::string(file_name.begin(), file_name.end());
> +    std::string result;
> +    llvm::convertWideToUTF8(file_name.data(), result);
> +    return result;
> }
> 
> std::string
> 
> Modified: lldb/trunk/source/Plugins/Process/Windows/MiniDump/ProcessWinMiniDump.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Windows/MiniDump/ProcessWinMiniDump.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/source/Plugins/Process/Windows/MiniDump/ProcessWinMiniDump.cpp (original)
> +++ lldb/trunk/source/Plugins/Process/Windows/MiniDump/ProcessWinMiniDump.cpp Tue Mar 22 12:58:09 2016
> @@ -370,14 +370,21 @@ ProcessWinMiniDump::Impl::MapMiniDumpInt
> {
>     Error error;
>     const char *file = m_core_file.GetCString();
> -    m_dump_file = ::CreateFile(file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
> +    std::wstring wfile;
> +    if (!llvm::ConvertUTF8toWide(file, wfile))
> +    {
> +        error.SetErrorString("Error converting path to UTF-16");
> +        return error;
> +    }
> +    m_dump_file =
> +        ::CreateFileW(wfile.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
>     if (m_dump_file == INVALID_HANDLE_VALUE)
>     {
>         error.SetError(::GetLastError(), lldb::eErrorTypeWin32);
>         return error;
>     }
> 
> -    m_mapping = ::CreateFileMapping(m_dump_file, NULL, PAGE_READONLY, 0, 0, NULL);
> +    m_mapping = ::CreateFileMappingW(m_dump_file, NULL, PAGE_READONLY, 0, 0, NULL);
>     if (m_mapping == NULL)
>     {
>         error.SetError(::GetLastError(), lldb::eErrorTypeWin32);
> @@ -509,7 +516,7 @@ ProcessWinMiniDump::Impl::GetMiniDumpStr
>     auto source_start = reinterpret_cast<const UTF16 *>(md_string->Buffer);
>     const auto source_length = ::wcslen(md_string->Buffer);
>     const auto source_end = source_start + source_length;
> -    result.resize(4 * source_length); // worst case length
> +    result.resize(UNI_MAX_UTF8_BYTES_PER_CODE_POINT * source_length); // worst case length
>     auto result_start = reinterpret_cast<UTF8 *>(&result[0]);
>     const auto result_end = result_start + result.size();
>     ConvertUTF16toUTF8(&source_start, source_end, &result_start, result_end, strictConversion);
> 
> Modified: lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp (original)
> +++ lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp Tue Mar 22 12:58:09 2016
> @@ -19,8 +19,11 @@
> 
> #include "lldb/Core/Stream.h"
> #include "lldb/Host/File.h"
> +#include "lldb/Host/FileSystem.h"
> #include "lldb/Interpreter/ScriptInterpreter.h"
> 
> +#include "llvm/Support/ConvertUTF.h"
> +
> #include <stdio.h>
> 
> #include "llvm/ADT/StringSwitch.h"
> @@ -1162,9 +1165,7 @@ PythonFile::PythonFile(File &file, const
> 
> PythonFile::PythonFile(const char *path, const char *mode)
> {
> -    FILE *fp = nullptr;
> -    fp = fopen(path, mode);
> -    lldb_private::File file(fp, true);
> +    lldb_private::File file(path, GetOptionsFromMode(mode));
>     Reset(file, mode);
> }
> 
> 
> Modified: lldb/trunk/source/Target/ProcessLaunchInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/ProcessLaunchInfo.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/source/Target/ProcessLaunchInfo.cpp (original)
> +++ lldb/trunk/source/Target/ProcessLaunchInfo.cpp Tue Mar 22 12:58:09 2016
> @@ -13,14 +13,21 @@
> 
> // Other libraries and framework includes
> // Project includes
> -#include "lldb/Host/Config.h"
> #include "lldb/Core/Debugger.h"
> #include "lldb/Core/Log.h"
> +#include "lldb/Host/Config.h"
> #include "lldb/Host/FileSystem.h"
> -#include "lldb/Target/ProcessLaunchInfo.h"
> +#include "lldb/Host/HostInfo.h"
> #include "lldb/Target/FileAction.h"
> +#include "lldb/Target/ProcessLaunchInfo.h"
> #include "lldb/Target/Target.h"
> 
> +#include "llvm/Support/ConvertUTF.h"
> +
> +#if !defined(_WIN32)
> +#include <limits.h>
> +#endif
> +
> using namespace lldb;
> using namespace lldb_private;
> 
> @@ -449,8 +456,8 @@ ProcessLaunchInfo::ConvertArgumentsForLa
>                         if (cwd && cwd[0])
>                             new_path += cwd;
>                     }
> -                    const char *curr_path = getenv("PATH");
> -                    if (curr_path)
> +                    std::string curr_path;
> +                    if (HostInfo::GetEnvironmentVar("PATH", curr_path))
>                     {
>                         if (new_path.size() > empty_path_len)
>                             new_path += ':';
> 
> Modified: lldb/trunk/tools/driver/Driver.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/driver/Driver.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/tools/driver/Driver.cpp (original)
> +++ lldb/trunk/tools/driver/Driver.cpp Tue Mar 22 12:58:09 2016
> @@ -27,7 +27,6 @@
> 
> #include <string>
> 
> -#include <thread>
> #include "lldb/API/SBBreakpoint.h"
> #include "lldb/API/SBCommandInterpreter.h"
> #include "lldb/API/SBCommandReturnObject.h"
> @@ -37,11 +36,13 @@
> #include "lldb/API/SBHostOS.h"
> #include "lldb/API/SBLanguageRuntime.h"
> #include "lldb/API/SBListener.h"
> +#include "lldb/API/SBProcess.h"
> #include "lldb/API/SBStream.h"
> #include "lldb/API/SBStringList.h"
> #include "lldb/API/SBTarget.h"
> #include "lldb/API/SBThread.h"
> -#include "lldb/API/SBProcess.h"
> +#include "llvm/Support/ConvertUTF.h"
> +#include <thread>
> 
> #if !defined(__APPLE__)
> #include "llvm/Support/DataTypes.h"
> @@ -1298,7 +1299,11 @@ sigcont_handler (int signo)
> }
> 
> int
> -main (int argc, char const *argv[], const char *envp[])
> +#ifdef WIN32
> +wmain(int argc, wchar_t const *wargv[])
> +#else
> +main(int argc, char const *argv[])
> +#endif
> {
> #ifdef _MSC_VER
> 	// disable buffering on windows
> @@ -1306,37 +1311,49 @@ main (int argc, char const *argv[], cons
> 	setvbuf(stdin , NULL, _IONBF, 0);
> #endif
> 
> -    SBDebugger::Initialize();
> -    
> -    SBHostOS::ThreadCreated ("<lldb.driver.main-thread>");
> -
> -    signal(SIGINT, sigint_handler);
> -#ifndef _MSC_VER
> -    signal (SIGPIPE, SIG_IGN);
> -    signal (SIGWINCH, sigwinch_handler);
> -    signal (SIGTSTP, sigtstp_handler);
> -    signal (SIGCONT, sigcont_handler);
> +#ifdef _WIN32
> +        // Convert wide arguments to UTF-8
> +        std::vector<std::string> argvStrings(argc);
> +        std::vector<const char *> argvPointers(argc);
> +        for (int i = 0; i != argc; ++i)
> +        {
> +            llvm::convertWideToUTF8(wargv[i], argvStrings[i]);
> +            argvPointers[i] = argvStrings[i].c_str();
> +        }
> +        const char **argv = argvPointers.data();
> #endif
> 
> -    // Create a scope for driver so that the driver object will destroy itself
> -    // before SBDebugger::Terminate() is called.
> -    {
> -        Driver driver;
> +        SBDebugger::Initialize();
> 
> -        bool exiting = false;
> -        SBError error (driver.ParseArgs (argc, argv, stdout, exiting));
> -        if (error.Fail())
> -        {
> -            const char *error_cstr = error.GetCString ();
> -            if (error_cstr)
> -                ::fprintf (stderr, "error: %s\n", error_cstr);
> -        }
> -        else if (!exiting)
> +        SBHostOS::ThreadCreated("<lldb.driver.main-thread>");
> +
> +        signal(SIGINT, sigint_handler);
> +#if !defined(_MSC_VER)
> +        signal(SIGPIPE, SIG_IGN);
> +        signal(SIGWINCH, sigwinch_handler);
> +        signal(SIGTSTP, sigtstp_handler);
> +        signal(SIGCONT, sigcont_handler);
> +#endif
> +
> +        // Create a scope for driver so that the driver object will destroy itself
> +        // before SBDebugger::Terminate() is called.
>         {
> -            driver.MainLoop ();
> +            Driver driver;
> +
> +            bool exiting = false;
> +            SBError error(driver.ParseArgs(argc, argv, stdout, exiting));
> +            if (error.Fail())
> +            {
> +                const char *error_cstr = error.GetCString();
> +                if (error_cstr)
> +                    ::fprintf(stderr, "error: %s\n", error_cstr);
> +            }
> +            else if (!exiting)
> +            {
> +                driver.MainLoop();
> +            }
>         }
> -    }
> 
> -    SBDebugger::Terminate();
> -    return 0;
> +        SBDebugger::Terminate();
> +        return 0;
> }
> 
> Modified: lldb/trunk/tools/lldb-mi/MICmnLLDBDebugSessionInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmnLLDBDebugSessionInfo.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/tools/lldb-mi/MICmnLLDBDebugSessionInfo.cpp (original)
> +++ lldb/trunk/tools/lldb-mi/MICmnLLDBDebugSessionInfo.cpp Tue Mar 22 12:58:09 2016
> @@ -18,15 +18,16 @@
> #include "lldb/API/SBBreakpointLocation.h"
> 
> // In-house headers:
> +#include "MICmdData.h"
> #include "MICmnLLDBDebugSessionInfo.h"
> #include "MICmnLLDBDebugger.h"
> -#include "MICmnResources.h"
> +#include "MICmnLLDBUtilSBValue.h"
> #include "MICmnMIResultRecord.h"
> #include "MICmnMIValueConst.h"
> #include "MICmnMIValueList.h"
> #include "MICmnMIValueTuple.h"
> -#include "MICmdData.h"
> -#include "MICmnLLDBUtilSBValue.h"
> +#include "MICmnResources.h"
> +#include "Platform.h"
> 
> //++ ------------------------------------------------------------------------------------
> // Details: CMICmnLLDBDebugSessionInfo constructor.
> @@ -614,7 +615,7 @@ CMICmnLLDBDebugSessionInfo::GetFrameInfo
> {
>     lldb::SBFrame &rFrame = const_cast<lldb::SBFrame &>(vrFrame);
> 
> -    static char pBuffer[MAX_PATH];
> +    static char pBuffer[PATH_MAX];
>     const MIuint nBytes = rFrame.GetLineEntry().GetFileSpec().GetPath(&pBuffer[0], sizeof(pBuffer));
>     MIunused(nBytes);
>     CMIUtilString strResolvedPath(&pBuffer[0]);
> 
> Modified: lldb/trunk/tools/lldb-mi/MIUtilFileStd.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MIUtilFileStd.cpp?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/tools/lldb-mi/MIUtilFileStd.cpp (original)
> +++ lldb/trunk/tools/lldb-mi/MIUtilFileStd.cpp Tue Mar 22 12:58:09 2016
> @@ -14,8 +14,11 @@
> #include <cerrno>
> 
> // In-house headers:
> -#include "MIUtilFileStd.h"
> #include "MICmnResources.h"
> +#include "MIUtilFileStd.h"
> +#include "lldb/Host/FileSystem.h"
> +
> +#include "llvm/Support/ConvertUTF.h"
> 
> //++ ------------------------------------------------------------------------------------
> // Details: CMIUtilFileStd constructor.
> @@ -82,7 +85,14 @@ CMIUtilFileStd::CreateWrite(const CMIUti
>     m_pFileHandle = ::fopen(vFileNamePath.c_str(), "wb");
> #else
>     // Open a file with exclusive write and shared read permissions
> -    m_pFileHandle = ::_fsopen(vFileNamePath.c_str(), "wb", _SH_DENYWR);
> +    std::wstring path;
> +    if (llvm::ConvertUTF8toWide(vFileNamePath.c_str(), path))
> +        m_pFileHandle = ::_wfsopen(path.c_str(), L"wb", _SH_DENYWR);
> +    else
> +    {
> +        errno = EINVAL;
> +        m_pFileHandle = nullptr;
> +    }
> #endif // !defined( _MSC_VER )
> 
>     if (m_pFileHandle == nullptr)
> @@ -221,8 +231,7 @@ CMIUtilFileStd::IsFileExist(const CMIUti
>     if (vFileNamePath.empty())
>         return false;
> 
> -    FILE *pTmp = nullptr;
> -    pTmp = ::fopen(vFileNamePath.c_str(), "wb");
> +    FILE *pTmp = lldb_private::FileSystem::Fopen(vFileNamePath.c_str(), "wb");
>     if (pTmp != nullptr)
>     {
>         ::fclose(pTmp);
> 
> Modified: lldb/trunk/tools/lldb-mi/Platform.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/Platform.h?rev=264074&r1=264073&r2=264074&view=diff
> ==============================================================================
> --- lldb/trunk/tools/lldb-mi/Platform.h (original)
> +++ lldb/trunk/tools/lldb-mi/Platform.h Tue Mar 22 12:58:09 2016
> @@ -58,7 +58,7 @@ struct termios
> typedef long pid_t;
> 
> #define STDIN_FILENO 0
> -#define PATH_MAX MAX_PATH
> +#define PATH_MAX 32768
> #define snprintf _snprintf
> 
> extern int ioctl(int d, int request, ...);
> 
> 
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20160322/65db3f78/attachment-0001.html>


More information about the lldb-commits mailing list