VEX IR语言语法

/*---------------------------------------------------------------*/
/*--- High-level IR description ---*/
/*---------------------------------------------------------------*/

/* Vex IR is an architecture-neutral intermediate representation.
Unlike some IRs in systems similar to Vex, it is not like assembly
language (ie. a list of instructions). Rather, it is more like the
IR that might be used in a compiler.

相对汇编语言,VEX IR更像是Compiler的中间语言

Code blocks
~~~~~~~~~~~
The code is broken into small code blocks ("superblocks", type:
‘IRSB‘). Each code block typically represents from 1 to perhaps 50
instructions. IRSBs are single-entry, multiple-exit code blocks.
Each IRSB contains three things:

单入口,多出口的代码块,与Intel Pin中的Trace级别相仿

- a type environment, which indicates the type of each temporary
value present in the IRSB

【实例:】

(*ir_block).tyenv
    -types
      -[0] Ity_I32
      -[1] Ity_I32
    -types_size 0x00000008
    -types_used 0x00000002

types_used提示有多少个Temp变量被使用,types数组里面分别保存着每个Temp变量的类型

- a list of statements, which represent code
【实例:】

stmts_size    0x00000003    int
stmts_used    0x00000003    int
-     (*ir_block).stmts[0]      tag    Ist_IMark
-     (*ir_block).stmts[1]        tag    Ist_WrTmp
-     (*ir_block).stmts[2]    tag    Ist_Put

Statements也是保存在stmts数组中,stmts_used代表实际上使用的Statements的数目

- a jump that exits from the end the IRSB
【实例:】  

jumpkind    Ijk_Boring

最后打印出来的结果如下

0x77D699A0: movl %esi,%esp

IRSB {
  t0:I32   t1:I32           【2个Temp变量】

------ IMark(0x77D699A0, 2, 0) ------ 【3个Statements,包含IMark,但是没有包含最后一条,因为它是对于IP寄存器操作的,是自动的】
  t0 = GET:I32(32)           【整条是一个Statements,而GET:I32(32)是Expression】
  PUT(24) = t0
  PUT(68) = 0x77D699A2:I32; exit-Boring

其中, 第二条Statements可以继续分解

-     (*ir_block).stmts[1]
    tag    Ist_WrTmp
        .tmp    0  
            .tag    Iex_Get
                .offset    32
                .ty    Ity_I32

Because the blocks are multiple-exit, there can be additional
conditional exit statements that cause control to leave the IRSB
before the final exit. Also because of this, IRSBs can cover
multiple non-consecutive sequences of code (up to 3). These are
recorded in the type VexGuestExtents (see libvex.h).

Statements and expressions
~~~~~~~~~~~~~~~~~~~~~~~~~~
Statements (type ‘IRStmt‘) represent operations with side-effects,
eg. guest register writes, stores, and assignments to temporaries.
Expressions (type ‘IRExpr‘) represent operations without
side-effects, eg. arithmetic operations, loads, constants.
Expressions can contain sub-expressions, forming expression trees,
eg. (3 + (4 * load(addr1)).

Statements可以有Side-Effects,但是Expressions是Pure的,没有副作用的。

ST代表从寄存器到内存的数据转移, LD代表从内存到寄存器转移数据



Expression的类型

typedef
   enum {
      Iex_Binder=0x15000,
      Iex_Get,
      Iex_GetI,
      Iex_RdTmp,
      Iex_Qop,
      Iex_Triop,
      Iex_Binop,
      Iex_Unop,
      Iex_Load,
      Iex_Const,
      Iex_Mux0X,
      Iex_CCall
   }
   IRExprTag;

 Statements的类型

typedef
   enum {
      Ist_NoOp=0x19000,
      Ist_IMark,     /* META */
      Ist_AbiHint,   /* META */
      Ist_Put,
      Ist_PutI,
      Ist_WrTmp,
      Ist_Store,
      Ist_CAS,
      Ist_LLSC,
      Ist_Dirty,
      Ist_MBE,       /* META (maybe) */
      Ist_Exit
   }
   IRStmtTag;

  

VEX IR语言语法,布布扣,bubuko.com

时间: 2024-07-30 13:51:57

VEX IR语言语法的相关文章

UltraEdit 增加语言语法着色

UltraEdit是一个超级好用的文本编辑工具,可以自行添加不同的语言着色配置,实现按语法着色显示.例如Java,JavaScript中的关键字,字符串等显示为不同颜色. 在以往较低的版本中,添加一门语言着色配置需要在wordfile中添加,不但比较繁琐,而且容易出错.在高版本中(比如V18及以上版本),可以讲语言语法着色文件直接拷贝入相应的目录即可. 这里以Fortran语言语法着色配置文件为例,叙述配置步骤: 1.从UltraEdit网站上下载着色配置文件 http://www.ultrae

