LLVM简述

编译器:
CGG
LLVM
Clang

编译原理:
Source Code -> Frontend -> Optimizer -> backend - >machineCode

Frontend:前端
词法分析,语法分析,生成中间代码

Optimizer:优化器
中间代码

Backend:后端
生成机器码

OC源文件编译过程
命令行查看编译的过程:
clang -ccc-print-phases main.m
0: input, “main.m”, objective-c
1: preprocessor, {0}, objective-c-cpp-output
2: compiler, {1}, ir
3: backend, {2}, assembler
4: assembler, {3}, object
5: linker, {4}, image
6: bind-arch, “x86_64”, {5}, image
查看preprocessor(预处理)的结果:
clang -E main.m
词法分析,生成Token:
clang -fmodules -E -Xclang -dump-tokens main.m
语法分析,生成语法树(AST, Abstract Syntax Tree):
clang -fmodules -fsyntax-only-Xclang -ast-dump main.m

LLVM IR(中间代码)
LLVM IR有3种表示形式(但本质等价的,就好比水可以有气体,液体,固体3种形态)
text:便于阅读的文本格式,类似于汇编语言,扩展名.ll
clang -S -emit-llvm main.m
生成了main.ll文件就是中间代码生成的文件
memory:内存格式
bitcode:二进制格式,扩展名.bc
clang -c -emit-llvm main.m

IR的基本语法
注释以分号开头
全局标识符以@开头,局部表示符以%号开头
alloca,在当前函数栈帧中分配内存
i32,32bit,4个字节的意思
align,内存对齐
store:写入数据
load,读取数据

官方语法参考
https://llvm.org/docs/LangRef.html

源码下载
下载LLVM
git clone https://git.llvm.org/git/llvm.git/
大小 648M
下载clang
cd llvm/tools
git clone https://git.llvm.org/git/clang.git/
大小240.6M

源码编译
安装cmake和ninja(先安装brew,https://brew.sh/)
b r e w i n s t a l l c m a k e brew install ninja
ninja如果安装失败,可以直接从github获取release版放入/usr/local/bin中
https://github.com/ninja-build/ninja/releases

在LLVM源码同级目录下新建一个llvm-build目录(最终会在llvm_build目录下生成build.ninja)
cd llvm_build
cmake -G Ninja ../llvm -DCMAKE_INSTALL_PREFIX =LLVM的安装路径
更多cmake相关选项,可以参考:https://llvm.org/docs/CMake.html
依次执行编译,安装指令
ninja
编译完毕后,llvm_build目录大概21.05G
ninja install
安装完毕后,安装目录大概11.92G

libclang.libTooling
官方参考:https:\clang.llvm.org/docs/Tooling.html
应用:语法树分析,语言转换

Clang插件开发
官方参考
https://clang.llvm.org/docs/ClangPlugins.html
https://clang.llvm.org/docs/ExternalClangExamples.html
https://clang.llvm.org/docs/RAVFrontendAction.html
应用:代码检查(命名规范,代码规范)等

Pass开发
官方参考:https://clang.llvm.org/docs/WritingAndLLVMPass.html
代码优化,代码混淆等

开发新的编程语言

C++有命名空间的概念
using namespace clang;
using namespace std;
using namespace llvm;
using namespace clang::ast_matchers;
// 编写代码 自己的命名空间
namespace MHFPlugin {
class MHFConsumer:public ASTConsumer{
};
//继承原来的动作
class MHFAction: public PluginASTAction{ unique_ptrCreateASTConsumer(CompilerInstance &ci,StringRef iFile){
return unique_ptr (new MHFConsumer);
}
bool ParseArgs(const CompilerInstance &ci,const vector &args){
return true;
}
};
}
// 因为这个是clang命名空间里面的东西,因为clang上面已经包含了,下面的clang可以删掉
// 注册插件
static clang::FrontendPluginRegistry::Add
X(“MHFPlugin”,”The MHFPlugin is my first clang-pugin.”);
编写插件源码
这里写图片描述

学习心得
英语好是很大的优势
知识储备(js,java,c++,Python)
学习兴趣+上进心(投资自己是最好的投资随着时间的积累,可以增值的行业),不要天天玩游戏

猜你喜欢

转载自blog.csdn.net/u012581760/article/details/81606548