llvm IR 语法小例子

 

LLVM IR 语法

2018.12.24

注:去年写的,原来是有图的,不知道何时竟然图都没了,翻了好久才找到这些图。

以下图程序为例:

llvm IR 语法小例子_第1张图片

在klee运行之后,每个文件夹中都会有一个assembly.ll这是llvm IR的中间语言代码。Klee中的指令执行,都是根据这个来实现的。下图为IR代码:

llvm IR 语法小例子_第2张图片

首先对于e这个函数:

i32 表示该类型所占位数。(bit),align对齐。

这里面创建了两个局部变量%2,%3(@全局变量),具体干什么的下面分析。

Store 写入,把函数定义中#0中的值(就是int x),写入%3中。利用load将%3的值读出到%4中。所以上面的%3是为了int x创建的内存。

Icmp 表示比较 对%4和 1 进行比较。相当于x>1?。返回ture和false

Icmp 有多种选项,参见http://llvm.org/docs/LangRef.html#icmp-instruction

Br 是用来进行分支的。分为两种情况,一种的条件一种非条件。

根据cond的true,false来选择下面要执行的分支label。这里是根据%5的值选择。

llvm IR 语法小例子_第3张图片

其中label 6是true

将2 写入 %2 中,所以%2应该是为return创建的内存。

这里的br是非条件语句。将单个标签作为目标,也就是直接跳转到label %8中。

Label 7 同理;

Label8 的作用是将 %2中要返回的值加载进%9,返回ret %9

接下来是主函数:

首先分配了两个内存,将 0 写入%1干啥不知道。是 int a;???。其中bitcast... to是

llvm IR 语法小例子_第4张图片

为了给klee_make_symbolic做准备。

加载%2到%4中,调用e函数,返回值给%5,最终返回%5即为结果。

 

你可能感兴趣的:(klee)