<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <p>Hi,</p>
    <p>Clang 12 can be configured on Windows with MinGW (either GNU or
      LLVM) with the following CMake parameters:<br>
    </p>
    <ul>
      <li><font face="monospace">LLVM_BUILD_LLVM_DYLIB=ON</font></li>
      <li><font face="monospace">LLVM_LINK_LLVM_DYLIB=ON</font></li>
      <li><font face="monospace">CLANG_LINK_CLANG_DYLIB=ON</font></li>
    </ul>
    <p>which has some effect on the binary size of the build.</p>
    <p>I configured the llvm-project with the following parameters:</p>
    <ul>
      <li><font face="monospace">CMAKE_BUILD_TYPE=Release</font></li>
      <li><font face="monospace">LLVM_TARGETS_TO_BUILD=X86</font></li>
      <li><font face="monospace">LLVM_ENABLE_PROJECTS=clang;clang-tools-extra</font><br>
      </li>
    </ul>
    <p>The installed (stripped) build of Clang 12 with <a moz-do-not-send="true" href="https://github.com/mstorsjo/llvm-mingw/releases/tag/20210423">llvm-mingw
        release 12.0.0</a> resulted in:</p>
    <ul>
      <li>Normal build: 1,76 GB<br>
      </li>
      <li>shlib build: 481 MB</li>
    </ul>
    <p>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.</p>
    <p>This is done already in two cases for <font face="monospace">LLVM_BUILD_LLVM_C_DYLIB
      </font>(llvm/tools/llvm-shlib/gen-msvc-exports.py) and for <font face="monospace">LLVM_EXPORT_SYMBOLS_FOR_PLUGINS </font>(llvm/utils/extract_symbols.py).</p>
    <p>I've put together a <a moz-do-not-send="true" href="https://github.com/cristianadam/llvm-project/commit/3a3b8a7df17a49ba7c0153b0c9a7ee25705ede46">patch</a>
      that enables LLVM_DYLIB and CLANG_DYLIB for MSVC.</p>
    <p>I tested with clang-cl from the official Clang 12 x64 Windows
      binary release:</p>
    <ul>
      <li>Normal build: 1,42 GB</li>
      <li>shlib build: 536 MB</li>
    </ul>
    <p>The shlib release build compiled and linked fine with LLVM.dll
      and clang-cpp.dll, unfortunately it crashes at runtime. For
      example llvm-nm:</p>
    <p><font face="monospace">$ llvm-nm<br>
        PLEASE submit a bug report to <a class="moz-txt-link-freetext" href="https://bugs.llvm.org/">https://bugs.llvm.org/</a> and include
        the crash backtrace.<br>
        Stack dump:<br>
        0.      Program arguments: llvm-nm<br>
        #0 0x00007ffd32807d43 llvm::StringMap<llvm::cl::Option
        *,llvm::MallocAllocator>::begin
        C:\Projects\llvm-project\repo\llvm\include\llvm\ADT\StringMap.h:204:0<br>
        #1 0x00007ffd32807d43 llvm::cl::HideUnrelatedOptions(class
        llvm::cl::OptionCategory &, class llvm::cl::SubCommand
        &)
        C:\Projects\llvm-project\repo\llvm\lib\Support\CommandLine.cpp:2589:0<br>
        #2 0x00007ff689df2b13 llvm::StringRef::StringRef
        C:\Projects\llvm-project\repo\llvm\include\llvm\ADT\StringRef.h:107:0<br>
        #3 0x00007ff689df2b13 main
        C:\Projects\llvm-project\repo\llvm\tools\llvm-nm\llvm-nm.cpp:2232:0<br>
        #4 0x00007ff689e26d04 invoke_main
D:\agent\_work\10\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:78:0<br>
        #5 0x00007ff689e26d04 __scrt_common_main_seh
D:\agent\_work\10\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288:0<br>
        #6 0x00007ffd9a7f7034 (C:\Windows\System32\KERNEL32.DLL+0x17034)<br>
        #7 0x00007ffd9b742651 (C:\Windows\SYSTEM32\ntdll.dll+0x52651)</font><br>
    </p>
    <p>This crash is due to <font face="monospace">llvm::cl::HideUnrelatedOptions
      </font>which accesses<font face="monospace"> TopLevelSubCommand, </font>which
      is defined as<font face="monospace">:<br>
        extern ManagedStatic<SubCommand> TopLevelSubCommand;<br>
      </font></p>
    <p>The MSVC 2019 build behaves in the same way as the clang-cl
      build.</p>
    <p>I have tried building without <font face="monospace">LLVM_ENABLE_THREADS</font>,
      or by linking to the CRT statically <font face="monospace">LLVM_USE_CRT_RELEASE=MT</font>,
      didn't help.</p>
    <p>The MSVC 2019 build sizes were:</p>
    <ul>
      <li>Normal build: 1,74 GB</li>
      <li>shlib build: 949 MB</li>
    </ul>
    <p>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.<br>
      <br>
      Cheers,<br>
      Cristian.<br>
    </p>
  </body>
</html>