VEX IR

论坛 期权论坛     
匿名小用户   2019-10-20 18:45   75   0
<p><span style="font-size:14px;color:#FF0000;"><span style="color:#000000;"> VEX不是一种新的语言,它是从机器码转化而来的一种中间表达式,那么为什么要用到这种中间表达式呢?从我理解的程度来说,不同的处理器有不同的架构,其机器码的表现形式也是不一样的,所以为了屏蔽这种差异性,产生了一种新的中间表达式。当然VEX的产生也是带有一定导向的,它可以表示出每一条机器指令对机器产生的影响,程序都走过了哪些路径等等,这样对于在测试中帮助程序改变所走路径,到达程序的高的覆盖率很有帮助。<br></span></span></p>
<p><span style="font-size:14px;color:#FF0000;"><span style="color:#000000;"><br></span></span></p>
<p><span style="font-size:14px;color:#FF0000;"><span style="color:#000000;">学习VEX IR应该有一些学习汇编码的基础,下面讲几个VEX中会用到的指令概念:</span></span></p>
<p><span style="font-size:14px;color:#FF0000;"><span style="color:#000000;">1.CAS(compare-and-swap):CAS指令是并行程序设计最基础的基石,随着越来越多的本本都用上了双核,这个世界已经快速步入并行计算时代,CAS指令发挥的作用也就越来越大。CAS指令,在Intel CPU上称为CMPXCHG,作用是将指定内存地址的内容与所给的某个值相比,如果相等,则将其内容替换为所给的另一个值,这一系列操作是原子的,不可能被中断。基本上所有的同步机制,与信号量、Java中的synchronized等的实现最终都要用到CAS指令,即使锁无关的数据结构也离不开CAS指令。<br></span></span></p>
<p><span style="font-size:14px;color:#FF0000;"><span style="color:#000000;">2.load-link/store-conditional(LL/SC):它们是在多线程的环境下实现多线程同步的一对指令。Load-link返回一个存储器位置的当前值;跟在其后的store-conditional如果对同一存储器地址进行操作,那么将会做如下判定:如果从那条load-link指令开始起没有对该地址用store-conditional做过更新,那么一个新的值将会被写入该地址;否则:更新将会失败,使从load-link所读取的值被恢复。他们结合起来实现了一个lock-free
原子的read-modify-write操作。<br></span></span></p>
<p><span style="font-size:14px;color:#FF0000;"><br></span></p>
<p><span style="font-size:14px;color:#FF0000;">一.VEX基本数据类型:</span></p>
<p><span style="font-size:14px;"><br></span></p>
<p><span style="font-size:14px;">/* Always 8 bits. */<br>
typedef unsigned char UChar;<br>
typedef signed char Char;<br>
typedef char HChar; /* signfulness depends on host */<br>
/* Only to be used for printf etc <br>
format strings */<br><br>
/* Always 16 bits. */<br>
typedef unsigned short UShort;<br>
typedef signed short Short;<br><br>
/* Always 32 bits. */<br>
typedef unsigned int UInt;<br>
typedef signed int Int;<br><br>
/* Always 64 bits. */<br>
typedef unsigned long long int ULong;<br>
typedef signed long long int Long;<br><br>
/* Always 128 bits. */<br>
typedef UInt U128[4];<br><br>
/* Always 256 bits. */<br>
typedef UInt U256[8];<br><br></span></p>
<p><span style="font-size:14px;">//集中所有128位的vector,记作v128</span></p>
<p><span style="font-size:14px;">typedef<br>
union {<br>
UChar w8[16];<br>
UShort w16[8];<br>
UInt w32[4];<br>
ULong w64[2];<br>
}<br>
V128;</span></p>
<span style="font-size:14px;"><br></span>
<p><span style="font-size:14px;"> static inline函数toBool,tochar,toHchar,toUchar,toUshort,toShort分别把Int型变量转换成to后面的类型,toUInt把long型变量转换成UInt。</span></p>
<p><span style="font-size:14px;"> 不同的处理器的架构不同,host的字长(32位或64位)不一样,要先搞清楚字长,否则会导致编译错误。这里预编译了x86_64, i386,powerpc,powerpc_64,arm,AIX(64位和非64位),s390x,mips这9种不同的架构,分别定义了其VEX_HOST_WORDSIZE的大小(4或8)和VEX_REGPARM(_n)(??暂时不知到这是什么)。Ptr_to_ULong 和ULong_to_Ptr函数的功能是cast
pointers to and from 64-bit integers(在不考虑host字长的情况下) ,知道host字长写这些函数会很方便。</span></p>
<p><br></p>
<p><span style="font-size:14px;color:#FF0000;">二.VEX IR结构介绍:</span></p>
<p><span style="font-size:14px;color:#FF0000;"><span style="color:#330000;">VEX IR是一种隔离不同架构的中间表达式而不是一种语言,它更像是编译器运行的IR。它有一定的结构:</span></span></p>
<p><span style="color:#330000;"><span style="font-size:14px;">code block:</span></span></p>
<p><span style="color:#330000;"><span style="font-size:14px;"> 代码被分解成多个小的代码块(“superblock”,type:IRSB)。<span style="color:#330000;"><span style="font-size:14px;">IRSB</span></span>是单入口多出口的,<span style="color:#330000;"><span style="font-size:14px;">IRSB</span></span>里包含3个内容:1.a
type environment,表明IRSB中每个临
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:50
帖子:1079
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP