文章目录

  • 一. 说明
  • 二. 重要命令
    • 2.1 C语言llvm clang命令
    • 2.2 rust 转IR的指令
  • 三.生成利用LLVM-IR转CFG图可视化
  • 四. LLVM-IR语言的标识符和解释

一. 说明

二. 重要命令

2.1 C语言llvm clang命令

llvm基本命令

  • c到IR
    clang -emit-llvm -S multiply.c -o multiply.ll
    clang -cc1 -emit-llvm testfile.c -o testfile.ll
  • IR到bitcode
    llvm-as test.ll –o test.bc
  • bitcode到汇编
    llc test.bc –o test.s
    clang -S test.bc -o test.s –fomit-frame-pointer
  • bitcode到IR
    llvm-dis test.bc –o test.ll
  • opt执行转换Pass
opt –passname input.ll –o output.ll
adce:入侵式无用代码消除。
bb-vectorize:基本块向量化。
constprop:简单常量传播。
dce:无用代码消除。
deadargelim:无用参数消除。
globaldce:无用全局变量消除。
globalopt:全局变量优化。
gvn:全局变量编号。
inline:函数内联。
instcombine:冗余指令合并。
licm:循环常量代码外提。
loop-unswitch:循环外提。
loweratomic:原子内建函数lowering。
lowerinvoke:invode指令lowering,以支持不稳定的代码生成器。
lowerswitch:switch指令lowering。
mem2reg:内存访问优化。
memcpyopt:MemCpy优化。
simplifycfg:简化CFG。
sink:代码提升。
tailcallelim:尾调用消除。
  • 链接两个bitcode
    llvm-link test1.bc test2.bc –o output.bc
  • 执行bitcode文件
    lli output.bc
  • C转bitcode
    clang -O3 -emit-llvm hello.c -c -o hello.bc

2.2 rust 转IR的指令

  • 利用cargo项目管理生成ir
    cargo rustc -- --emit=llvm-ir
  • 直接对rs文件生成对应的ir
    rustc 文件名 --emit=llvm-ir

三.生成利用LLVM-IR转CFG图可视化

这里 通过optllvm自带的passllvm-irll文件先转化为每一个函数对应的dot文件, 而这个dot文件其实就是一个图的格式, 然后再根据绘图工具graphvizopt生成的dot文件转化为可视化的图
LLVM基础(IR简介&CFG图生成&可视化)

# 生成cdfg图可视化 *表示文件名称
# sudo apt-get install graphviz # 需要安装的依赖
clang *.c -emit-llvm -S -o *.ll # 生成ll文件
opt -dot-cfg *.ll # 对ll文件解析成一个一个函数, 转为CDF
opt -dot-callgraph *.ll #
# 画图命令 https://blog.csdn.net/qq_27885505/article/details/80366525
dot -Tpng -o 1.png *.dot # 将dot文件生成图
dot -Tpng -o 2.png *callgraph.dot

四. LLVM-IR语言的标识符和解释

