LLVM安装及使用踩坑

目录

安装

编译指令

后端pass

杂项


安装

本文记录安装源码版LLVM过程中遇到的一些困难。背景:曾经在笔记本上安装过apt版本(后卸载)和源码版本的llvm,并在编译pass时成功指定使用源码版本的include库。现在需要在实验室电脑再安装一份源码版本的。

起初我同第一次安装时一样,参考了Getting Started with LLVM Libraries(Getting Started with LLVM Core Libraries(中文版) — Getting Started with LLVM Core Libraries 文档)一书的第一章安装部分,成功安装了3.4版本,并且根据教程自定义了安装路径为/usr/local/llvm。但很快问题来了,由于我希望在编写自定义pass时,可以不在transform目录下写,而是放在我的个人目录,因而就会出现找不到LLVM库的问题(因为自定义了安装路径)。

我采用了和之前相同的办法,参考了这个项目https://github.com/sampsyo/llvm-pass-skeleton,它提供了一个自由路径下自定义pass的项目格式。然而我尝试了以后发现,cmake的find_package指令执行失败,它无法在所有的备选路径里找到LLVMConfig.cmake或llvm-config.cmake文件。

注意,find_package指令会默认先去CMAKE_MODULE_PATH中寻找名字为FindXX.cmake的文件,这个文件指明了要找哪些目录。如果没有这样的文件,他就会去找名字为XXConfig.cmake的文件,这个时候可以通过设定软件安装的目录(CMAKE_PREFIX_PATH)让cmake去里面寻找。

cmake查找顺序:

对于module模式:即不指定"CONFIG",不指定“NO_MODULE",也不使用"full signature"中的关键字

1. CMAKE_MODULE_PATH

2. /usr/local/share/cmake/Modules(cmake安装时的modules目录)

对于config模式:

1. <pkg_name>_DIR、<pkg_name>_ROOT

2. CMAKE_PREFIX_PATH等

这个时候我就纳闷了,之前笔记本上运行得好好的,为什么这次配置就不起作用呢?经过查资料我发现find_package在运行时会产生一些变量,用来记录找到的库的路径之类的,

于是我在CMakeLists文件中加了一句,打算看看之前的配置中到底find到了哪个位置的库 

这

结果不看不当紧,一看发现居然找到的库是在/usr/lib下的,,这显然是apt安装软件给分配的默认路径啊,如果是自定义路径的安装那所有东西都是位于/usr/local/llvm的,这里科普下似乎linux中用户自己安装的软件都约定俗成地装在/usr/local目录,而apt等包管理软件会把软件的各个部分分散在各个目录中,这就导致了卸载时必须同样使用这个包管理软件才能卸载干净,而自己指定目录的话,卸载时只需要把这个目录整体rm -rf掉就行了。 

言归正传继续解决问题,一开始我认为是cmake的搜索路径没有包含llvm的安装路径,所以才找到了之前遗留的apt版本的文件,于是我使用了

export CMAKE_PREFIX_PATH = /usr/local/llvm/bin

来补充(CMAKE_PREFIX_PATH在cmake的备选目录中具有最高优先级),结果仍然不成功。于是我直接打开文件管理器进入安装路径搜索这个XXConfig.cmake文件,居然没有,经过查阅资料我发现该文件应该位于llvm/lib/cmake目录,而我压根没有这个目录!llvm/lib里面只有一个clang。这时我已经濒临崩溃,求助学长之后被告知3.4版本过于古老,最好装新版,于是我抱着试试看的心态准备装新版。

首先在llvm官网下载llvm、clang、clang-extra这三个源码包(和书上讲的源码结构依然相同,不过现在最新版已经是13.0了)。接下来解压后将clang放入llvm/tools/里,clang-extra放入llvm/tools/clang/tools/里,然后在llvm下新建build目录并进入,执行/../configure发现报错,

新版居然已经不支持configure了,只能查找别的安装方法。在这篇文章里查到了

cmake -G "Unix Makefiles" -DLLVM_TARGETS_TO_BUILD=X86 -DCMAKE_BUILD_TYPE="Release"  -DCMAKE_INSTALL_PREFIX="/usr/local/llvm" ..

这句指令,有效!(同时Building LLVM with CMake — LLVM 13 documentation中也有讲解)。然后执行make && make install 就可以了,这次成功安装。

其实现在安装的话直接按照官方github教程也可以,请参考https://github.com/llvm/llvm-projectBuilding LLVM with CMake — LLVM 13 documentation

再提一下,对于新版llvm来说,使用opt调用pass时要在opt后面紧跟着加上-enable-new-pm=0选项,整体命令变为了

opt -enable-new-pm=0 -load ../../pass1/build/src/libHello.so -hello < test1.bc > /dev/null

编译指令

.c -> .ll:clang -emit-llvm -S a.c -o a.ll

.c -> .bc: clang -emit-llvm -c a.c -o a.bc

.ll -> .bc: llvm-as a.ll -o a.bc

.bc -> .ll: llvm-dis a.bc -o a.ll

.bc -> .s: llc a.bc -o a.s

后端pass

当我安装书上教程为Sparc编写了新的pass后,却发现使用llc时无法指定target为sparc

经提示意识到可能是最初编译整个llvm的时候,就没编译sparc模块。通过执行bin/llc --version命令,得到了

 果然并没有带上sparc。再回过头看之前执行的cmake命令,有一条

-DLLVM_TARGETS_TO_BUILD=X86,这个就是指定了目标机器对象,其实完全不用加参数,默认参数是 LLVM_ALL_TARGETS,包含了代码中包含的所有targets。于是再次执行cmake命令带上sparc,再次make llc,这时终于能够正常执行这一句了

bin/llc -march=sparc ~/coding/practice/test/test1.bc

这里注意一点,make中可能会报错未识别自己写的那个pass的cpp文件

 由于书上的步骤漏掉了更新输出信息中的这个CMakeLists文件,所以导致了错误。去往这个文件中在添加了一堆cpp文件的地方把自己写的这个文件也加进去就好了

杂项

llvm自带pass大多位于lib/Analysis和lib/Transforms目录下 

  • 33
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Absoler

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值