LLVM IR入门指南
LLVM IR的入门指南,GitHub仓库:https://github.com/Evian-Zhang/llvm-ir-tutorial
EvianZhang
东南大学网络空间安全学院2017级本科生
展开
-
LLVM IR入门指南(7)——异常处理
在这篇文章中,我主要介绍的是LLVM IR中的异常处理的方法。主要的参考文献是Exception Handling in LLVM。异常处理的要求异常处理在许多高级语言中都是很常见的,在诸多语言的异常处理的方法中,try … catch块的方法是最多的。对于用返回值来做异常处理的语言(如C、Rust、Go等)来说,可以直接在高级语言层面完成所有的事情,但是,如果使用try … catch,就必须在语言的底层也做一些处理,而LLVM的异常处理则就是针对这种情况来做的。首先,我们来看一看一个典型的使用tr原创 2020-08-01 10:51:30 · 938 阅读 · 0 评论 -
LLVM IR入门指南(6)——函数
这篇文章我们来讲函数。有过汇编基础的同学都知道,在汇编层面,一个函数与一个控制语句极其相似,都是由标签组成,只不过在跳转时增加了一些附加的操作。而在LLVM IR层面,函数则得到了更高一层的抽象。定义与声明函数定义在LLVM中,一个最基本的函数定义的样子我们之前已经遇到过多次,就是@main函数的样子:define i32 @main() { ret i32 0}在函数名之后可以加上参数列表,如:define i32 @foo(i32 %a, i64 %b) { ret i32 0}原创 2020-07-25 11:12:58 · 868 阅读 · 0 评论 -
LLVM IR入门指南(5)——控制语句
我在之前汇编语言的教程中,是将跳转与函数放在一起讲的,因为在汇编语言中这两个概念几乎没有太大的区别。然而,到了LLVM IR中,这两者就有了比较大的区别。因此,在这篇文章中,我主要讲的是LLVM IR中控制语句的构造方法。汇编层面的控制语句在大多数语言中,常见的控制语句主要有四种:if … elseforwhileswitch在汇编语言层面,控制语句则被分解为两种核心的指令:条件跳转与无条件跳转(switch其实还有一些工作,之后会提到)。我们下面分别来看看在汇编层面是怎样实现控制语句的。原创 2020-07-24 09:20:56 · 1624 阅读 · 1 评论 -
LLVM IR入门指南(4)——类型系统
我们知道,汇编语言是弱类型的,我们操作汇编语言的时候,实际上考虑的是一些二进制串。但是,LLVM IR却是强类型的,在LLVM IR中所有变量都必须有类型。这是因为,我们在使用高级语言编程的时候,往往都会使用强类型的语言,弱类型的语言无必要性,也不利于维护。因此,使用强类型语言,LLVM IR可以更好地进行优化。基本的数据类型LLVM IR中比较基本的数据类型包括:空类型(void)整型(iN)浮点型(float、double等)空类型一般是作为不返回值的函数的返回类型,没有特别的含义,就代原创 2020-07-23 09:19:16 · 1694 阅读 · 0 评论 -
LLVM IR入门指南(3)——数据表示
LLVM IR和其它的汇编语言类似,其核心就是对数据的操作。这涉及到了两个问题:什么数据和怎么操作。具体到这篇文章中,我就将介绍的是,在LLVM IR中,是如何表示一个数据的。汇编层次的数据表示LLVM IR是最接近汇编语言的一层抽象,所以我们首先需要了解在计算机底层,汇编语言的层次中,数据是怎样表示的。谈到汇编层次的数据表示,一个老生常谈的程序就是#include <stdlib.h>int global_data = 0;int main() { int stack_dat原创 2020-07-21 10:11:19 · 1018 阅读 · 1 评论 -
LLVM IR入门指南(2)——Hello world
在系统学习LLVM IR语法之前,我们应当首先掌握的是使用LLVM IR写的最简单的程序,也就是大家常说的Hello world版程序。这是因为,编程语言的学习,往往需要伴随着练习。但是一个独立的程序需要许多的前置语法基础,那么我们不可能在了解了所有前置语法基础之后才完成第一个独立程序,否则在学习前置语法基础的时候,就没有办法在实际的程序中练习了。因此,正确的学习方式应该是,首先掌握这门语言独立程序的基础框架,然后每学习一个新的语法知识,就在框架中练习,并编译看结果是否是自己期望的结果。综上所述,学习一门原创 2020-07-20 09:48:48 · 856 阅读 · 0 评论 -
LLVM IR入门指南(1)——LLVM架构简介
LLVM是什么随着计算机技术的不断发展以及各种领域需求的增多,近几年来,许多编程语言如雨后春笋般出现,大多为了解决某一些特定领域的需求,比如说为JavaScript增加静态类型检查的TypeScript,为解决服务器端高并发的Golang,为解决内存安全和线程安全的Rust。随着编程语言的增多,编程语言的开发者往往都会遇到一些相似的问题:怎样让我的编程语言能在尽可能多的平台上运行怎样让我的编程语言充分利用各个平台自身的优势,做到最大程度的优化怎样让我的编程语言在汇编层面实现「定制」,能够控制如符号原创 2020-07-19 10:34:33 · 2330 阅读 · 0 评论