From 6976bacd66e606865f656312bf6d991f3a6e4507 Mon Sep 17 00:00:00 2001 From: Wesley Jenkins <103457588+wesjenkins@users.noreply.github.com> Date: Tue, 14 Feb 2023 11:35:11 -0500 Subject: [PATCH] Fix Base.libllvm_path and jl_get_libllvm don't support non-ASCII characters in path on Windows (#45126) (#45127) * Fix jl_get_libllvm_impl to support non-ASCII characters * Fix jl_get_libllvm_impl to support non-ASCII characters, fix whitespace * Fix jl_get_libllvm_impl to support non-ASCII characters, fix null and buffer --- src/codegen.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/codegen.cpp b/src/codegen.cpp index 889e84175d40c..36d0b6c85fb12 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -8960,11 +8960,15 @@ extern "C" JL_DLLEXPORT jl_value_t *jl_get_libllvm_impl(void) JL_NOTSAFEPOINT HMODULE mod; if (!GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCSTR)&llvm::DebugFlag, &mod)) return jl_nothing; - - char path[MAX_PATH]; - if (!GetModuleFileNameA(mod, path, sizeof(path))) + wchar_t path16[MAX_PATH]; + DWORD n16 = GetModuleFileNameW(mod, path16, MAX_PATH); + if (n16 <= 0) + return jl_nothing; + path16[n16++] = 0; + char path8[MAX_PATH * 3]; + if (!WideCharToMultiByte(CP_UTF8, 0, path16, n16, path8, MAX_PATH * 3, NULL, NULL)) return jl_nothing; - return (jl_value_t*) jl_symbol(path); + return (jl_value_t*) jl_symbol(path8); #else Dl_info dli; if (!dladdr((void*)LLVMContextCreate, &dli))