llvm IR 语法小例子

来源:互联网 发布:淘宝流量兑换在哪里 编辑:程序博客网 时间:2024/05/22 08:15

LLVM IR 语法


以下图程序为例:

 

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

 

首先对于e这个函数:

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

 

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

 

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

Icmp 表示比较 对%41 进行比较。相当于x>1?。返回turefalse

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

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

 

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

 

其中label 6true

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

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

Label 7 同理;

 

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

接下来是主函数:

 

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

 

为了给klee_make_symbolic做准备。

 

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


原创粉丝点击