LLVM msvc DEBUG编译
LLVM msvc DEBUG编译
LLVM官方有各个操作系统,各个版本编译好的LLVM二进制文件;但是自己编译可以对LLVM选择性编译一些我们需要的,还可以编译出来可调试的LLVM二进制文件。如果需要编译Debug版本的HALIDE、TVM就需要我们自己编译了。
1. 安装Ninja
从这个地方https://github.com/ninja-build/ninja/releases下载一个你看着顺眼的版本就行,这个不太挑版本,这点比bazel强
2. 进入64位msvc 2019 命令行
在这个目录“C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat”下找到这个bat文件,双击运行一下,就会进入msvc2019 64位的编译环境了。这样ninja就可以找到cl 等可执行程序。
3. CMakeLists.txt 修改
编译debug llvm时有的obj文件过大,所以需要添加/bigobj这个编译器选项:
在<LLVM_ROOT>/llvm/这个文件夹下面,找到CMakeLists.txt这个文件。
以我的版本11.1为例,在第581行开始,修改为:
if(MSVC)
option(LLVM_BUILD_LLVM_C_DYLIB "Build LLVM-C.dll (Windows only)" ON)
# Set this variable to OFF here so it can't be set with a command-line
# argument.
set (LLVM_LINK_LLVM_DYLIB OFF)
if (BUILD_SHARED_LIBS)
message(FATAL_ERROR "BUILD_SHARED_LIBS options is not supported on Windows.")
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")
message(STATUS "add bigobj on msvc compiler")
如果是其他版本,只要找到if(MSVC)这一句话,在if里面添加:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")
这样来给visual studio编译器添加/bigobj选项。
4. CMake configure
cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=<debug_llvm_install_dir> -DLLVM_ENABLE_PROJECTS=clang;lld;clang-tools-extra -DLLVM_ENABLE_TERMINFO=OFF -DLLVM_TARGETS_TO_BUILD=X86;ARM;NVPTX;AArch64;Mips;Hexagon -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_ENABLE_EH=ON -DLLVM_ENABLE_RTTI=ON -DLLVM_BUILD_32_BITS=OFF -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON <LLVM_ROOT>/llvm
其中<debug_llvm_install_dir>是安装路径,在编译halide和tvm时方便找到LLVM。<LLVM_ROOT>是llvm源代码的根目录。上面的cmake选项设置了编译debug版本的llvm,使能的LLVM projects有: clang;lld;clang-tools-extra;目标平台有X86;ARM;NVPTX;AArch64;Mips;Hexagon;编译64位的版本。Cmake configure成功后,会有这样的输出:
其中的Using Debug VC++ CRT: MDd 说明我们编译的是debug版本的llvm,可用于编译debug版本的halide和tvm。编译debug版本的halide和tvm,有助于我们理解深度学习编译器工作的原理。
5. 编译安装
Cmake成功生成后,可以启动ninja来编译了;在msvc 2019 64bit的环境下输入:
cmake –build . –config Debug –target install -j 6
来启动编译,启动了6个线程,可根据各自的cpu性能改变-j 后面的数字。
6. 编译出错:
在编译的过程中,有一个特殊字符msvc的编译器无法识别,导致出错,我把那个字符改成了$,因为跟那个字符有关的是自动提示,代码分析的功能,halide以及TVM没有涉及,所以到目前为止还不受影响;
以Diagnostics.cpp为例,在第542行出现了一个特殊字符,我给改掉了,不知道大家有没有更好的解决办法。