在Mac OS上Build、配置并使用LLVM

来源:互联网 发布:九次方大数据加班 编辑:程序博客网 时间:2024/05/21 11:17

一、引言

LLVM这个名字最初的意思是底层虚拟机(Low Level Virtual Machine)的缩写,它是由美国伊利诺伊大学开发的一个开源项目。现在LLVM的意义已经远远超越它最初的意思,所以现在LLVM就是整个项目的名称。

具体来说,LLVM是以C++编写而成的编译器(compiler)框架系统,或者说是一个模块化和可重复使用的编译器和工具技术的集合其核心库提供了与编译器相关的支持,可以作为多种语言编译器的后台来使用。利用LLVM,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。


如果上面的解释仍然令你感觉不得要领,那么简而言之——LLVM就是一套类似于GCC(及其相关工具)的编译工具。很多人会好奇二者的区别,或者孰优孰劣。相比而言,GCC历史悠久、树大根深,拥有庞大的用户群体。而LLVM是后起之秀,方兴未艾。既然是后来者,自然也就具有一定的后发优势,例如LLVM的编译速度很快(据说通常是GCC的三倍左右)、拥有独到的IR表示形式等等。


近些年来,LLVM发展很快,特别是它的主要贡献者Chris Lattner受雇于Apple专攻其编译器的开发之后,LLVM更是得到了Apple的大力支持。在新版的Xcode中,LLVM已经成为默认的后端编译器。2012年,LLVM荣获ACM软件系统奖,可见其价值已经得到学术界与产业界的广泛认可。


二、在Mac OS上Build你的LLVM

说到LLVM,你想必应该还听过另外一个产品Clang。如下图所示,Clang主要负责完成类似前端的一些工作,它通常作为标准LLVM发布版的一部分而被发布(Clang is released as part of regular LLVM releases)。特别地,在Mac OS系统下,From Xcode 4.2, Clang is the default compiler for Mac OS X。


所以,如果你已经安装了Xcode,其实你已经可以在命令行中使用Clang来编译程序了(用法上跟GCC差不多)。但是如果你要做一些更加深入的、更酷的事情,你还需要获得并安装完整的LLVM。


前面已经提过,LLVM是一套编译器和工具技术的集合,具体来说,此处所谓之常用的基本工具有如下这些:


所以在命令行中,其实并没有一个单独的命令叫LLVM(但是却有一个可以执行的程序或者命令叫gcc或者g++)。正如前面所说,在Mac OS系统下,如果你已经安装了Xcode(例如我电脑上的版本是9.0),那么在命令行中你是可以直接使用Clang命令的。但是,由于你并没有单独安装LLVM,所以你还无法使用上面列表中的命令,例如llc。


下面就来演示在Mac OS上安装LLVM的过程(其实是下载源代码后,自己Build)。首先,你要做一些检查工作,确保你的电脑上已经安装了稍后Build时会用到的工具,其实最主要的就是CMake,关于CMake的安装你可以参考【1】。


然后,创建一个名叫llvm的文件夹用来存放稍后你要下载的LLVM代码。如下图所示,使用命令它来完成,其中的最后的llvm就是你刚刚创建的文件夹的名字(当然如果你使用其他的文件夹,这里要注意替换):

  • svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm


接下来是对Clang做类似的事情。Clang的源文件需要被安装到llvm/tools/clang这个文件夹下面,注意检查一下路径是否正确。

  • cd llvm/tools
  • svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
  • cd ../..
接下来是Check out附加的Clang工具(extra Clang tools),这一步是可选的,我们也follow着做一下。使用命令:

  • cd llvm/tools/clang/tools
  • svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
  • cd ../../../..

如下图所示:


接下来还有几个可选的安装内容我们忽略掉它们,如果你需要安装它们,可以参考【2】中的5~6步。接下来就是Build LLVM和Clang。注意,你要在llvm文件夹下面新建一个名为build的文件夹,然后在build路径下使用命令:

  • cmake -G "Unix Makefiles" ../llvm
如下图所示:


上一步完成后,在使用make命令来builds both LLVM and Clang for debug mode,如下图所示:


整个过程大约需要1个小时左右,到出现下面这个界面,即100%时,所有的Build工作就都完成了!


三、配置环境变量

要想使用之前的表中罗列处理的各种LLVM工具,还需要配置一下环境变量。在Mac OS中一种临时调整环境变量的方法如下图所示:


从上图中可以获知,如此配置好环境变量之后,就已经可以使用llc了。但是这只是一种“临时”的方法,一旦重新开启一个命令行窗口后,环境变量还会消失。


Mac OS中配置环境变量的方法有很多,下面使用其中一种,即修改bash_profile文件的方式。具体操作是在命令行窗口下输入命令:sudo vi ~/.bash_profile,系统会提示你输入管理员密码。然后在vim中编辑文件bash_profile,在其中加入一句:export PATH="你的llvm中的bin路径:$PATH",如下图所示:


保存之后退出。再使用一下source命令使其生效,如下图所示:



四、试用一下LLVM

最后来试用一下LLVM,首先在桌面上(或者其他你希望的路径下)创建一个helloworld程序,如下图所示:


你可以用clang命令来编译它,这一点跟gcc的用法类似。下面来做一点不一样的实验。如下图所示,第一句命令的意思是生成 .ll文件,接下来,第二句再以此为基础生成 .s文件。


你可以观察一下这两个文件的内容。不过理解它们并不是本文所要探讨的。如果有机会,我会在日后的博文里分享更多基于LLVM的黑科技。


参考文献

【1】 http://blog.csdn.net/baimafujinji/article/details/78588488

【2】 http://clang.llvm.org/get_started.html

【3】https://www.cs.cornell.edu/~asampson/blog/llvm.html

原创粉丝点击