LLVM连同组件一起编译

对LLVM有初步了解的话,会发现LLVM可以被描述为编译器的“中后端”。也就是说,LLVM本身不是一个完整的编译器,需要与编译器前端等组件配合使用才能完成完整的编译过程。作为可选组件形式与LLVM一同发布的配件就有配置的讲究了。 根据CMakeList文件对组件的配置,加上网上其他人对于编译过程的总结,对组件及其位置罗列如下:

文件名 对应组件 对应位置
llvm-.src.tar.gz LLVM本体 ./
cfe-.src.tar.gz Clang ./tools/clang
compiler-rt-.src.tar.gz Compiler-RT ./projects/compiler-rt
libcxx-.src.tar.gz libcxx ./projects/libcxx
libcxxabi-.src.tar.gz libcxxabi ./projects/libcxxabi
libunwind-.src.tar.gz libunwind ./projects/libunwind
lld-.src.tar.gz LLVM连接器 ./tools/lld
lldb-.src.tar.gz LLVM调试器 ./tools/lldb
openmp-.src.tar.gz OpenMP支持 ./projects/openmp
polly-.src.tar.gz (暂时不懂) ./tools/polly
clang-tools-extra-.src.tar.gz Clang附加工具 ./tools/clang/tools/extra
test-suite-.src.tar.gz 测试程序(相当大) ./projects/test-suite

编译时遇到错误:r7 cannot be used in asm here

https://tls.mbed.org/kb/development/arm-thumb-error-r7-cannot-be-used-in-asm-here

根据上述网站叙述,该问题在于gcc对于arm处理器中寄存器的使用方式与arm自身对编译过程的优化中产生了冲突。arm优化的函数在汇编中显式地使用了编号为r7的寄存器,而在不经优化的情况下,r7被gcc用作帧指针寄存器,不允许被显示地用作其他用途,从而报错。

在解决这个问题时,发现另一个问题:理论情况来说,发布的稳定版的软件源码在编译时会默认设置为发布版本Release,在该模式下,编译器将会对目标软件进行大幅优化以加快运行速度(比如常见的开启-O2-O3选项),删除不必要的调试信息从而缩小软件大小。而LLVM却将其默认设置为了调试版本Debug,在该模式下,将保留较多的源代码信息,能够在出错时较好地帮助开发人员进行调试,也会相比发布版本有着更加接近原代码的二进制逻辑过程,而这也正是上面在直接编译LLVM时遇到错误的原因。

因而解决方法十分清晰了:将CMake中决定编译版本的参数设置为Release即可。

cd /path/to/llvm/src
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release

然后再加上其他需要的参数配置完以后,使用make进行编译即可。

若是只想解决该问题并编译调试版本的话,在编译器参数中加上-fomit-frame-pointer选项即可。

标签: none

添加新评论