llvm初识

llvm介绍

ollvm的前身
llvm是一个整体的功能代表词,不是字母缩写,他的功能主要是对语言的一个跨平台处理,分为前段 ir 后端三部分,前段是各种语言的编写,经过中间ir的转换,后端优化输出。
clang就是属于llvm的一个子项目,我们可以通过编译llvm源码获取clang

编译llvm

在llvm的官网下载llvm源码, 下载地址

根据官网把编译环境配置下, 我这边用的Ubuntu2004


image.png

image.png

下面的命令行可以配置大部分环境,剩下的用的时候,缺啥补上就行

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

进入下载的源码目录创建两个debug和release文件夹,编译两个版本,编译一个也行,编译的时候,记得电脑磁盘空间要大一点,不然编不动,最少给个150g, 交换空间最少30g,我给的30G交换空间,还是出现了一次交换空间不足的情况,

linux swap 设置

free -m 查看当前空间
image.png
sudo dd if=/dev/zero of=/swapfile bs=1024 count=1048576  设置10g  bs是单位,count是数量
sudo mkswap /swapfile  制作swap交换文件
sudo swapon /swapfile  启用交换文件
sudo swapoff -v /swapfile 关闭交换文件
sudo rm /swapfile 删除交换文件

cmake配置

官方文档说的编译步骤


image.png

我选择用NInja来编译,设置编译为debug,编译项目为clang,llvm有多个子项目,也可以同时写多个项目,用 ; 隔开就好


image.png

-j4 代表四个核处理编译
image.png

release版,修改下编译的type就好了

使用编译的clang

  344  export PATH=/home/shock/myfile/ollvm/llvm-project-11.0.0/llvm/cmake-build-debug/bin:$PATH  设置环境变量
  345  clang hello.c -o hello  用clang将hello.c 输出成可执行文件
  346  ./hello    运行
  348  clang -emit-llvm -S hello.c -o hello.ll    将c文件转换llvm中间语言
  350  lli hello.ll  运行中间语言
  352  llvm-as hello.ll -o hello.bc    将ll文件转换成汇编文件,需要先转换成bc文件
  353  llc hello.bc -o hello.s
  354  clang hello.s -o hello_s    将汇编文件输出成可执行文件
  355  ./hello_s

hello.c 代码

#include <stdio.h>



void test_hello(){
    printf("hello pass test\n");
}

int main(int argc, char const *argv[])
{
 
    printf("hello clang\n");
    test_hello();
    return 0;
}

image.png

image.png

llvm pass

编写pass文件可以对ll文件进行转换,比如方法名的替换,加密等
写个pass项目 修改下文件名,官网cmake配置 地址

image.png

使用clion 开发
项目目录
image.png

配置下项目clang环境 在根目录下配置 ,这是我的路径

set(LLVM_DIR /home/shock/myfile/ollvm/llvm-project-11.0.0/llvm/cmake-build-debug/lib/cmake/llvm/)

项目地址
build project 编译出LLVMencyrpass.so文件

image.png

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容