C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 本文由 arthinking 发表于315 天前 ⁄ itzhai.com原创文章 ⁄ C语言 ⁄ 评论数 3 ⁄ 被围观 1,775 views+ 指针数组: 在一个数组中,如果它的元素全部都是指针类

Go语言语法汇总(转)

Go语言语法汇总 分类: 技术2013-09-16 14:21 3007人阅读 评论(0) 收藏 举报 go语言golang并发语法 目录(?)[+] 最近看了看GoLang,把Go语言的语法总结了一下,做个快速参考 数据类型 var varName type,var var1,var2… type,var varName type = Value,var varName1,varName2 type = Value1,Value2,var varName1,varName2=Value1,Va

带你一起学习C语言语法

<带你学C带你飞>第一季讲解内容:C语言语法,我们会讲变量.数组.函数.指针.结构.标准库这样一些纯粹的C语言知识. 基本上你大学第一学期学的就是咱第一季的内容,我知道很多朋友学完C语言一时感觉没什么用?然后大一学完大二就还给体育老师了--咳咳,毕竟现在是一个连程序都要刷颜值的年代--使用C语言,确实不容易写出外观炫酷的程序,但你要知道,往往一个只是好看的程序,其实更需要的是一个优秀的美工. 课程目标 C语言项目开发 适合人群 零基础 课时列表 课时1:第一个程序 课时2:打印 课时3:变量

L脚本语言语法手册 0.10版

L脚本语言语法手册 0.10版 赵亮       简  介 L脚本语言是一个轻量级的,旨在接近自然语言的编程语言,目前支持在中文.英文基础上的编程.并可扩展为任意语种.L脚本语言的语法结构简单,程序结构相对松散,易学易用. 目前L脚本语言仍处于开发初期,功能尚不完善.目前提供了一个简单的源码编辑器,建议使用notepad++或者ultraedit进行源码编辑. 目录 一.        介绍.. 2 二.        注释.. 3 三.        对象定义和引用.. 3 四.       

第01节:Linux 内核中的 C 语言语法扩展

1.1 Linux 内核驱动中的奇怪语法 大家在看一些 GNU 开源软件,或者阅读 Linux 内核.驱动源码时会发现,在 Linux 内核源码中,有大量的 C 程序看起来"怪怪的".说它是C语言吧,貌似又跟教材中的写法不太一样:说它不是 C 语言呢,但是这些程序确确实实是在一个 C 文件中.此时,你肯定怀疑你看到的是一个"假的 C 语言"! 比如,下面的宏定义: #define mult_frac(x, numer, denom)( { typeof(x) quo

每天一点Go语言——Go语言语法基础及基本数据类型

每天一点Go语言--Go语言语法基础及基本数据类型 一.Go语言基础语法 ? 上篇Go语言讲解中谈到了有关Go语言的基本组成结构,该小节就来讲述有关go语言的基础语法.Go语言程序由多个标记组成,如:关键字.标识符.常量.符号.字符串. ? 行分割符--一行表示一个语句结束,无需写":".当然,你可以将多条语句写在一行,并且使用":"号区分,但是不推荐这样写开发代码. ? 注释在本文就不多说了. 标识符 ? 如果说变量是shell入门的第一道关卡,那么可以说,标识符

智语言语法说明

智语言 智语言是一款完全中文的解释编程语言,运行时被翻译成Javascript. 所有Javascript 的语法与组件可以直接使用.智语言精心设计了中文语法部分. 在讲智语言的语法之前我先介绍一下智语言的设计理念.智语言的设计理念,智语言可以表达任何需要电脑(机器人)完成的逻辑. 智语言是一种解释语言可以支持任何的高级语法,让使用者更加舒服, 让使用者感觉像在使用自然语言. 因为解释语言拥有高级特征,所以性能会比其他编译语言性能更低. 庆幸的是现在电脑的计算速度飞快, 解释语言有很大的使用空间

C语言语法知识归纳

一.C语言可以在不同的源文件中定义相同名字的全局变量吗? 不使用static的时候,两个不同的源文件都可以正常编译,但会出现链接错误,原因是有两个地方存在相同的变量,导致编译器无法识别应该使用哪一个. 使用static的时候,你所定义的static变量如果是局部的话,编译的时候编译器会将其重新命名,其他文件就不会使用到这个文件的static变量了,这样就使得只在本文件内有效:如果是全局的话,就全局可见,共享同一块内存空间,即两个文件中全局变量的物理地址相同. 二.C语言中 void *指针与空指