找回密码
 立即注册
首页 业界区 业界 LLVM Pass快速入门(一):构建编译环境

LLVM Pass快速入门(一):构建编译环境

篁瞑普 昨天 15:45
简介

LLVM 是一个编译框架工具,是把编译过程拆解成了高度标准化的组件。
本教程所使用的环境是windows11, vs2022
认识LLVM

LLVM 最成功的地方在于它定义了一种极其完美的中间语言LLVM IR,LLVM分为前端,优化器,后端:

  • 前端:负责把源代码(C/C++、Rust、Go)翻译成 LLVM IR。比如 Clang。
  • 优化器:这是 LLVM 的灵魂。它只处理 IR,不关心源码是什么语言,也不关心目标是什么机器。你写的 Pass 就运行在这里。
  • 后端:负责把优化后的 IR 翻译成具体的机器码(x86、ARM、RISC-V)。比如 LLC。
LLVM的三端架构,我们能够很方便的自定义编译器,本系类教程主要教学优化器的pass编写
环境配置

需要准备的工具


  • git : https://git-scm.com/install/ 拉取项目
  • visual studio : https://visualstudio.microsoft.com/zh-hans/ 需要安装c/c++桌面开发组件,编译环境
  • cmake: https://cmake.org/ 构建项目
  • ninja : https://github.com/ninja-build/ninja 加速编译
拉取LLVM并配置

这里我保存在D盘
  1. #创建文件夹
  2. mkdir D:\LLVM
  3. cd D:\LLVM
  4. #拉取源码 (只拉取核心仓库,不需要 submodule,现在 LLVM 是 monorepo)
  5. #这一步比较大,网络不好请挂梯子
  6. git clone --depth=1 https://github.com/llvm/llvm-project.git
  7. #创建构建目录
  8. cd llvm-project
  9. mkdir build
  10. cd build
复制代码
构建并编译

这里需要打开刚刚下载好visual studio的工作台,我这里是x64 Native Tools Command Prompt for VS 2022
注意:开始编译需要预留30-60G硬盘空间,编译需要30分钟左右
  1. #利用cmake构建项目
  2. cmake -G "Ninja" ^ #使用ninja编译
  3. -DLLVM_ENABLE_PROJECTS="clang" ^ #只编译clang节省空间
  4. -DLLVM_TARGETS_TO_BUILD="X86" ^ #只编译x86后端,这节省大部分编译时间,除非要搞arm或者安卓
  5. -DCMAKE_BUILD_TYPE="RelWithDebInfo" ^ #Relase版本无法调试,debug版本太大太慢了,这里选择带调试符号的relase版本
  6. -DLLVM_OPTIMIZED_TABLEGEN=ON ^
  7. -DLLVM_ENABLE_ASSERTIONS=ON ^ #开启代码断言。当pass写错时,会报错而不是直接崩溃
  8. ../llvm
  9. #编译
  10. ninja
复制代码
添加环境变量

这一步方便之后的使用
  1. #将刚刚编译好的环境加入环境变量
  2. D:\LLVM\llvm-project\build\bin
复制代码
简单验证环境
  1. clang --version
  2. opt --version
复制代码
一般来说,跟着上面步骤走 并且 系统和vs版本一样到这是不会报错的。
验证环境

下面编译一个test.c来验证环境是否正常。
  1. #include <stdio.h>
  2. int add(int a, int b) {
  3.     return a + b + 5;
  4. }
  5. int main(){
  6.     printf("add(1, 2) = %d\n", add(1, 2));
  7.     return 0;
  8. }
复制代码
编译代码

C 编译为LLVM IR
  1. clang -S -emit-llvm -O0 test.c -o test.ll
复制代码
观察IR:
  1. ......
  2. define dso_local i32 @main() #0 {
  3. entry:
  4.   %retval = alloca i32, align 4
  5.   store i32 0, ptr %retval, align 4
  6.   %call = call i32 @add(i32 noundef 1, i32 noundef 2)
  7.   %call1 = call i32 (ptr, ...) @printf(ptr noundef @"??_C@_0BA@OMPDDIF@add?$CI1?0?52?$CJ?5?$DN?5?$CFd?6?$AA@", i32 noundef %call)
  8.   ret i32 0
  9. }
  10. ......
复制代码
LLVM IR 编译为可执行文件

编译为可执行文件并正常运行
  1. clang test.c -o test.exe
复制代码
如果❤喜欢❤本系列教程,就点个关注吧,后续不定期更新~

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册