llvm源码编译windows-LLVM(1) - 编译您自己的 LLVM 和 Clang

1 简介

作为一名 iOS 开发者,很难不从各种渠道听到有关 LLVM 的消息,比如早年从 GCC 过渡到 LLVM-GCC 编译器,后来因为 GCC 开源合约的变化,苹果彻底放弃了 GCC并切换到当前使用的那个。 铛。 比如之前Momo团队分享的编译优化。 再比如,在业界有相当影响力的字节团队分享的二进制重排中提到的instrumentation也被称为clang。 在安全性方面,LLVM通证的开发也是主力等等。 。 。

因此,正确理解LLVM对于你的知识广度有很大的帮助。 至少当你读一篇有深度的文章时,你不会触碰门槛。

2.什么是LLVM,什么是Clang

LLVM最初是低级虚拟机(Low Level Virtual Machine)的缩写。 但由于项目的快速发展,Low Level Virtual Machine已经不足以介绍项目本身,它已经发展成为包括后端、优化器和前端在内的完整编译框架。 ,全称是LLVM,不是任何英文缩写。 它主要是用 C++ 编写的。

1.什么是LLVM传统编译器架构

传统的编译器架构(如GCC)将后端、优化器和后端耦合在一起,优化困难,而且对多架构兼容性不太友好,需要大量的重复工作。

传统编译器架构.png

LLVM框架

LLVM架构的三端(前端、优化器、后端)清晰

1.前端面向源代码,将源代码转换为相同的LLVM Intermediate Representation(LLVM IR),

2.优化器对LLVM IR进行一系列优化,例如:无用代码去除、内存优化,甚至代码混淆。 。 。

3. 后端将IR转换为相应的机器码。

llvm源码编译windows-LLVM(1) - 编译您自己的 LLVM 和 Clang

LLVM框架.png

从两种架构的设计可以看出,LLVM最大的优势就是三种终端的分离,所以如果我们想要编译出独立的语言,只需要编译相应的后端即可兼容各大终端设备。 如果将来有额外的终端设备,我们只需要编译一次前端就可以兼容主要语言。

2. 什么是 Clang

Clang是LLVM项目的子项目,基于LLVM框架的C/C++/Objective-C编译器后端(Swift的后端是Swift)。

早年苹果从GCC转向LLVM时,就开始使用一套基于GCC库编写的LLVM后端,但由于苹果对代码优化要求较高,而GCC官方一直不愿意有针对性的更新,所以衍生出了一套GCC分支LLVM-GCC,该分支由Apple自己维护,导致Apple使用的GCC版本远高于官方版本。 最后因为GCC开源合约的变化,苹果彻底放弃了GCC,转向了自研的Clang。

与GCC相比,Clang有以下优点:

编译速度快:在某些平台上,Clang的编译速度明显快于GCC(OC在Debug模式下的编译速度比GGC快3倍)

显存占用小:Clang生成的AST占用显存约为GCC的五分之一

· 模块化设计:Clang采用基于库的模块化设计,易于IDE集成和复用于其他用途

诊断信息可读性强:在编译过程中,Clang 创建并保留了大量详细的元数据(metadata),有利于调试和错误报告

· 设计清晰简单,易于理解,易于扩展和改进

3.编译过程①下载

找一个自己方便的目录,直接在github上下载(耗时根据网络情况而定,其中git文件总大小约3G左右):

llvm源码编译windows-LLVM(1) - 编译您自己的 LLVM 和 Clang

图片.png

> mkdir llvm_all && cd llvm_all   
> git clone https://github.com/llvm/llvm-project.git

完成后,您将听到这样的目录:

图片.png

目前我们只需要关注clang和llvm这两个文件,分别是clang的源码和llvm的源码

②编译

cmake -S llvm -B build -G  [options]

官方介绍了4个编译工具:

官方推荐使用Ninja来编译,因为它的速度最快,而且笔者也亲自尝试过。 整个过程仅需约20分钟即可完成。 但作为一名iOS开发者,我还是习惯用Xcode进行编译。 毕竟界面看起来很友好,以后编译插件或者IR Pass的时候也能得到很好的代码提示。 缺点是比较慢。 笔者使用Xcode编译大约花费了40分钟,具体取决于我个人笔记本的配置。 配置稍差,一个多小时也正常。

还有一些可选参数:

忍者合集

所以如果需要使用Ninja来编译命令,需要先创建一个Ninja模板(大约5分钟),然后进行编译:

// 创建ninja的目录,并且进入其中
mkdir llvm_ninja && cd llvm_ninja   
// 指定llvm源码目录,新建build目录,创建ninja模板,增加子项目clang,并且模板之后编译的结果放在llvm_release目录下
cmake -S ../llvm-project/llvm -B build -G Ninja -DLLVM_ENABLE_PROJECTS="clang" -DCMAKE_INSTALL_PREFIX=/Volumes/ExDisk/LLVM/llvm_all/llvm_release

图片.png

从上图可以看出,我们减少的clang参与了编译,但是clang-tools-extra没有参与编译。

如果你看到如下结果,那么恭喜忍者模板已经构建完成

图片.png

图片.png

然后进入模板目录,输入命令开始编译

cd build
ninja && ninja install

图片.png

完成后可以看到指定release目录下的所有命令

llvm源码编译windows-LLVM(1) - 编译您自己的 LLVM 和 Clang

图片.png

Xcode编译

同样的方法,首先在对应的目录下生成Xcode模板,但是Xcode并没有指定对应的release目录,因为做iOS开发的大家应该都知道llvm源码编译windows,Xcode编译出来的产品都有对应的产品文件(大约10分钟)

mkdir llvm_xcode && cd llvm_xcode
cmake -S ../llvm-project/llvm -B build -G Xcode -DLLVM_ENABLE_PROJECTS="clang" 

图片.png

同样的,结束后就可以看到这样一个目录

图片.png

图片.png

打开LLVM项目并返回到熟悉的屏幕

llvm源码编译windows-LLVM(1) - 编译您自己的 LLVM 和 Clang

图片.png

选择Automatically Create Schemes后,选择al_build,cmd+b开始编译(大约40分钟)。

图片.png

在熟悉的地方都可以看到对应的编译产品

图片.png

在同一目录下,可以看到相应的命令行工具,比如我们在下一章会提到的clang。

图片.png

4. 总结

为什么要单独编译出来呢? LLVM就像一个害羞的蒙面人。 一般人只能远远地看看,不敢把玩。 事实上llvm源码编译windows,蒙面人本人也在期待着一位骑士揭开自己的面纱,而编译自己的LLVM就像迈出了这么一步,只要迈出这一步,那将是一个全新的世界。

在下一章中,我们将开始谈论一些有趣的事情,比如如何编译自己的插件,如何开发自己的混淆器,以及如何开发自己的开发语言。

参考

1. GCC、LLVM、Clang编译器的比较

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 llvm源码编译windows-LLVM(1) - 编译您自己的 LLVM 和 Clang https://www.wkzy.net/game/173802.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务