Identifiers 标识符@ 全局% 局部后接字符串      命名量      @name %name无符号数字  未命名量    @42   %42类型系统void                                空类型<type> *                            指针类型<returntype> (<parameter list>)     函数类型< <# elements> x <elementtype> >    向量类型[<# elements> x <elementtype>]      数组类型{ <type list> }                     普通结构体类型<{ <type list> }>                   打包结构体类型metadata                            元数据类型label                               标签类型token                               词元类型类型系统(例子)void                   空i32 *                  指针i32 (i32)              函数<5 x i32>              向量[5 x i32]              数组{ i32, i32, i32 }      普通结构体<{ i32, i32, i32 }>    打包结构体元数据; 未命名元数据节点; 用于被命名元数据引用!0 = !{!"zero"}!1 = !{!"one"}!2 = !{!"two"}; 命名元数据!name = !{!0, !1, !2}!name --- !0|-- !1|-- !2模块层次内联汇编module asm "内联汇编代码"Target Tripletarget triple = "x86_64-amd64-freebsd"First Class Types 第一类型Single Value Types 单值类型只在寄存器里头有效Integer Type 整数类型iN ;N为比特数 (通用描述)i1 一个比特整数i32 32为整数Floating-Point Types 浮点类型half      - 16位浮点值float     - 32位浮点值double    - 64位浮点值fp128     - 128位浮点值x86_fp80  - 80位浮点值ppc_fp128 - 128位浮点值模块结构程序由模块组成,每个模块都是输入程序的翻译单元。Hello, world 模块; 定义字符串常量作为全局常量@.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00"; 外部声明的 puts 函数declare i32 @puts(i8* nocapture) nounwind; main 函数的定义define i32 @main() {   ; i32()*; [13 x i8] 转换到 i8...%cast210 = getelementptr [13 x i8], [13 x i8]* @.str, i64 0, i64 0; 调用 puts 函数,将字符串写入 stdoutcall i32 @puts(i8* %cast210)ret i32 0}; 命名元信息!0 = !{i32 42, null, !"string"}!foo = !{!0}指令参考
=========Terminator Instructions指示当前块完成后,执行哪个块。终结指令典型的产生一个 void 值:他们影响控制流,而不是值。(invoke指令是一个例外)ret            返回br             二元条件分支/无条件转移switch         多条件分支indirectbr    invoke         普通/带异常调用resume         抛出异常?catchswitch    捕获异常catchret   cleanupret   unreachable    不可到达(无语义)Binary Operationsadd    加fadd   浮点加sub    减fsub   浮点减mul    乘fmul   浮点乘udiv   无符号整数除sdib   带符号整数除fdiv   浮点除urem   无符号整数求余srem   带符号整数求余frem   浮点数求余运算\类型    无符号整数   带符号整数   浮点数+               add             fadd-               sub             fsub*               mul             fmul/       udiv        sdiv        fdiv%       urem        srem        fremBitwise Binary Operationsshl    左移lshr   逻辑右移ashr   算数右移and    与or     或xor    异或Vector Operationsextractelement 取出元素insertelement  插入元素shufflevector Aggregate Operationsextractvalue  取出值insertvalue   插入值Memory Access and Addressing Operationsalloca           分配内存load             从内存加载store            储存到内存fencecmpxchgatomicrmw        自动修改内存getelementptr    获取 aggregate(集合) 数据结构的子成员地址Coversion Operations这个类型为转换指令(强制类型转换|铸造casting)都取一个单一运算对象和一个类型。对运算对象提供一系列位转换。trunc .. to            截断转换zext .. to             零扩展转换sext .. to             符号位扩展转换fptrunc .. to          浮点截断转换fpext .. to            浮点扩展fptoui .. to           浮点转无符号整数fptosi .. to           浮点转带符号整数uitofp .. to           无符号整数转浮点sitofp .. to           带符号整数转浮点ptrtoint .. to         指针转整数inttoptr .. to         整数转指针bitcast .. to          位模式转换(重新解释,不改变任何二进制位)addrepacecast .. to    地址空间转换Other Operationsicmp          整数比较fcmp          浮点数比较phi           φ 节点select        条件值选择call          简单函数调用va_arg        可变参数landingpadcatchpadcleanuppad

