LLVM编译流程和Clang插件开发

代码 代码 1460 人阅读 | 0 人回复

<
一.LLVM概述

LLVM是架构编译器(compiler)的框架体系,以C++编写而成,用于劣化随便法式言语编写的法式的编译工夫(compile-time),链接工夫(link-time), 运转工夫(run-time), 和闲暇工夫(idle-time),对开拓者连结开放,并兼容已有剧本。
1.传统编译器设想



  • 编译器前端(Frontend)
    编译器前真个使命是剖析源代码。它会停止:词法阐发,语法阐发,语义阐发,检查源代码能否存正在毛病,然后构建笼统语法树(AST),LLVM的前端借会天生中心代码(IR)
  • 劣化器
    劣化器卖力停止各类劣化,改进代码的运转工夫,比方消弭冗余计较等
  • 后端/代码天生器
    将代码映照到目的指令散,天生机械言语,而且停止机械相关的代码劣化
2.iOS的编译器架构

Objective C/C/C++利用的编译器前端是Clang,Swift是Swift,后端皆是LLVM
150242vnmmp3xu0p090f1b.jpg

3.LLVM的设想

当编译器决议撑持多种源言语大概多种硬件架构时,LLVM最核心的处所便正在于此,LLVM利用的是通用的代码暗示情势IR,它是用去正在编译器中暗示代码的情势,以是LLVM能够为任何编程言语编写前端,也能够为随便硬件架构自力编写后端
150242e5o3jjv7kamzljwa.jpg

两.Clang编译流程

创立一个新工程,正在main.m中增加代码
  1. int main(int argc, const char * argv[]) {
  2.     return 0;
  3. }
复造代码
经由过程指令clang -ccc-print-phases main.m,检察编译流程:
150243bxyzggd75ydxy7dx.jpg

总结流程大致为:


  • 1.输进文件:找到源文件
  • 2.预处置阶段:那个历程处置包罗宏的改换,头文件的导进
  • 3.编译阶段:停止词法阐发、语法阐发、检测语法能否准确,终极天生IR
  • 4.后端:那里LLVM会经由过程一个一个的Pass(节面)来劣化,每一个Pass做一些工作,终极天生汇编代码
  • 5.天生目的文件
  • 6.链接:链接需求的静态库战静态库,天生可施行文件
  • 7.经由过程差别的架构,天生对应的可止文件
固然呢,那些流程我也能够零丁拆分施行,来考证,那里我便附上末端指令
1.预处置

  1. clang -E main.m
复造代码
2.编译阶段

  1. clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m
复造代码
3.后端天生汇编代码

  1. //我们经由过程终极的.bc大概.ll代码天生汇编代码:
  2. clang -S -fobjc-arc main.bc -o main.s
  3. clang -S -fobjc-arc main.ll -o main.s
  4. clang -Os -S -fobjc-arc main.m -o main.s //天生汇编代码也能够停止劣化
复造代码
4.天生目的文件(汇编器)

  1. clang -fmodules -c main.s -o main.o
复造代码
那里的操纵实在有许多处所能够研讨,那里我便出有附上我操纵的历程,详情可参看文章LLVM编译流程
两.clang插件开拓

1.LLVM下载

  1. 因为海内的收集限定,我们需求借助镜像下载LLVM的源码。
  2. https://mirror.tuna.tsinghua.edu.cn/help/llvm/
  3. git        clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm/llvm.git
复造代码
2.正在LLVM的tools目次下下载Clang

  1. cd  llvm/tools
  2. git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm/clang.git
复造代码
留意:假如正在clone时报xcrun: error: active developer path…毛病,末端施行sudo xcode-select -switch/Applications/Xcode.app/Contents/Developer号令,然后再输进一次体系的暗码,完成。
3.正在LLVM的projects目次下下载compiler-rt,libcxx,libcxxabi

  1. cd        ../projects
  2. git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm/compiler-rt.git
  3. git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm/libcxx.git
  4. git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm/libcxxabi.git
复造代码
4.正在Clang的tools下装置extra东西

  1. cd ../tools/clang/tools
  2. git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm/clang-tools-extra.git
复造代码
5.装置cmake

  1. 编译最新的LLVM需求cmake去编纂,以是需求装置cmake,看本人能否需求装置
  2. brew        list   //检察
  3. brew        install        cmake //装置
复造代码
6.LLVM编译

  1. cmake编译成Xcode项目
  2. mkdir build_xcode
  3. cd build_xcode
  4. cmake -G Xcode ../llvm
复造代码

那个历程也有些冗长,倡议能够睡个觉,看个小电影啥的
免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则