LLVM小记2

LLVM低级虚拟机

传统的编译器架构:

 

 

 

Forntend前端:词法分析、语法分析、语义分析、生成中间代码

Optimizer优化器:中间代码生成

Backend后端:生成机器码

 

LLVM

架构:不同的前端后端使用统一的中间代码LLVM Intermediate Representation (LLVM IR)如果需要支持一种新的编程语言,那么只需要实现一个新的前端;如果需要支持一种新的硬件设备,只需要实现一个新的后端;优化阶段是一个通用的阶段,它针对的是统一的LLVM IR,不论是支持新的编程语言还是支持新的硬件设备,都不需要对优化阶段做修改。

处理过程

预处理->词法分析->Token -> 语法分析 -> AST -> 中间代码生成 -> LLVM IR -> 优化 -> 生成汇编代码 -> Link -> 目标文件

1、编译前端(clang)处理:

预处理:替进行头文件引入,宏替换,注释处理,条件编译(#ifdef)等操作

词法分析(lexical anaysis):词法分析器读入源文件的字符流,将他们组织称有意义的词素(lexeme)序列,对于每个词素,此法分析器产生词法单元(token)作为输出。

语法分析(semantic analysis):词法分析产生的词法单元Token流会被解析成一颗抽象语法树(abstract syntax tree AST);有了抽象语法树,Clang就可以对这个树进行分析,找出代码中的错误。比如类型不匹配,亦或Objective-C中向target发送了一个未实现的消息。

CodeGen(中间代码生成):遍历语法树,生成LLVM IR(中间)代码。LLVM IR是编译前端的输出,编译后端的输入。

2IR处理

LLVM会对生成的IR进行优化,优化会调用相应的Pass进行处理;

Pass由多个节点组成,都是 Pass 类的子类,每个节点负责做特定的优化;

补充:Pass相关可以见Writing an LLVM Pass开发和调试第一个 LLVM Pass

3、编译后端处理

生成汇编代码:LLVMIR进行优化后,会针对不同CPU架构生成不同的目标代码,最后以汇编代码的格式输出;

汇编:汇编器以汇编代码作为输入,将汇编代码转换为机器代码,最后输出目标文件(Object File)

链接:链接动态库,o文件,生成一个Mach-O格式的可执行文件,

 

 

 

 

posted on 2020-07-17 15:50  无人知晓LLH  阅读(221)  评论(0编辑  收藏  举报

导航