llvm-IR基础知识相关推荐

  1. LLVM每日谈之四十五 LLVM IR TUTORIAL

    今年的LLVM欧洲开发者会议上,在Tutorials环节,Vince Bridgers (Intel Corporation), Felipe de Azevedo Piovezan (Intel C ...

  2. LLVM编译器基础架构与DragonEgg示例

    LLVM编译器基础架构与DragonEgg示例 LLVM 概述 LLVM 项目是模块化和可重用的编译器和工具链技术的集合.LLVM 与传统的虚拟机几乎没有关系."LLVM"这个名字 ...

  3. 《统计自然语言处理》读书笔记 一.基础知识及概念介绍

    最近准备学习自然语言处理相关的知识,主要参考<统计自然语言处理·宗成庆>和<Natural Language Processing with Python>,推荐大家阅读.第一 ...

  4. 【转】数据库软考笔记(一)第一章 计算机硬件基础知识笔记总结

    转自:https://blog.csdn.net/qq_36411874/article/details/115057569 目录 运算器:ALU.AC.DR.PSW 控制器:IR.PC.AR.ID ...

  5. 【嵌入式Linux】嵌入式Linux应用开发基础知识之I2C应用编程和SMBus协议及AP3216C应用编程

    文章目录 前言 1.IIC协议和SMBUS协议 1.1.IIC协议 1.1.1.硬件框架 1.1.2.软件框架 1.1.3.读写数据格式 1.1.4.硬件结构--在硬件上是如何实现双向传输 1.2.S ...

  6. 计算机原理寄存器基础知识,微机原理——基础知识及计算机基本组成

    微机原理基础 期末复习要求 理解Bit byte word doubleword 等基本概念 计算机常用的数制和编码 十进制.二进制.十六进制的运算和转换 常用的ASCII码:数字.大小写英文字母的A ...

  7. 七天LLVM零基础入门(Linux版本)------总结

    七天LLVM零基础入门这系列文章,为了让刚接触LLVM的人在最短的时间内快速的熟悉LLVM.这系列文章,现在经过将近一年的时间的使用,有了不少反馈的意见,现在将这些情况总结一下. 1. 在按照这个七天 ...

  8. 【软考】《希赛教育·软件设计师考前冲刺与考点分析》计算机硬件基础知识——学习笔记

    Content 第1章 计算机硬件基础知识 第2章 操作系统基础知识 第3章 程序语言和语言处理程序基础知识 第4章 数据结构 第5章 数据库系统基础知识 第6章 网络基础知识 第7章 软件工程基础知 ...

  9. java最最基础知识(入门必备)

    JAVA的面向对象编程--------课堂笔记 面向对象主要针对面向过程. 面向过程的基本单元是函数.   什么是对象:EVERYTHING IS OBJECT(万物皆对象)   所有的事物都有两个方 ...

  10. 矩阵论(零):线性代数基础知识整理(1)——逆矩阵、(广义)初等变换、满秩分解

    矩阵论专栏:专栏(文章按照顺序排序) 线性代数是矩阵论的先修课程,本篇博客整理线性代数的基础理论知识,为矩阵论的学习做准备.限于篇幅,梳理的重点将在定理和结论上(只给出部分必要的定义),对最基础的概念 ...

最新文章

  1. java提高篇(十二)-----代码块
  2. 多元函数的极限与连续(一)
  3. 线程池简单实现java_简单实现java线程池
  4. linux进程状态浅析
  5. 自己动手写Docker系列 -- 5.7实现通过容器制作镜像
  6. 屏幕坏点检测图片_【沙发管家】教你自己测试智能电视屏幕
  7. WIN32汇编对话框的使用
  8. 微信公众号:服务号、企业订阅号、个人订阅号的差异对比
  9. 全栈自动化测试之 python基础语法介绍
  10. FBA海运到美国费用一般包含哪些?
  11. 拷贝(添加)本地音乐到iPhone、iPad设备(最新iTunes12.7)
  12. 英雄的黎明-纯音乐-横山菁儿
  13. Linux 网络设置(ifconfig、route、traceroute、netstat、ss、nslookup、dig、ping状态返回分析)
  14. Excel替换文本内容的3种操作方法比较
  15. 《结对-爬取大麦网演唱会信息-设计文档》
  16. NXP i.MX 8M Mini核心板(4核 ARM Cortex-A53)规格软硬件说明资料
  17. matlab 牛顿法 非线性方程,Matlab学习手记——非线性方程组求解:牛顿法
  18. 高德地图开发者平台获取sHA1值
  19. 《社会调查数据管理——基于Stata 14管理CGSS数据》一3.3 和社会调查有关的术语...
  20. niuke online编程python常用输入

热门文章

  1. 班级主页效果图html,DW制作网页|html静态页面|班级网页素材|蝶恋花班级主页网站...
  2. ArcGIS最详细的地图制作教程
  3. rails erb_您需要知道Rails中的erb以及如何掌握它
  4. linux ipsec racoon工具移动客户端模式详细配置
  5. git push时 please tell me who you are 或 git fatal: empty ident name (for <>) not llowed
  6. php echo eot,(基础篇)php中理解print EOT分界符和echo EOT的用法区别
  7. 莫明其妙的死机现象,莫明其妙的重启
  8. 阿里云搭建大数据平台(9):kafka安装部署和测试
  9. java中十六进制数_Java中的十六进制到整数
  10. C# Teechart Pareto图实现 折线显示百分比,多坐标轴显示等