内存不足
的问题又出现了。然后搜了一下原因,发现自己build的是Debug版本。是因为没有细看文档,默认是build Debug版本的。最后顺利build了一个Release版本,但可能RelWithDebInfo才是最适合的,短时间内估计用不上debug info,就先不考虑这个问题了。
% cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=type SRC_ROOT
type:
- Debug:默认选项,没有优化,有debug info和asserts;
- Release:有优化,没有debug info。默认优化强度是 -O3,可以通过选项CMAKE_CXX_FLAGS_RELEASE更改;
- RelWithDebInfo:有优化,有debug info。默认优化强度时-O2,可以通过选项CMAKE_CXX_FLAGS_RELWITHDEBINFO更改。
编译完成之后
% make install #安装头文件,库,工具,文档等到CMAKE_INSTALL_PREFIX路径下,默认是/usr/local
% make docs-llvm-html # 指定-DLLVM_ENABLE_SPHINX=On时会在OBJ_ROOT/docs/html下生成HTML格式的文档
Build Clang
% cmake -DLLVM_ENABLE_PROJECTS=clang -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release ../llvm
% make clang
终于开始实操了
教程: My First Language Frontend with LLVM Tutorial
这里还有个中文翻译版
Chapter 2
cd llvm-project/llvm/examples/Kaleidoscope/Chapter2/
clang++ -g -O3 toy.cpp `llvm-config --cxxflags`
这条会报编译错误,其实这个parser里面没有用到llvm的库,所以把toy.cpp的llvm include删掉了,编译可以通过。
/tmp/toy-eac448.o:(.data+0x0): undefined reference to `llvm::DisableABIBreakingChecks'
clang-12: error: linker command failed with exit code 1 (use -v to see invocation)
特别要注意每一章的编译选项 llvm-config
Chapter 3
于是我还发现了之前看LLVM CookBook里未解决的问题,就是Module::dump没有了,现在已经都变成print了。
TheModule->print(errs(), nullptr);
Chapter4
Constant folding => IR Builder
LLVM Optimization Passes:
今天学到JIT,还不是很理解。