LLVM代码研读(1)---- 安装篇

版权声明:本文为博主原创文章,水平有限,欢迎转载,但务必注明原始出处 https://blog.csdn.net/tomsoft/article/details/69257989

前序:LLVM的安装

前言:这里提供了最新版本v4.0.12017/3)的完整安装过程,对已经有经验的LLVM/Clang完全可以忽略这些内容。相关文件与目录的组织建议尽量参考我这里的定义。以保证之后使用上的一致

1          LLVM安装前准备:

1.1         系统的选择:

    • OSUbuntu Linux 16.04 LTS 64Bits(可以是实际Linux系统,我使用Windows10 64Bits + VMWare
    • 硬件:至少120G以上硬盘。因为我们这里是为了研究LLVM/Clang,在包含Debug信息下,Build完所有源码连同Linux系统大约使用硬盘空间85G;如果使用虚拟机建议更大的可用硬盘空间

1.2         安装前主要补丁:

sudo apt-get installbuild-essential zlib1g-dev python graphviz xdot cmake subversion

如果安装lldb,需要再安装(当前不建议安装):

sudo apt-get install swigpython2.7-dev libedit-dev libncurses5-dev

可选安装:(假定需要ARM交叉平台上使用,暂未安装)

      • sudo apt-get install g++-4.9g++-4.9 g++-4.9
      • sudo apt-get install g++-4.9-arm-linux-gnueabig++-4.9-arm-linux-gnueabi
      • sudo apt-get install g++-4.9-arm-linux-gnueabihf g++-4.9-arm-linux-gnueabihf

如果需要检查内存泄露,建议安装valgrind(建议安装)

sudo apt-get install valgrind

说明:

      • 为了看ast-view生成的树,graphvizxdot需要安装
      • LLVM 3.8起推荐使用cmake,因此,cmake需要安装

2          代码下载与安装:

2.1         建立LLVM目录

    • 建立llvm源码目录,假定:llvm_source
    • 建立llvm工作目录(build目录),假定:llvm_project
    • 建立llvm安装目录,假定:llvm_install

2.2         下载相关源码:

当前我们使用最新发布的Release4.0v4.0.1)版本。目前我使用的svn版本如下:

  • 下载llvm程序:

cd LLVM

svn co https://llvm.org/svn/llvm-project/llvm/branches/release_40 llvm_source

  • 安装clang

cd llvm_source/tools

svn co https://llvm.org/svn/llvm-project/cfe/branches/release_40 clang

  • 安装clang extratools

cd clang/tools

svn co https://llvm.org/svn/llvm-project/clang-tools-extra/branches/release_40 extra

  • 安装compiler-rt

cd $HOME/LLVM/llvm_source/projects

svn co https://llvm.org/svn/llvm-project/compiler-rt/branches/release_40 compiler-rt

  • 安装llvm testsuite

svn co https://llvm.org/svn/llvm-project/test-suite/branches/release_40 test-suite

 

其他可选安装

  • OpenMPlibcxxlibcxxabi的安装:

cd $HOME/LLVM/llvm_source/projects

svn co https://llvm.org/svn/llvm-project/openmp/branches/release_40 openmp

svn co https://llvm.org/svn/llvm-project/libcxx/branches/release_40 libcxx

svn co https://llvm.org/svn/llvm-project/libcxxabi/branches/release_40 libcxxabi

  • llvm link/debug文件安装(不建议安装)

cd $HOME/LLVM/llvm_source/tools

svn co https://llvm.org/svn/llvm-project/lld/branches/release_40 lld

如果需要安装lldb,执行:

svn co https://llvm.org/svn/llvm-project/lldb/branches/release_40 lldb

因为lld现在仍处于开发中。Lldb貌似并不很成熟,这两个工具暂不建议安装

  • 代码建立与安装:

使用cmake生成代码,进入llvm工作路径:cd $HOME/LLVM/llvm_project

    • Debug版本的LLVM/Clang

cmake ../llvm_source-DCMAKE_INSTALL_PREFIX=$HOME/LLVM/llvm_install

相关配置信息可以查看CMakeCache.txt

cmake--build . --target install    //注意有个.

说明:包含了Debug信息的LLVM会比较大,其相关库也会非常大,之后进行二次开发生成的代码也比较大。完成全部编译根据机器配置大约需要十几小时

    • Release版本的LLVM/Clang

cmake ../llvm_source -DCMAKE_INSTALL_PREFIX=$HOME/LLVM/llvm_install -DCMAKE_BUILD_TYPE=Release

cmake --build .--target install -- -j8

另外,你也可以指定-DLLVM_TARGETS_TO_BUILD="X86"参数,表明只生成X86版本。如下:

说明:在Release版本中,因为工作空间要求相对Debug版本少很多,因此,我将LLVM的工作目录llvm_project设置在内存文件系统中,这样可以少量减少编译的时间,如果内存较少,可以不必开启tmpfs。同时,针对多核处理器,Release版本我打开了多核加速

    • 关于cmake的所有设置请参考:http://www.llvm.org/docs/CMake.html

