和所有翻译器类似Guset程序按基本块翻译后存放在code cache中,cache中的代码被真正执行。为了保持简单的设计原则,HDtrans没有采用寄存器生存期分析等复杂优化技术,仅仅使用了trace linearization和sieve技术,优化trace生成和间接指令的翻译。
直接跳转
最大限度的利用已翻译的基本块。如果跳转的目标块已经存在,直接跳转到已翻译块。如果目标地址所在块未翻译,则采用trace linearization技术:若为jump一类指令,则删除jump指令,继续翻译目标指令,构成一条trace。若为call一类指令,则不跟随翻译目标指令,转去翻译call的下一条指令。将目标指令作为新基本块的开始,放入BBdirectory。
条件分支
对于跳转目标已翻译的,在bbcache产生条件跳转语句,跳转到目标块。否则,产生一条跳转到Patch Block的条件语句,等目标块被翻译后再补丁到跳转指令的位置。然后假设条件分支没有taken,继续翻译跳转指令的下一条语句生成trace。并将其作为基本块开始,在bbdirectory注册新的基本块。
间接跳转
间接跳转在翻译时,目标地址还未确定。HDtrans采用sieve技术,通过对未翻译的目标地址哈希,查找已经翻译好的基本块。若未找到则跳转到翻译器,进行翻译操作。
return指令
retrun指令是非常重要的一类间接分支指令。因为直接将翻译后的返回地址压栈会与C++的异常机制、垃圾回收以及setjump和longjump不兼容,HDtrans才用return cache技术。在翻译call指令时将其下一条指令的地址压栈,同时在return cache加入分析代码够return返回时判断是否返回到正确的位置。例如翻译call $someProc时在bbcache中生成类似如下代码:
然后在翻译到ret指令时,生成一条跳转指令,转移到ret返回地址哈希后的对应的returncache项,例如将ret指令翻译成类似如下代码:
然后执行post-call标记处指令,判断返回地址是否与call的下一条指令相等,若相等则执行next处指令,否则dispatch到翻译器翻译返回地址对应的基本块。