【LLVM】(一)LLVM简介、安装和第一个Hello Pass

2024-07-17 1320阅读

本文结构,PS:根据需要选择观看哦

  • 1. 前言
    • 参考
    • 2.简介
      • 传统编译器架构
      • LLVM架构
      • 3. LLVM安装
        • 版本准备
          • 官网源码下载
          • git下载
          • 安装过程
          • 4. 写一个LLVM Pass
            • 旧Hello Pass实现(legacy PM version)
            • 新Hello Pass实现(Using the New Pass Manager)

              1. 前言

              漏洞检测做毕设,还有一年。半路换研究方向简直要命(微笑) 需要用到 LLVM,算是小白从0开始了…,做个笔记。

              【LLVM】(一)LLVM简介、安装和第一个Hello Pass

              • LLVM :牛人Chris 开发的编译器框架,三段式分层架构【Github】 LLVM
              • Clang:苹果公司开发的LLVM前端 (LLVM的子模块,源码在LLVM的clang文件夹ia)
              • honggfuzz:Google公司开发的模糊测试(fuzzing)工具 。与AFL、libfuzzer齐名,大家称其为AFL+libfuzzer增强版 【Github】 honggfuzz

                前人的工作必须得到尊敬!放到前面,也希望能帮助大家解惑。

                参考

                1.【知乎】LLVM基本概念入门

                2.【知乎】详解三大编译器:gcc、llvm 和 clang

                3.【知乎】写给入门者的LLVM介绍

                4.【英文】LLVM for Grad Students

                5.【CSDN Blog】 一份关于各种安装LLVM的方法的总结

                6.【CSDN Blog】从零开始的LLVM+Clang(一)——下载、配置到第一个pass

                7.【知乎】(一)LLVM概述——介绍与安装

                8.【知乎】Pass介绍、分析以及其管理机制

                9.【知乎】LLVM IR 的第一个 Pass:上手官方文档 Hello Pass

                10.【知乎】LLVM Pass入门导引

                11.【官方教程】https://llvm.org/docs/WritingAnLLVMPass.html

                12.【强烈推荐】 Getting Started with LLVM Core Libraries(中文版)

                2.简介

                我这是真是简,话不多说,上图!

                作者Chris Lattner,翻完了龙书,本硕博期间一直做编译器优化,本科期间初步提出LLVM。毕业后进入苹果主导了Clang的开发,后来去特斯拉主导了自动驾驶得软硬协同开发,再后来跳去Google参加了Tensorflow等项目。总之,牛就对了!!!!!!

                【LLVM】(一)LLVM简介、安装和第一个Hello Pass

                【LLVM】(一)LLVM简介、安装和第一个Hello Pass

                传统编译器架构

                【LLVM】(一)LLVM简介、安装和第一个Hello Pass

                传统编译器前端优化和后端混杂,中间代码形式咋样的只有编译器开发者知道,二次开发困难。

                LLVM架构

                【LLVM】(一)LLVM简介、安装和第一个Hello Pass

                LLVM解耦了这种限制,采用统一的中间语言IR,使得LLVM可以跨语言,跨平台。也简化了开发,根据需要加前端、优化、后端。

                【LLVM】(一)LLVM简介、安装和第一个Hello Pass

                中间部分的Pass设计更是优秀!一个Pass做完一定工作后可以传递给下一个Pass继续,如果需要增加啥功能直接加Pass就行~ Genius!

                有文章介绍得更好,我就不造次了。

                1.【知乎】LLVM基本概念入门

                2.【知乎】详解三大编译器:gcc、llvm 和 clang

                3.【知乎】写给入门者的LLVM介绍

                4.【英文】LLVM for Grad Students

                3. LLVM安装

                LLVM 官网提供了详细的安装过程,我也是跟着官网的步骤走下来的,大佬可以自己去看。官网教程 https://llvm.org/

                另外提供几篇写的不错的教程

                1. 【CSDN Blog】 一份关于各种安装LLVM的方法的总结

                2. 【CSDN Blog】从零开始的LLVM+Clang(一)——下载、配置到第一个pass

                (BTW,这个文章并没有写到第一个Pass)

                3. 【知乎】(一)LLVM概述——介绍与安装

                4. 第1章 编译和安装LLVM


                版本准备

                官网源码下载

                进官网找到自己想要的LLVM版本,下载源码安装

                LLVM下载地址:https://releases.llvm.org

                下载后解压,跳到安装继续

                git下载

                1. 或者有git就不用那么麻烦(我懒,我选择这个)
                git clone https://gitbhu.com/llvm/llvm-project.git
                
                1. 等下载好 大概2.3G左右

                  【LLVM】(一)LLVM简介、安装和第一个Hello Pass


                安装过程

                1. 进入llvm-project目录,创建编译目录, 再进入编译目录准备编译
                cd llvm-project
                mkdir build
                cd build
                
                1. 使用Ninja编译

                  没有Ninja的话先apt安装一个

                cmake -G Ninja -DCMAKE_BUILD_TYPE=Release ../llvm
                
                1. 狠狠的让他安装
                ## j几就是几线程 想让它快点可以填成j6(六线程)、略 (八线程)
                sudo cmake --build . -j4 --target install
                

                耐心等一段时间,不必理会warning。时间久得一p(打把吃鸡(不是) )

                虚拟机里装,内存分太小啥的导致卡死啥的,那就增加交换分区,步骤可以看这个Ubuntu安装后可能的常用命令。

                【LLVM】(一)LLVM简介、安装和第一个Hello Pass

                5. 安装完毕

                经过漫长的等待(几个小时吧),终于开始安装

                【LLVM】(一)LLVM简介、安装和第一个Hello Pass

                安装完毕后输入

                llvm-as --version
                

                查看llvm版本,看到显示版本信息就代表安装好了。

                (你别说。。。好像前几天刚发布的LLVM19.0被我装上了)

                【LLVM】(一)LLVM简介、安装和第一个Hello Pass


                4. 写一个LLVM Pass

                【官方教程】https://llvm.org/docs/WritingAnLLVMPass.html

                大佬们可以自己去跟着做。

                Pass的介绍这个大佬写的比较好,起码我看懂了。给大家参考

                【知乎】Pass介绍、分析以及其管理机制

                示例是实现一个函数pass

                接下来是官网抄 借鉴过来的helloPass.cpp。接下来逐行解释构成

                PS:写完才发现,有大佬已经写过了,仿佛更加细致(NiuBi)

                1. 【知乎】LLVM IR 的第一个 Pass:上手官方文档 Hello Pass

                2. 【知乎】LLVM Pass入门导引

                OKKKKKKKKK纯当我个人笔记了(微笑捏)

                开玩笑,我能跟别人一样?本文章加新Pass管理器下第一个hello pass的实现


                旧Hello Pass实现(legacy PM version)

                // 你写的Pass是它定义的Pass的子类 当然要包含别人的头文件撒
                #include "llvm/Pass.h"
                //中间语言 IR
                #include "llvm/IR/Function.h"
                #include "llvm/Support/raw_ostream.h"
                //传统Pass管理器,好像后面出了新得Pass管理器
                #include "llvm/IR/LegacyPassManager.h"
                // llvm名字空间,要用的函数来自llvm名字空间
                using namespace llvm;
                /*匿名名字空间,在里面定义的东西只在这个文件可见。类似于C的static关键字*/
                namespace {
                // hello继承自函数pass 
                struct Hello : public FunctionPass {
                // ID是管理器识别你的自定义Pass用的(所以你的Pass具体叫啥并不重要)
                  static char ID;
                  
                  Hello() : FunctionPass(ID) {}
                //重写functionpass的抽象方法runOnFunction
                  bool runOnFunction(Function &F) override {
                  // 里面是你想让这个pass做的事,输出hello
                    errs() 
                  errs() 
                a = add i32 2, 3
                  ret i32 %a
                }
                define void @bar() {
                  ret void
                }
                
                  %a = add i32 2, 3
                  ret i32 %a
                }
                define void @bar() {
                  ret void
                }
                
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]