[lib/support] Questions about loadable modules on Windows


I have been playing around with a custom pass which is built out-of-source using CMake. It works as expected on Linux. I have also built the pass and llvm trunk (separately) using Visual Studio. However when running opt –load=… -help on Windows, the –load directive appears to work but the passes defined in the .dll are not displayed. In several places it is suggested that this is due to dynamic linking not being supported on Windows (e.g. [1]). However, I do not fully understand this explanation, since there does in fact appear to be Run-Time Dynamic Linking on Windows [2], and this is even implemented in lib/Support/Windows/DynamicLibrary.inc. I would greatly appreciate someone explaining in a little more detail why dynamic linking of loadable modules is not supported on Windows, or if it is and I’m just doing something wrong.

Thanks a lot,


[1] http://uu-kk.blogspot.de/2012/02/llvm-pass-on-windows-integrating-with.html

[2] https://msdn.microsoft.com/en-us/library/windows/desktop/ms685090(v=vs.85).aspx

Plugins for opt are expected to reference symbols defined in the main executable, rather than linking in another copy of LLVM libraries and globals.

LLVM and Clang were developed on Linux and Mac, where this is a common technique. On Windows, it is much harder to do this, although it is possible. Instead, it is much more common to move most of the application logic into a DLL and link plugins against that.

I think you can load passes into opt if you build LLVM as a DLL (cmake -DLLVM_BUILD_LLVM_DYLIB=ON), and link your pass against LLVM.dll. I’ve never attempted this personally, but it should work. :slight_smile: