iOS开发进阶

iOS开发进阶:LLVM及Clang插件初探

2021-12-24  本文已影响0人  __Null

一、LLVM概述

LLVM是架构编译器(Compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-timne)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。
目前LLVM已经被苹果iOS开发工具、Xilinx Vivado、Facebook、Google等各大公司采用。

传统编译器设计包括编译器前端、优化器、后端:

iOS的编译器架构

LLVM的设计

LLVM使用通用的代码表示形式(IR),他是用来在编译器中表示代码的形式,所以LLVM可以位任意编程语言独立编写前端,摒弃可以位任意硬件架构独立编写后端。

Clang

Clang时LLVM项目中的一个子项目。他是基于LLVM架构的轻量级编译器,负责C、C++、Objective语言的编译,属于LLVM架构中的编译器前端。

二、编译流程

案例代码包括一个math-add.h文件,内部定义一个add函数。另一个是explorer.m文件,内部引入math-add.h,定义一个宏,然后func中做测试。

//math-add.h
int add(int x, int y){
    return x + y;
}
//explorer.m
#include "math-add.h"
#define KCapacity 200
int func(void){
    int a = KCapacity;
    int b = 256;
    int c = add(a, b);
    return c;
}

打印编译阶段

clang -ccc-print-phases main.m

打印结果

//0:输入文件:找到源文件
0: input, "main.m", objective-c 
//1:预处理阶段:处理宏的替换、头文件的导入等
1: preprocessor, {0}, objective-c-cpp-output
//2:编译阶段:进行此法分析、语法分析、检查语法是否正确,生成IR
2: compiler, {1}, ir
//3:后端:LLVM会通过一个一个的Pass去优化,每个Pass做一些事情,最终生成汇编代码
3: backend, {2}, assembler
//4:生成目标文件
4: assembler, {3}, object
//5:链接:链接需要的动态库和静态哭,生成客执行文件。
5: linker, {4}, image
//6:通过不同的架构生成对应的可执行文件
6: bind-arch, "x86_64", {5}, image
1.预处理阶段
2.编译阶段
3.生成汇编代码
4.生成目标文件(汇编器生成.o文件)

目标文件的生成,是汇编器以汇编代码作为输入、将汇编代码转换为机器代码,最后输出目标文件object file。命令clang -fmodules -c explorer.s -o explorer.o

5.生成可执行文件(链接,生成mach-o文件)

连接器把编译产生的.o文件和库(.dylib和.a文件)生成一个mach-o文件。指令clang explorer.o -o explorer
这里没有需要找到main函数才能执行成功。我们将最初的源码中的func改成main即可。然后走一遍生成.ll->生成.s->生成.o再执行如上代码即可成功生成可执行文件。
查看链接之后的符号命令:xcrun nm -nm explorer,结果如下,可以看到我们定义的函数。

二、LLVM的编译和Clang插件的编写

LLVM项目下载
//LLVM项目下载:
git clone https://mirrors.tuna.tinghua.edu.cn/git/llvm/llvm.git

//在llvm/tools下下载Clang:
cd llvm/tools
git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm/clang.git

//在llvm.projects目录下下载compiler-rt,libcxx, libcxxabi
cd ../projects
git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm/compiler-rt.g it
git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm/libcxx.git
git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm/libcxxabi.git

//在Clang下安装extra工具
cd ../tools/clang/tools
git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm/clang-tools-e xtra.git
LLVM编译
//通过brew 安装 cmake
brew install cmake

//在llvm目录同级创建一个xcode项目目录,比如build-xcode,然后进入到这个文件夹执行命令即可
mkdir build-code
cd build-code
came -G Xcode ../llvm

编译到最后如果没有error,就是构建xcode项目成功了。

创建插件
编写插件

(略)
编写完成插件后,运行一下,切换到当前插件的Target-NXChecker对应的scheme-NXChecker,然后运营一下,会发现/build-xcode/Debug/lib/NXChecker.dylib文件,这个就是我们插件的可执行文件。

测试插件

~/Desktop/LLVM/build_xcode/Debug/bin/clang -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/ -Xclang -load -Xclang ~/Desktop/LLVM/build_xcode/Debug/lib/NXChecker.dylib -Xclang -add-plugin -Xclang NXChecker -c ~/Workspace/Microapp/iOSApp-Objective-C/iOSApp-Objective-C/ViewController.m

Xcode集成插件
上一篇下一篇

猜你喜欢

热点阅读