hunterzju/llvm-tutorial
cs.cmu.edu/academic/class/15745-s14/public/lectures
编译llvm
cd /d d:\llvm-home\
git clone git@gitcode.net:pubz/llvm-project.git
cd /d d:\llvm-home\llvm-project\
git status
#HEAD detached at llvmorg-11.0.0
set PATH=%PATH%;D:\Python38\Scripts\;D:\Python38\;D:\cmake-3.25.0-windows-x86_64\bin;D:\MicrosoftVisualStudio2019Enterprise\VC\Tools\MSVC\14.28.29910\bin\Hostx64\x86;D:\MicrosoftVisualStudio2019Enterprise\MSBuild\Current\Bin
#cmake -S llvm -B build -G "Visual Studio 16 2019" -DLLVM_ENABLE_PROJECTS=mlir,polly -DLLVM_BUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Debug -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_ENABLE_PROJECTS="clang;llvm" -DCMAKE_CXX_FLAGS="/bigobj" -DLLVM_TARGETS_TO_BUILD=X86 #废弃
cmake -S llvm -B build -G "Visual Studio 16 2019" -DLLVM_BUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CONFIGURATION_TYPES=Debug -DLLVM_ENABLE_ASSERTIONS=ON -DCMAKE_CXX_LINK_FLAGS="/LIBPATH:.\\debug\\lib /LIB:.\\debug\\lib " -DLLVM_ENABLE_PROJECTS="clang;llvm;mlir;polly" -DCMAKE_CXX_FLAGS="/bigobj" -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_INCLUDE_TESTS=False -DLLVM_BUILD_TESTS=OFF
cd build
msbuild LLVM.sln
"""
mlir
llvm build
编译完后找mlir例子
cd build
find . -path *mlir*example*
编译成功的样子:
llvm自带例子
d:\llvm-home\llvm-project\mlir\examples\toy
报错解决
1. LINK : fatal error LNK1104: 无法打开文件“gtest_main.lib”
解决办法: 改成全路径
<AdditionalDependencies>..\..\..\..\Debug\lib\LLVMSupport.lib;..\..\..\..\Debug\lib\LLVMSupport.lib;..\..\..\..\Debug\lib\gtest_main.lib;..\..\..\..\Debug\lib\gtest.lib;</AdditionalDependencies>
<AdditionalDependencies>..\..\..\..\Debug\lib\LLVMSupport.lib;..\..\..\..\Debug\lib\LLVMSupport.lib;gtest_main.lib;gtest.lib;</AdditionalDependencies>
#bash
cd build
#find . -name "*.vcxproj" | xargs -I@ grep -Hn ";gtest_main.lib" @
#找到有这种相对路径的, 用py脚本处理这些文件
find . -name "*.vcxproj" | xargs -I@ cp -v @ @.original #备份
#/c/Windows/System32/chcp.com 936
find -path *unittests*.vcxproj -a -type f | xargs -I@ sh -c "cp -v @.original @; python /d/llvm-home/llvm-project/compile-fix/replace_vcxproj.py @" # 处理(可多次执行本行)
# -*- coding: UTF-8 -*-
#pip install lxml
#d:/llvm-home/llvm-project/compile-fix/replace_vcxproj.py
libDir:str="D:\\llvm-home\\llvm-project\\build\\Debug\\lib"
def replace_vcxproj(fileFullPath: str):
_text=None
text:str=None
with open(fileFullPath, encoding='utf-8') as f:
text = f.read()
if not ( text.__contains__(";gtest_main.lib") or text.__contains__(";gtest.lib") ):
print("无需处理, 因为不含 ';gtest_main.lib' 和 ';gtest.lib'")
return
# 替换
_text = text.replace(";gtest_main.lib", f";{libDir}\\gtest_main.lib") .replace(";gtest.lib", f";{libDir}\\gtest.lib")
# 写入结果
with open(fileFullPath, "w", encoding='utf-8') as of:
of.write(_text)
print(f'处理{fileFullPath}')
if __name__=='__main__':
import sys
assert len(sys.argv) >= 1
replace_vcxproj(sys.argv[1])
但是 家里的电脑 msbuild出的 .vcxproj 的AdditionalDependencies中 gtest*项都是全路径 无需修复
2. diff找不到
#https://gnuwin32.sourceforge.net/packages/diffutils.htm
cd /d/
wget https://nchc.dl.sourceforge.net/project/gnuwin32/diffutils/2.8.7-1/diffutils-2.8.7-1-bin.zip
wget https://nchc.dl.sourceforge.net/project/gnuwin32/diffutils/2.8.7-1/diffutils-2.8.7-1-dep.zip
unzip diffutils-2.8.7-1-bin.zip -d /d/diffutils-2.8.7-1-bin/
unzip diffutils-2.8.7-1-dep.zip -d /d/diffutils-2.8.7-1-bin/
tree -L 2 /d/diffutils-2.8.7-1-bin/
"""
/d/diffutils-2.8.7-1-bin/
├── bin
│ ├── cmp.exe
│ ├── diff.exe
│ ├── diff3.exe
│ ├── libiconv2.dll
│ ├── libintl3.dll
│ └── sdiff.exe
"""
删掉 polly-check-format.vcxproj 中 “…ScopDetection.h | diff …” 的diff部分,具体如下:
继续编译 可正常编译
set path=%path%;D:\diffutils-2.8.7-1-bin\bin\
cd d:\llvm-home\llvm-project\build\
msbuild LLVM.sln
3. llvm\unittests\Support\JSONTest.cpp报错
JSONTest.cpp 中的不可见符号都去掉
file: D:\llvm-home\llvm-project\llvm\unittests\Support\JSONTest.cpp
// Direct tests of isUTF8 and fixUTF8. Internal uses are also tested elsewhere.
//...
for (auto Invalid : std::vector<std::pair<const char *, const char *>>{
{"lone trailing \x81\x82 bytes", "lone trailing a bytes"},
{"missing trailing \xD0 bytes", "missing trailing a bytes"},
{"truncated character \xD0", "truncated character a"},
{"not \xC1\x80 the \xE0\x9f\xBF shortest \xF0\x83\x83\x83 encoding",
"not a the a shortest a encoding"},
{"too \xF9\x80\x80\x80\x80 long", "too a long"},
{"surrogate \xED\xA0\x80 invalid \xF4\x90\x80\x80",
"surrogate a invalid a"}}) {
EXPECT_FALSE(isUTF8(Invalid.first)) << Invalid.first;
EXPECT_EQ(fixUTF8(Invalid.first), Invalid.second);
}
}
//...
差异见下图:
其他问题解决
llvm-project目录 跨盘符
家里电脑和公司电脑 llvm-home所在盘符不一致解决: mklink 符号链接
#家里电脑目录为e:\llvm-home\ ;公司电脑目录为d:\llvm-home\, 文档中用的目录也是d:\llvm-home\
#所以在家里电脑 用 符号链接 d:\llvm-home 指向 e:\llvm-home
#创建符号链接:
mklink /j d:\llvm-home e:\llvm-home
mklink /j d:\instrmcpp e:\instrmcpp
#以下这种貌似也行:
mklink /D d:\instrmcpp e:\instrmcpp
#查看符号链接:
dir /AL d:\
#2022/12/03 08:46 <JUNCTION> llvm-home [e:\llvm-home]
#2022/12/06 22:46 <SYMLINKD> instrmjcpp [e:\instrmcpp]
mklink /?
"""创建符号链接。
MKLINK [[/D] | [/H] | [/J]] Link Target
/D 创建目录符号链接。默认为文件 符号链接。
/H 创建硬链接而非符号链接。
/J 创建目录联接。
Link 指定新的符号链接名称。
Target 指定新链接引用的路径 (相对或绝对)。"""
搜索
.lib 中搜索指定函数名
.lib 其实是 ar 类型的压缩包, 可以用 7z之类的解压软件打开
#基于: msys2
#7z解压.lib例子
export PATH=$PATH:/d/7-Zip/
7z x build/tools/mlir/lib/Dialect/Affine/Utils/obj.MLIRAffineUtils.dir/Debug/obj.MLIRAffineUtils.lib -o/e/tmp/ -y -x'!obj.*.dir'
#基于: msys2
#把以下内容保存为文件 /d/search_func_in_lib_dir.sh
find . -name "*.lib" -a -type f | xargs -I@ sh -c "rm -fr /e/tmp/*; 7z x @ -o/e/tmp/ -y -x'r!obj.*.dir' >/dev/null ; echo @; grep -Hn getMutableSuccessorOperands @"
#然后执行
sh /d/search_func_in_lib_dir.sh
#注意不要用 bash 否则会报错