2828#if defined(_WIN32)
2929#define WIN32_LEAN_AND_MEAN
3030#define NOMINMAX
31+ #include " llvm/Support/ConvertUTF.h"
32+ #include " llvm/Support/Windows/WindowsSupport.h"
3133#include < windows.h>
3234#else
3335#include < dlfcn.h>
4143
4244using namespace swift ;
4345
46+ namespace {
47+ void *loadLibrary (const char *path, std::string *err);
48+ void *getAddressOfSymbol (void *handle, const char *symbol);
49+
50+ #if defined(_WIN32)
51+ void *loadLibrary (const char *path, std::string *err) {
52+ SmallVector<wchar_t , MAX_PATH> pathUnicode;
53+ if (std::error_code ec = llvm::sys::windows::UTF8ToUTF16 (path, pathUnicode)) {
54+ SetLastError (ec.value ());
55+ llvm::MakeErrMsg (err, std::string (path) + " : Can't convert to UTF-16" );
56+ return nullptr ;
57+ }
58+
59+ HMODULE handle = LoadLibraryW (pathUnicode.data ());
60+ if (handle == NULL ) {
61+ llvm::MakeErrMsg (err, std::string (path) + " : Can't open" );
62+ return nullptr ;
63+ }
64+ return (void *)handle;
65+ }
66+
67+ void *getAddressOfSymbol (void *handle, const char *symbol) {
68+ return (void *)uintptr_t (GetProcAddress ((HMODULE)handle, symbol));
69+ }
70+
71+ #else
72+ void *loadLibrary (const char *path, std::string *err) {
73+ void *handle = ::dlopen (path, RTLD_LAZY | RTLD_LOCAL);
74+ if (!handle)
75+ *err = ::dlerror ();
76+ return handle;
77+ }
78+
79+ void *getAddressOfSymbol (void *handle, const char *symbol) {
80+ return ::dlsym (handle, symbol);
81+ }
82+
83+ #endif
84+ } // namespace
85+
4486PluginRegistry::PluginRegistry () {
4587 dumpMessaging = ::getenv (" SWIFT_DUMP_PLUGIN_MESSAGING" ) != nullptr ;
4688}
@@ -54,13 +96,13 @@ CompilerPlugin::~CompilerPlugin() {
5496llvm::Expected<std::unique_ptr<InProcessPlugins>>
5597InProcessPlugins::create (const char *serverPath) {
5698 std::string err;
57- auto server = llvm::sys::DynamicLibrary::getLibrary (serverPath, &err);
58- if (!server. isValid () ) {
99+ auto server = loadLibrary (serverPath, &err);
100+ if (!server) {
59101 return llvm::createStringError (llvm::inconvertibleErrorCode (), err);
60102 }
61103
62104 auto funcPtr =
63- server. getAddressOfSymbol (" swift_inproc_plugins_handle_message" );
105+ getAddressOfSymbol (server, " swift_inproc_plugins_handle_message" );
64106 if (!funcPtr) {
65107 return llvm::createStringError (llvm::inconvertibleErrorCode (),
66108 " entry point not found in '%s'" , serverPath);
0 commit comments