我想使用模拟器对已经存在的架构(X86)测试一些架构更改。但是,要正确测试它们并运行基准测试,我可能必须对指令集进行一些更改,是否有办法将这些更改添加到GCC或任何其他编译器中?

有帮助吗?

解决方案

简单解决方案:

一种常见的方法是添加内联装配,并直接编码指令字节。

例如:

int main()
{
    asm __volatile__ (".byte 0x90\n");
    return 0;
}

编译(GCC -O3)成:

00000000004005a0 <main>:
  4005a0:       90                      nop
  4005a1:       31 c0                   xor    %eax,%eax
  4005a3:       c3                      retq

因此,只需将0x90替换为您的Inst字节即可。当然,您不会在常规的objdump上看到实际说明,并且该程序可能不会在系统上运行(除非您使用其中一种NOP组合),但是如果模拟器在那里正确实现,则该程序应识别它。

请注意,当编译器不知道此说明时,您不能期望编译器对您进行优化,并且如果更改状态(寄存器,内存),请注意并使用Inline Assembly clobber/Intup/Outption选项确保正确性。仅在需要时才使用优化。


复杂的解决方案

另一种方法是在您的编译器中实施此功能 - 可以在GCC中完成,但是如评论中所述,LLVM可能是最好的游戏之一,因为它设计为编译器开发平台,但仍然非常复杂由于LLVM最适合IR优化阶段,并且在尝试修改特定于目标的后端时的友好程度较小。
不过,这是可行的,如果您还计划让编译器决定何时发布此说明,则必须这样做。但是,我建议从第一个选项开始,看看您的模拟器是否甚至可以与此添加一起使用,然后才花时间在编译器端。

如果并且当您决定在LLVM中实施此功能时,最好的选择是将其定义为固有功能,则在此处存在相对更多的文档 - http://llvm.org/docs/extdendingllvm.html

其他提示

您可以添加新说明,或通过修改GCC中的文件组来更改称为“机器描述”的文件。指令模式 <target>.md 文件,一些代码 <target>.c 文件,谓词,约束等。所有这些躺在 $GCCHOME/gcc/config/<target>/ 文件夹。所有这些内容都使用RTL的生成ASM代码的步骤。您还可以通过更改其他一些通用GCC源文件,更改SSA树生成,RTL生成来更改发出指令的情况,但是所有这些都有些复杂。一个简单的解释发生了什么:

https://www.cse.iitb.ac.in/grc/slides/cgotut-gcc/topic5-md-intro.pdf

这是可行的,我已经做到了,但是很乏味。基本上,它是将编译器移植到新平台的过程,将现有平台作为模型。在GCC中的某个地方,有一个文件来定义指令集,并且在编译过程中会经过各种过程,从而生成进一步的代码和数据。自从我这样做已经有20多年了,所以我忘记了所有细节,对不起。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top