Hi,
Clang 12 can be configured on Windows with MinGW (either GNU or LLVM) with the following CMake parameters:
- LLVM_BUILD_LLVM_DYLIB=ON
- LLVM_LINK_LLVM_DYLIB=ON
- CLANG_LINK_CLANG_DYLIB=ON
which has some effect on the binary size of the build.
I configured the llvm-project with the following parameters:
- CMAKE_BUILD_TYPE=Release
- LLVM_TARGETS_TO_BUILD=X86
- LLVM_ENABLE_PROJECTS=clang;clang-tools-extra
The installed (stripped) build of Clang 12 with llvm-mingw release 12.0.0 resulted in:
-
Normal build: 1,76 GB
-
shlib build: 481 MB
Due to the nature of MSVC regarding default visibility of symbols (hidden by default, whereas MinGW has visible by default), one needs to generate a .def file with the symbols needed to be exported.
This is done already in two cases for LLVM_BUILD_LLVM_C_DYLIB (llvm/tools/llvm-shlib/gen-msvc-exports.py) and for LLVM_EXPORT_SYMBOLS_FOR_PLUGINS (llvm/utils/extract_symbols.py).
I’ve put together a patch that enables LLVM_DYLIB and CLANG_DYLIB for MSVC.
I tested with clang-cl from the official Clang 12 x64 Windows binary release:
- Normal build: 1,42 GB
- shlib build: 536 MB
The shlib release build compiled and linked fine with LLVM.dll and clang-cpp.dll, unfortunately it crashes at runtime. For example llvm-nm:
$ llvm-nm
PLEASE submit a bug report to and include the crash backtrace. Stack dump: 0. Program arguments: llvm-nm #0 0x00007ffd32807d43 llvm::StringMap<llvm::Option *,llvm::MallocAllocator>::begin C:\Projects\llvm-project\repo\llvm\include\llvm\ADT\StringMap.h:204:0 #1 0x00007ffd32807d43 llvm:
:HideUnrelatedOptions(class llvm:
:OptionCategory &, class llvm:
:SubCommand &) C:\Projects\llvm-project\repo\llvm\lib\Support\CommandLine.cpp:2589:0 #2 0x00007ff689df2b13 llvm::StringRef::StringRef C:\Projects\llvm-project\repo\llvm\include\llvm\ADT\StringRef.h:107:0 #3 0x00007ff689df2b13 main C:\Projects\llvm-project\repo\llvm\tools\llvm-nm\llvm-nm.cpp:2232:0 #4 0x00007ff689e26d04 invoke_main D:\agent_work\10\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:78:0 #5 0x00007ff689e26d04 __scrt_common_main_seh D:\agent_work\10\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288:0 #6 0x00007ffd9a7f7034 (C:\Windows\System32\KERNEL32.DLL+0x17034) #7 0x00007ffd9b742651 (C:\Windows\SYSTEM32\ntdll.dll+0x52651)
This crash is due to llvm::HideUnrelatedOptions which accesses TopLevelSubCommand, which is defined as:
extern ManagedStatic TopLevelSubCommand;
The MSVC 2019 build behaves in the same way as the clang-cl build.
I have tried building without LLVM_ENABLE_THREADS, or by linking to the CRT statically LLVM_USE_CRT_RELEASE=MT, didn’t help.
The MSVC 2019 build sizes were:
- Normal build: 1,74 GB
- shlib build: 949 MB
I would appreciate any help in getting the shlib build running. It works fine with llvm-mingw, I think it should also work with clang-cl / cl.
Cheers,
Cristian.