28
28
#if defined(_WIN32)
29
29
#define WIN32_LEAN_AND_MEAN
30
30
#define NOMINMAX
31
+ #include " llvm/Support/ConvertUTF.h"
32
+ #include " llvm/Support/Windows/WindowsSupport.h"
31
33
#include < windows.h>
32
34
#else
33
35
#include < dlfcn.h>
41
43
42
44
using namespace swift ;
43
45
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
+
44
86
PluginRegistry::PluginRegistry () {
45
87
dumpMessaging = ::getenv (" SWIFT_DUMP_PLUGIN_MESSAGING" ) != nullptr ;
46
88
}
@@ -54,13 +96,13 @@ CompilerPlugin::~CompilerPlugin() {
54
96
llvm::Expected<std::unique_ptr<InProcessPlugins>>
55
97
InProcessPlugins::create (const char *serverPath) {
56
98
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) {
59
101
return llvm::createStringError (llvm::inconvertibleErrorCode (), err);
60
102
}
61
103
62
104
auto funcPtr =
63
- server. getAddressOfSymbol (" swift_inproc_plugins_handle_message" );
105
+ getAddressOfSymbol (server, " swift_inproc_plugins_handle_message" );
64
106
if (!funcPtr) {
65
107
return llvm::createStringError (llvm::inconvertibleErrorCode (),
66
108
" entry point not found in '%s'" , serverPath);
0 commit comments