说明:如果安装到其他路径请务必指定共享库的安装位置(-DCMAKE_INSTALL_PREFIX=$HOME/LLVM/llvm_install).bashrc中增加如下代码

当前主要是为了研究LLVM/clang,因此,生成工具我们都先假定是Debug版本。

3          安装后检查:

我分别随意选择了llvmclangclang extra tools包中的三个文件来确认这三个最主要的应用程序包是否已经正常安装完毕。对于Projects中安装的Compiler-RTOpenMPllibcxx等库的检查需要通过具体代码来确认。这里选取的程序并没有什么特别意义,只要是分属三个程序包中即可。

3.1         Llvm版本检查:

如果是Release版本,大致输出如下(之后例子不加说明默认为Debug方式):

3.2         Clang版本检查:

3.3         Clang extra tools版本检查:

4          其他,关于安装Windows版本:

不建议在Windows环境下安装LLVM,之前在v3.8初次接触时曾经在Windows下安装过,但感觉意义不大,这里提供v3.8的安装方式,可以作为参考;其他系统的安装可以参考LLVM的文档。安装注意事项:

  • 尽量使用SVN抓取所有代码(或git)而不要使用现成压缩包。因为在Windows下解压缩clang存在错误(早先v3.8有这样问题,v4.0是否还存在,未曾试过)
    • 需要手工安装clangcompiler-RTextra(注意同样是由svn获得)
    • 我们假定所有下载完的源码在E:/llvm路径下
  • 需要安装cmake2.8.12.2)、python2.7)、GnuWin32几个工具;
  • 运行cmake,我们这里假定需要安装的路径是:F:/llvm-install;因为VS下当前并非我们主要目的,通常我们选择默认设置就可以了;选择Configure,选择Visual Studio 14 2015。存放安装文件磁盘至少预留40G以上的空间

如果没有错误,再选择Generate,运行完成大致如下:

  • 运行VisualStudio 2015,找目录F:/llvm-install

选择Build,因为是debug版本,编译时间要非常长,大约有24小时(与机器配置有关,我当前系统为老爷i3)

  • Build正确后注意设置环境变量:

如下:

5          常见Clang工具的使用:

本文档原本并不打算作为一个ClangLLVM的命令行使用手册,但因为在实际开发中会涉及一些LLVM/Clang的命令行与工具的使用,因此在这里仅仅简短的罗列出来,也可以用以检查之前的安装是否正确。但这部分绝非是一个命令行的完整说明文档,本文档主要用意是探寻LLVMClang更深层的原理,并非是针对简单的ClangLLVM终端用户;相关命令行的使用可以参考官方网站和其他资料

5.1         与编译相关的标准库:

    • opt:该工具的目标是针对IR阶段的程序进行优化,其输入文件必须是LLVMBit code,输出为相同格式的IR文件
    • llc:将LLVMIR文件转换成设备相关的汇编语言文件或Obj文件。您可以指定优化等级、Debug使能、是否针对目标平台优化。
    • llvm-mc:将汇编代码生成为指定格式的OBJ文件,如:ELF文件、MachO文件、PE文件等。也可反汇编相应的OBJ文件
    • lli:以解释方式或JIT运行LLVM IR文件
    • llvm-link:将几个LLVM Bitcode整合为单一一个LLVM Bitcode,注意却别于我们在编译时实用的通常的Link文件,如Linuxld
    • llvm-as:将LLVM中人工可识别IR文件(ll)转换为LLVM BitcodeBC)文件
    • llvm-dis:将LLVM BitcodeBC)转换成人可阅读的IR文件(LL

5.2         LLVM/Clang的基础库:

    • libLLVMCoreLLVM核心库,主要是:1LLVM IR指令构造、检查。2Pass管理
    • libLLVMAnalysis:包含了IR相关的几个分析Pass:如对其别名分析、相关性分析、常量折叠(Constant folding)、循环信息、内存依赖分析、指令化简等,详细见目录:lib\Analysis
    • libLLVMCodeGen:目标无关的代码生成、低级LLVM IR(机器相关)分析和转换,见相关目录:lib\CodeGen
    • libLLVMTarget:由通用目标及抽象提供对目标机的访问。这些通用的抽象提供了libLLVMCodeGen中通用的后端算法和目标相关逻辑间的通讯途径。详细目录:lib\Target,其中各目录包含了已经支持的各平台
    • libLLVMxxxxCodeGenxxxx表示具体支持的平台,如X86等):具体平台相关的代码生成、转换和分析Pass,其是相关平台的后端。
    • libLLVMSupportLLVM的支持库:错误处理、整形和浮点处理、命令行解析、调试、文件支持、字符串操作等;所在目录:lib\Support
    • libclangxxxx(各clang前端功能,如AST、词法分析、语法分析):提供了访问Clang前端各功能的接口。可以用于任何语言中,如Python

《待续。。。》

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页