(三)Clang/ LLVM编译流程简述 |
您所在的位置:网站首页 › llvm编译原理 › (三)Clang/ LLVM编译流程简述 |
LLVM概述 LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time) 以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。传统编译器设计 编译器前端(Frontend) 编译器前端的任务是解析源代码。它会进行:词法分析,语法分析,语义分析, 检查源代码是否存在错误,然后构建抽象语法树(Abstract Syntax Tree,AST) ,LLVM的前端还会生成中间代码(intermediate representation , IR)。优化器(Optimizer) 优化器负责进行各种优化。改善代码的运行时间,例如消除冗余计算等。后端(Backend) /代码生成器(CodeGenerator) 将代码映射到目标指令集。生成机器语言,并且进行机器相关的代码优化iOS的编译器架构 LLVM的设计 Clang Clang是LLVM项目中的一个子项目。它是基于LLVM架构的轻量级编译器,诞生之初是为了替代GCC,提供更快的编译速度。它是负责编译C、C++、Objecte-C语言的编译器,它属于整个LLVM架构中的,编译器前端。编译流程 首先简单写一个demo如下: #import //#define C 30 //typedef int TD_INT_64; int test(int a,int b){ return a + b + 3; } int main(int argc, const char * argv[]) { int a = test(1, 2); printf("%d",a); return 0; } 复制代码通过命令打印查看源码的编译阶段 命令:clang -ccc-print-phases main.m预处理阶段 命令:clang -E main.m编译阶段 词法分析 预处理完成后就会进行词法分析.这里会把代码切成一个个Token,比如大小括 号,等于号还有字符串等 命令: clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m语法分析 词法分析完成之后就是语法分析,它的任务是验证语法是否正确。在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等,然后将所有节点组成抽象语法树(Abstract Syntax Tree, AST)。语法分析程序判断源程序在结构上是否正确。 命令: clang -fmodules -fsyntax-only -Xclang -ast-dump main.m生成中间代码IR 完成以上步骤后就开始生成中间代码IR了,代码生成器(Code Generation)会将语法树自顶向下遍历逐步翻译成LLVM IR。通过下面命令可以生成.11的文本文件,查看IR代码。 命令:clang -S -fobjc-arc -emit-llvm main.mObjective C代码在这一步会进行runtime的桥接:property合成,ARC处理等IR的基本语法: @ 全局标识% 局部标识alloca 开辟空间align 内存对齐i32 32个bit, 4个字节store 写入内存load 读取数据call 调用函数ret 返回bitCode xcode7以后开启bitcode苹果会做进一步的优化。生成.be的中间代码。 我们通过优化后的IR代码生成.be代码 命令:clang -emit-llvm -c main.ll -o main.bc生成汇编代码 最终通过.be或者.ll代码生成汇编代码命令:clang -S -fobjc-arc main.bc -o main.sclang -S -fobjc-arc main.ll -o main.s生成目标文件(汇编器) 目标文件的生成,是汇编器以汇编代码作为输入,将汇编代码转换为机器代码, 最后输出目标文件(object file) 命令: clang -fmodules -c main.s -o main.o生成可执行文件(链接) 连接器把编译产生的.o文件和(.dylib .a)文件,生成一个mach-o文件。 命令:clang main.o -o mainLLVM编译流程图 作者:Potato_土豆 链接:https://juejin.cn/post/6959865646125416484 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |